From 2659bd3342a24faefb4112793cb9b53b1f3eabe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 17 Jul 2016 12:02:46 +0200 Subject: [PATCH 001/366] dual miner bugfix, multi currency feature, version update --- NiceHashMiner/Forms/Form_Main.cs | 3 ++- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 3d6901a..120c924 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -120,7 +120,8 @@ public Form_Main(bool showConfigSettingsDialog) public void AfterLoadComplete() { - // TODO dispose object, check LoadingScreen + // TODO dispose object, check LoadingScreen => this is tightly coupled with the + // check box functionality for rebuilding Groups. Find a way around and fix. LoadingScreen = null; this.Enabled = true; diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index fec6eb8..28be1c2 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.6.1.1")] -[assembly: AssemblyFileVersion("1.6.1.1")] +[assembly: AssemblyVersion("1.6.1.2")] +[assembly: AssemblyFileVersion("1.6.1.2")] From 3466d6281168defa2d7ffa3606eb2d0f0a0dba64 Mon Sep 17 00:00:00 2001 From: CharlesDeep Date: Sun, 24 Jul 2016 20:19:57 +0200 Subject: [PATCH 002/366] Made a better and a shorter translation. --- NiceHashMiner/langs/es.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/langs/es.lang b/NiceHashMiner/langs/es.lang index 4042d9f..6c263ba 100644 --- a/NiceHashMiner/langs/es.lang +++ b/NiceHashMiner/langs/es.lang @@ -31,7 +31,7 @@ "form1_settings": "&Configuración", "form1_start": "&Empezar", "form1_stop": "&Parar", - "form1_new_version_released": "¡Importante! La nueva versión v{0} ha\r\nsido liberada. Pincha aquí para descargarla.", + "form1_new_version_released": "¡Importante! La nueva versión v{0} ha\r\nsido lanzada. Pincha aquí para descargarla.", "form1_DemoModeLabel": "NiceHash Miner está en modo DEMO", "form1_DemoModeTitle": "¿Abrir NiceHash Miner en modo DEMO?", "form1_DemoModeMsg": "No has introducido una dirección Bitcoin. NiceHash Miner empezará a minar en modo DEMO. En el modo DEMO, puedes probar tu ordenador para ver cuántos Bitcoin podrías ganar. ¿Quieres continuar en modo DEMO? \n\n AVISO: ¡NO GANARÁS NADA EN MODO DEMO!", @@ -110,7 +110,7 @@ "Form_Settings_General_DebugConsole": "Consola de depuración", - "Form_Settings_General_AutoStartMining": "Autoempezar a minar", + "Form_Settings_General_AutoStartMining": "Empezar a minar automáticamente", "Form_Settings_General_HideMiningWindows": "Ocultar ventanas de minado", "Form_Settings_General_MinimizeToTray": "Minimizar a la bandeja", "Form_Settings_General_DisableDetection": "Desactivar detección de {0}", From 7043d296efaf1c12e26420f7f8c48af58c09bff0 Mon Sep 17 00:00:00 2001 From: nicehashdev Date: Sun, 24 Jul 2016 23:05:06 +0200 Subject: [PATCH 003/366] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5797556..0d1b786 100644 --- a/README.md +++ b/README.md @@ -196,3 +196,4 @@ To report bugs and issues please use the GitHub issue reporting tool: https://gi - Optimized Lyra2REv2 ccminer developed by Nanashi Meiyo-Meijin: https://github.com/nicehash/ccminer-nanashi. - For AMD cards, sgminer has been used from here: https://github.com/nicehash/sgminer. - For Ethereum miner, Genoil's fork of ethminer has been used from here: https://github.com/nicehash/cpp-ethereum. +- For HODL mining, used CPU miner: https://github.com/nicehash/hodlminer-wolf From 6329cea74ca7a8efc6633fd84ebf69643151e4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 31 Jul 2016 13:52:33 +0200 Subject: [PATCH 004/366] removed cunrency converter logs --- NiceHashMiner/CurrencyConverter.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/CurrencyConverter.cs b/NiceHashMiner/CurrencyConverter.cs index 8d6fa32..3c727c9 100644 --- a/NiceHashMiner/CurrencyConverter.cs +++ b/NiceHashMiner/CurrencyConverter.cs @@ -28,17 +28,17 @@ public static double ConvertToActiveCurrency(double amount) // if we are still null after an update something went wrong. just use USD hopefully itll update next tick if (LastResponse == null) { - Helpers.ConsolePrint("CurrencyConverter", "Unable to retrieve update, Falling back to USD"); + //Helpers.ConsolePrint("CurrencyConverter", "Unable to retrieve update, Falling back to USD"); return amount; } - Helpers.ConsolePrint("CurrencyConverter", "Current Currency: " + Config.ConfigData.DisplayCurrency); + //Helpers.ConsolePrint("CurrencyConverter", "Current Currency: " + Config.ConfigData.DisplayCurrency); double usdExchangeRate = 1.0; if (LastResponse.rates.TryGetValue(Config.ConfigData.DisplayCurrency, out usdExchangeRate)) return amount * usdExchangeRate; else { - Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + Config.ConfigData.DisplayCurrency + " falling back to USD rates"); + //Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + Config.ConfigData.DisplayCurrency + " falling back to USD rates"); Config.ConfigData.DisplayCurrency = "USD"; return amount; } @@ -54,7 +54,7 @@ private static void UpdateAPI() } catch (Exception E) { - Helpers.ConsolePrint("CurrencyConverter", "Unable to update API: reverting to usd"); + //Helpers.ConsolePrint("CurrencyConverter", "Unable to update API: reverting to usd"); Config.ConfigData.DisplayCurrency = "USD"; } } From 52d691a0058b2bfdedb8b923304d8db266212408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 31 Jul 2016 14:00:51 +0200 Subject: [PATCH 005/366] change $ to USD --- NiceHashMiner/CurrencyConverter.cs | 2 +- NiceHashMiner/Forms/Form_Main.cs | 48 ++++++++++------------------ NiceHashMiner/Forms/Form_Settings.cs | 9 +++--- 3 files changed, 23 insertions(+), 36 deletions(-) diff --git a/NiceHashMiner/CurrencyConverter.cs b/NiceHashMiner/CurrencyConverter.cs index 3c727c9..3843d76 100644 --- a/NiceHashMiner/CurrencyConverter.cs +++ b/NiceHashMiner/CurrencyConverter.cs @@ -10,7 +10,7 @@ public static class CurrencyConverter private static DateTime LastUpdate = DateTime.Now; private static CurrencyAPIResponse LastResponse; - public static bool ConverterActive { + private static bool ConverterActive { get { return Config.ConfigData.DisplayCurrency != "USD"; } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 120c924..30fc961 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -64,15 +64,15 @@ public Form_Main(bool showConfigSettingsDialog) - label_RateCPUDollar.Text = String.Format("0.00 {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); - label_RateNVIDIA5XDollar.Text = String.Format("0.00 {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); - label_RateNVIDIA3XDollar.Text = String.Format("0.00 {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); - label_RateNVIDIA2XDollar.Text = String.Format("0.00 {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); - label_RateAMDDollar.Text = String.Format("0.00 {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + label_RateCPUDollar.Text = String.Format("0.00 {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + label_RateNVIDIA5XDollar.Text = String.Format("0.00 {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + label_RateNVIDIA3XDollar.Text = String.Format("0.00 {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + label_RateNVIDIA2XDollar.Text = String.Format("0.00 {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + label_RateAMDDollar.Text = String.Format("0.00 {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); toolStripStatusLabelGlobalRateText.Text = International.GetText("form1_global_rate") + ":"; toolStripStatusLabelBTCDayText.Text = "BTC/" + International.GetText("Day"); - toolStripStatusLabelBalanceText.Text = (CurrencyConverter.CurrencyConverter.ConverterActive == false ? "$/" : Config.ConfigData.DisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("form1_balance") + ":"; + toolStripStatusLabelBalanceText.Text = (Config.ConfigData.DisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("form1_balance") + ":"; listViewDevices.Columns[0].Text = International.GetText("ListView_Enabled"); listViewDevices.Columns[1].Text = International.GetText("ListView_Group"); @@ -113,8 +113,7 @@ public Form_Main(bool showConfigSettingsDialog) ShowWarningNiceHashData = true; DemoMode = false; - if (CurrencyConverter.CurrencyConverter.ConverterActive) - toolStripStatusLabelBalanceDollarValue.Text = "(" + Config.ConfigData.DisplayCurrency + ")"; + toolStripStatusLabelBalanceDollarValue.Text = "(" + Config.ConfigData.DisplayCurrency + ")"; } @@ -549,7 +548,7 @@ private void SetCPUStats(string aname, double speed, double paying) if (aname.Equals("hodl")) labelCPU_Mining_Speed.Text += "**"; label_RateCPUBTC.Text = FormatPayingOutput(paying); label_RateCPUDollar.Text = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying *Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + + String.Format(" {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); UpdateGlobalRate(); } @@ -559,7 +558,7 @@ private void SetNVIDIAtp21Stats(string aname, double speed, double paying) labelNVIDIA2X_Mining_Speed.Text = FormatSpeedOutput(speed) + aname; label_RateNVIDIA2XBTC.Text = FormatPayingOutput(paying); label_RateNVIDIA2XDollar.Text = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying *Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + + String.Format(" {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); UpdateGlobalRate(); } @@ -569,7 +568,7 @@ private void SetNVIDIAtpStats(string aname, double speed, double paying) labelNVIDIA3X_Mining_Speed.Text = FormatSpeedOutput(speed) + aname; label_RateNVIDIA3XBTC.Text = FormatPayingOutput(paying); label_RateNVIDIA3XDollar.Text = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying *Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + + String.Format(" {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); UpdateGlobalRate(); } @@ -579,7 +578,7 @@ private void SetNVIDIAspStats(string aname, double speed, double paying) labelNVIDIA5X_Mining_Speed.Text = FormatSpeedOutput(speed) + aname; label_RateNVIDIA5XBTC.Text = FormatPayingOutput(paying); label_RateNVIDIA5XDollar.Text = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying *Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + + String.Format(" {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); UpdateGlobalRate(); } @@ -589,7 +588,7 @@ private void SetAMDOpenCLStats(string aname, double speed, double paying) labelAMDOpenCL_Mining_Speed.Text = FormatSpeedOutput(speed) + aname; label_RateAMDBTC.Text = FormatPayingOutput(paying); label_RateAMDDollar.Text = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying *Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", !CurrencyConverter.CurrencyConverter.ConverterActive ? "$" : Config.ConfigData.DisplayCurrency) + International.GetText("Day"); + + String.Format(" {0}/", Config.ConfigData.DisplayCurrency) + International.GetText("Day"); UpdateGlobalRate(); } @@ -612,13 +611,7 @@ private void UpdateGlobalRate() } - - - if(CurrencyConverter.CurrencyConverter.ConverterActive == false) - toolStripStatusLabelBTCDayValue.Text = (TotalRate *Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture); - else - - toolStripStatusLabelBTCDayValue.Text = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency((TotalRate *Globals.BitcoinRate)).ToString("F2", CultureInfo.InvariantCulture); + toolStripStatusLabelBTCDayValue.Text = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency((TotalRate * Globals.BitcoinRate)).ToString("F2", CultureInfo.InvariantCulture); } @@ -640,17 +633,10 @@ void BalanceCheck_Tick(object sender, EventArgs e) toolStripStatusLabelBalanceBTCCode.Text = "BTC"; toolStripStatusLabelBalanceBTCValue.Text = Balance.ToString("F8", CultureInfo.InvariantCulture); } - - Helpers.ConsolePrint("CurrencyConverter", "IsActive: " + CurrencyConverter.CurrencyConverter.ConverterActive); - if(CurrencyConverter.CurrencyConverter.ConverterActive == false) - toolStripStatusLabelBalanceDollarText.Text = (Balance *Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture); - else - { - Helpers.ConsolePrint("CurrencyConverter", "Using CurrencyConverter" + Config.ConfigData.DisplayCurrency); - double Amount = (Balance *Globals.BitcoinRate); - Amount = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(Amount); - toolStripStatusLabelBalanceDollarText.Text = Amount.ToString("F2", CultureInfo.InvariantCulture); - } + + double Amount = (Balance * Globals.BitcoinRate); + Amount = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(Amount); + toolStripStatusLabelBalanceDollarText.Text = Amount.ToString("F2", CultureInfo.InvariantCulture); } } } diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index bce6ecc..6fcbfda 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -105,10 +105,11 @@ public Form_Settings() toolTip1.SetToolTip(this.textBox_ethminerDefaultBlockHeight, International.GetText("Form_Settings_ToolTip_ethminerDefaultBlockHeight")); toolTip1.SetToolTip(this.label_ethminerDefaultBlockHeight, International.GetText("Form_Settings_ToolTip_ethminerDefaultBlockHeight")); - if (CurrencyConverter.CurrencyConverter.ConverterActive) - currencyConverterCombobox.SelectedItem = Config.ConfigData.DisplayCurrency; - else - currencyConverterCombobox.SelectedItem = "USD"; + //if (CurrencyConverter.CurrencyConverter.ConverterActive) + // currencyConverterCombobox.SelectedItem = Config.ConfigData.DisplayCurrency; + //else + // currencyConverterCombobox.SelectedItem = "USD"; + currencyConverterCombobox.SelectedItem = Config.ConfigData.DisplayCurrency; displayCurrencyLabel.Text = International.GetText("Form_Settings_DisplayCurrency"); From c9ff4437a519d55a97de7f9e3bea30279a440e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 31 Jul 2016 17:51:16 +0200 Subject: [PATCH 006/366] Added support for lyra2re on NVIDIA 5.x/6.x --- NiceHashMiner/Config.cs | 9 +++++++++ NiceHashMiner/Miners/ccminer.cs | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Config.cs b/NiceHashMiner/Config.cs index 7d166d8..fa6e420 100644 --- a/NiceHashMiner/Config.cs +++ b/NiceHashMiner/Config.cs @@ -220,6 +220,15 @@ public static void RebuildGroups() CG[i].Algorithms[k].DisabledDevices = new bool[Globals.Miners[i].CDevs.Count]; for (int j = 0; j < Globals.Miners[i].CDevs.Count; j++) { + // quickfix new algo add + if (Globals.Miners[i].SupportedAlgorithms[k].DisabledDevice == null) { + bool[] newArray = new bool[Globals.Miners[i].CDevs.Count]; + // init to false + for (int devIndex = 0; devIndex < newArray.Length; ++devIndex) { + newArray[devIndex] = false; + } + Globals.Miners[i].SupportedAlgorithms[k].DisabledDevice = newArray; + } CG[i].Algorithms[k].DisabledDevices[j] = Globals.Miners[i].SupportedAlgorithms[k].DisabledDevice[j]; } } diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index 537a2eb..e0dd84f 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -29,7 +29,9 @@ public ccminer() new Algorithm(17, "blake256r14", "blake"), new Algorithm(18, "blake256r8vnl", "vanilla"), new Algorithm(20, "daggerhashimoto", "daggerhashimoto"), - new Algorithm(21, "decred", "decred") + new Algorithm(21, "decred", "decred"), + // new added + new Algorithm(9, "lyra2re", "lyra2"), }; } @@ -81,7 +83,7 @@ protected override string BenchmarkCreateCommandLine(int index, int time) Path = "bin\\ccminer_decred.exe"; else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("neoscrypt")) Path = "bin\\ccminer_neoscrypt.exe"; - else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("lyra2rev2")) + else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("lyra2rev2") && SupportedAlgorithms[index].NiceHashName.Equals("lyra2re") ) Path = "bin\\ccminer_nanashi_lyra2rev2.exe"; else if (this is ccminer_sp) Path = "bin\\ccminer_sp.exe"; From bb27bb8d7b9cf9ec6d3f58600029c76d89901843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 31 Jul 2016 19:40:06 +0200 Subject: [PATCH 007/366] Nvidia SM 5.x/6.x lyra2re paths and benchmark fix --- NiceHashMiner/Miners/Miner.cs | 8 ++++++++ NiceHashMiner/Miners/ccminer.cs | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 148591c..5249c76 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -204,6 +204,9 @@ virtual public void BenchmarkStart(int index, int time, BenchmarkComplete oncomp virtual protected bool BenchmarkParseLine(string outdata) { + // lyra2re nvidia fix + double lastSpeed = 0; + // parse line if (outdata.Contains("Benchmark: ") && outdata.Contains("/s")) { @@ -260,6 +263,11 @@ virtual protected bool BenchmarkParseLine(string outdata) OnBenchmarkComplete(true, PrintSpeed(avg_spd), BenchmarkTag); return true; } + else if (double.TryParse(outdata, out lastSpeed)) { + SupportedAlgorithms[BenchmarkIndex].BenchmarkSpeed = lastSpeed; + OnBenchmarkComplete(true, PrintSpeed(lastSpeed), BenchmarkTag); + return true; + } return false; } diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index e0dd84f..89f76c5 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -83,7 +83,9 @@ protected override string BenchmarkCreateCommandLine(int index, int time) Path = "bin\\ccminer_decred.exe"; else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("neoscrypt")) Path = "bin\\ccminer_neoscrypt.exe"; - else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("lyra2rev2") && SupportedAlgorithms[index].NiceHashName.Equals("lyra2re") ) + else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("lyra2re") ) + Path = "bin\\ccminer_lyra2re.exe"; + else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("lyra2rev2") ) Path = "bin\\ccminer_nanashi_lyra2rev2.exe"; else if (this is ccminer_sp) Path = "bin\\ccminer_sp.exe"; @@ -154,6 +156,8 @@ public override void Start(int nhalgo, string url, string username) Path = "bin\\ccminer_decred.exe"; else if (this is ccminer_sp && Algo.NiceHashName.Equals("neoscrypt")) Path = "bin\\ccminer_neoscrypt.exe"; + else if (this is ccminer_sp && Algo.NiceHashName.Equals("lyra2re")) + Path = "bin\\ccminer_lyra2re.exe"; else if (this is ccminer_sp && Algo.NiceHashName.Equals("lyra2rev2")) Path = "bin\\ccminer_nanashi_lyra2rev2.exe"; else if (this is ccminer_sp) From e92f164db6db1b8023ac80a54df7e5947970d416 Mon Sep 17 00:00:00 2001 From: nicehashdev Date: Mon, 1 Aug 2016 10:29:22 +0200 Subject: [PATCH 008/366] Version 1.6.1.3 Small fixes and adjustments --- NiceHashMiner/CurrencyConverter.cs | 2 +- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 1 + NiceHashMiner/Miners/ccminer.cs | 15 +++++---------- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/NiceHashMiner/CurrencyConverter.cs b/NiceHashMiner/CurrencyConverter.cs index 3843d76..e54d82d 100644 --- a/NiceHashMiner/CurrencyConverter.cs +++ b/NiceHashMiner/CurrencyConverter.cs @@ -52,7 +52,7 @@ private static void UpdateAPI() LastResponse = JsonConvert.DeserializeObject(Response); LastUpdate = DateTime.Now; } - catch (Exception E) + catch { //Helpers.ConsolePrint("CurrencyConverter", "Unable to update API: reverting to usd"); Config.ConfigData.DisplayCurrency = "USD"; diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 30fc961..f28dcff 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -897,7 +897,7 @@ private void buttonStartMining_Click(object sender, EventArgs e) if (!(m is cpuminer)) { // quick and ugly way to prevent GPUs from starting on extremely unprofitable x11 - m.SupportedAlgorithms[13].BenchmarkSpeed = 1; + m.SupportedAlgorithms[14].BenchmarkSpeed = 1; } break; } diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 426a02f..20dd83c 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -483,6 +483,7 @@ private void InitializeComponent() // // currencyConverterCombobox // + this.currencyConverterCombobox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.currencyConverterCombobox.FormattingEnabled = true; this.currencyConverterCombobox.Items.AddRange(new object[] { "AUD", diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index 89f76c5..85ba448 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -21,6 +21,7 @@ public ccminer() new Algorithm(6, "x15", "x15"), new Algorithm(7, "nist5", "nist5"), new Algorithm(8, "neoscrypt", "neoscrypt"), + new Algorithm(9, "lyra2re", "lyra2"), new Algorithm(10, "whirlpoolx", "whirlpoolx"), new Algorithm(11, "qubit", "qubit"), new Algorithm(12, "quark", "quark"), @@ -30,8 +31,6 @@ public ccminer() new Algorithm(18, "blake256r8vnl", "vanilla"), new Algorithm(20, "daggerhashimoto", "daggerhashimoto"), new Algorithm(21, "decred", "decred"), - // new added - new Algorithm(9, "lyra2re", "lyra2"), }; } @@ -81,12 +80,10 @@ protected override string BenchmarkCreateCommandLine(int index, int time) if (SupportedAlgorithms[index].NiceHashName.Equals("decred")) Path = "bin\\ccminer_decred.exe"; + else if (SupportedAlgorithms[index].NiceHashName.Equals("lyra2re") || SupportedAlgorithms[index].NiceHashName.Equals("lyra2rev2")) + Path = "bin\\ccminer_nanashi.exe"; else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("neoscrypt")) Path = "bin\\ccminer_neoscrypt.exe"; - else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("lyra2re") ) - Path = "bin\\ccminer_lyra2re.exe"; - else if (this is ccminer_sp && SupportedAlgorithms[index].NiceHashName.Equals("lyra2rev2") ) - Path = "bin\\ccminer_nanashi_lyra2rev2.exe"; else if (this is ccminer_sp) Path = "bin\\ccminer_sp.exe"; else @@ -154,12 +151,10 @@ public override void Start(int nhalgo, string url, string username) if (Algo.NiceHashName.Equals("decred")) Path = "bin\\ccminer_decred.exe"; + else if (Algo.NiceHashName.Equals("lyra2re") || Algo.NiceHashName.Equals("lyra2rev2")) + Path = "bin\\ccminer_nanashi.exe"; else if (this is ccminer_sp && Algo.NiceHashName.Equals("neoscrypt")) Path = "bin\\ccminer_neoscrypt.exe"; - else if (this is ccminer_sp && Algo.NiceHashName.Equals("lyra2re")) - Path = "bin\\ccminer_lyra2re.exe"; - else if (this is ccminer_sp && Algo.NiceHashName.Equals("lyra2rev2")) - Path = "bin\\ccminer_nanashi_lyra2rev2.exe"; else if (this is ccminer_sp) Path = "bin\\ccminer_sp.exe"; else diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 28be1c2..c4950ad 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.6.1.2")] -[assembly: AssemblyFileVersion("1.6.1.2")] +[assembly: AssemblyVersion("1.6.1.3")] +[assembly: AssemblyFileVersion("1.6.1.3")] From f4cbc07d85d593b556a57d9f1b587eb7155bb2b5 Mon Sep 17 00:00:00 2001 From: nicehashdev Date: Mon, 1 Aug 2016 11:39:17 +0200 Subject: [PATCH 009/366] Lyra2RE benchmark fix --- NiceHashMiner/Miners/ccminer_sp.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/ccminer_sp.cs b/NiceHashMiner/Miners/ccminer_sp.cs index e0049e4..43d3455 100644 --- a/NiceHashMiner/Miners/ccminer_sp.cs +++ b/NiceHashMiner/Miners/ccminer_sp.cs @@ -42,7 +42,7 @@ protected override void AddPotentialCDev(string text) protected override string BenchmarkGetConsoleOutputLine(Process BenchmarkHandle) { - if (AlgoNameIs("lyra2rev2") || AlgoNameIs("decred")) + if (AlgoNameIs("lyra2re") || AlgoNameIs("lyra2rev2") || AlgoNameIs("decred")) return BenchmarkHandle.StandardOutput.ReadLine(); return BenchmarkHandle.StandardError.ReadLine(); From 0039651cf6a3cd930c11c91789d7d99cd46c0e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 15 Sep 2016 21:48:27 +0200 Subject: [PATCH 010/366] AMD correct parameter settings fix --- NiceHashMiner/Devices/GroupAlgorithms.cs | 28 ++++++++++++------------ NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index df4a886..3faf336 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -22,35 +22,35 @@ public static Dictionary CreateDefaultsForGroup(Device } if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { // DisableAMDTempControl = false; so temperature params are enabled by default, not sure if TemperatureParam should be lastly appended - string DefaultParam = AmdGpuDevice.DefaultParam + AmdGpuDevice.TemperatureParam; + string DefaultParam = AmdGpuDevice.DefaultParam; return new Dictionary() { { AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Keccak , new Algorithm(AlgorithmType.Keccak, "keccak") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 300 --thread-concurrency 0 --worksize 64 --gpu-threads 1" } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 300 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.X15 , new Algorithm(AlgorithmType.X15, "x15") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam} }, { AlgorithmType.Nist5 , new Algorithm(AlgorithmType.Nist5, "nist5") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 16 --thread-concurrency 0 --worksize 64 --gpu-threads 2" } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 16 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.NeoScrypt , new Algorithm(AlgorithmType.NeoScrypt, "neoscrypt") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.WhirlpoolX , new Algorithm(AlgorithmType.WhirlpoolX, "whirlpoolx") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 2" } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Qubit , new Algorithm(AlgorithmType.Qubit, "qubitcoin") - { ExtraLaunchParameters = DefaultParam + "--intensity 18 --worksize 64 --gpu-threads 2" } }, + { ExtraLaunchParameters = DefaultParam + "--intensity 18 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Quark , new Algorithm(AlgorithmType.Quark, "quarkcoin") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "Lyra2REv2") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") - { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" } }, + { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Blake256r14 , new Algorithm(AlgorithmType.Blake256r14, "blake") - { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" } }, + { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") - { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" } }, + { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") - { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" } } + { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } } }; } // NVIDIA diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index e9a2f45..d090d60 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.1.1")] -[assembly: AssemblyFileVersion("1.7.1.1")] +[assembly: AssemblyVersion("1.7.1.2")] +[assembly: AssemblyFileVersion("1.7.1.2")] From a1fc4062c107b1a4fe98ba5979d5fc7bb5851444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 15 Sep 2016 22:35:47 +0200 Subject: [PATCH 011/366] make sure ethminer settings are same for CUDA and AMD group --- NiceHashMiner/Devices/GroupAlgorithms.cs | 1 + .../Forms/Components/AlgorithmSettingsControl.cs | 10 ++++++++++ NiceHashMiner/Miners/MinersManager.cs | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 3faf336..0a15f99 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -12,6 +12,7 @@ public static class GroupAlgorithms { private static Dictionary> _keys = new Dictionary>(); + public static Dictionary CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { if (DeviceGroupType.CPU == deviceGroupType) { return new Dictionary() { diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index 487f106..783bdfe 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -187,6 +187,16 @@ private void textChangedExtraLaunchParameters(object sender, EventArgs e) { var ExtraLaunchParams = richTextBoxExtraLaunchParameters.Text.Replace("\r\n", " "); ExtraLaunchParams = ExtraLaunchParams.Replace("\n", " "); _currentlySelectedAlgorithm.ExtraLaunchParameters = ExtraLaunchParams; + // if dagger copy for all devices group CUDA or AMD + if (_currentlySelectedAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto) { + foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + if (_computeDevice.DeviceType == cDev.DeviceType) { + if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(AlgorithmType.DaggerHashimoto)) { + cDev.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.DaggerHashimoto].ExtraLaunchParameters = ExtraLaunchParams; + } + } + } + } } #endregion diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index e2839b3..10120c6 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -422,7 +422,7 @@ private bool IsNvidiaDevice(ComputeDevice a) { // checks if dagger algo, same settings and if compute platform is same private bool IsDaggerAndSameComputePlatform(ComputeDevice a, ComputeDevice b) { return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto - && IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) + && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID //IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) // check if both etherum capable && a.IsEtherumCapale && b.IsEtherumCapale // compute platforms must be same From 8331de180f6d98dfce41192032102e0746605b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 15 Sep 2016 23:22:13 +0200 Subject: [PATCH 012/366] download wait before unzip --- NiceHashMiner/Configs/ConfigManager.cs | 2 ++ NiceHashMiner/Utils/MinersDownloadManager.cs | 27 +++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index fa97685..6b84c20 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -91,6 +91,8 @@ public void AfterDeviceQueryInitialization() { SetDeviceBenchmarkReferences(); + + // check ethminers and remove from settings if no device supports it in config foreach (var config in BenchmarkConfigs) { bool removeDagger = true; diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index c12a394..37c7296 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -152,6 +152,12 @@ private void DownloadCompleted(object sender, AsyncCompletedEventArgs e) { } else { // TODO handle Success Helpers.ConsolePrint(TAG, "DownloadCompleted Success"); + // wait one second for binary to exist + System.Threading.Thread.Sleep(1000); + // extra check dirty + int try_count = 50; + while (!File.Exists(BinsZipLocation) && try_count > 0) { --try_count; } + UnzipStart(); } } @@ -192,16 +198,19 @@ private void UnzipThreadRoutine() { } } } + // after unzip stuff + ConfigManager.Instance.GeneralConfig.DownloadInit = true; + ConfigManager.Instance.GeneralConfig.Commit(); + _minerUpdateIndicator.FinishMsg(IsMinersBinsInit()); + // remove bins zip + try { + if (File.Exists(BinsZipLocation)) { + File.Delete(BinsZipLocation); + } + } catch { } + } else { + Helpers.ConsolePrint(TAG, "UnzipThreadRoutine bin.zip file not found"); } - ConfigManager.Instance.GeneralConfig.DownloadInit = true; - ConfigManager.Instance.GeneralConfig.Commit(); - _minerUpdateIndicator.FinishMsg(IsMinersBinsInit()); - // remove bins zip - try { - if (File.Exists(BinsZipLocation)) { - File.Delete(BinsZipLocation); - } - } catch { } } From b2f3000fbce3e246c2c0897ce3f7b13b68c2f416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 16 Sep 2016 10:20:11 +0200 Subject: [PATCH 013/366] ListViews safer update and repaint, benchmark calculation --- NiceHashMiner/Algorithm.cs | 3 ++ .../Forms/Components/AlgorithmsListView.cs | 16 ++++++++ .../DevicesListViewEnableControl.Designer.cs | 1 - .../DevicesListViewEnableControl.cs | 38 +++++++++++-------- .../Forms/Form_Benchmark.Designer.cs | 2 + NiceHashMiner/Forms/Form_Benchmark.cs | 21 +++++++++- .../Interfaces/IBenchmarkCalculation.cs | 11 ++++++ NiceHashMiner/NiceHashMiner.csproj | 1 + 8 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 NiceHashMiner/Interfaces/IBenchmarkCalculation.cs diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index 66de48e..46b131c 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -71,6 +71,9 @@ public void SetBenchmarkPending() { IsBenchmarkPending = true; BenchmarkStatus = International.GetText("Algorithm_Waiting_Benchmark"); } + public void SetBenchmarkPendingNoMsg() { + IsBenchmarkPending = true; + } public void ClearBenchmarkPending() { IsBenchmarkPending = false; BenchmarkStatus = ""; diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 8781eab..5ef6e34 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -28,6 +28,8 @@ public interface IAlgorithmsListView { public IAlgorithmsListView ComunicationInterface { get; set; } + public IBenchmarkCalculation BenchmarkCalculation { get; set; } + ComputeDevice _computeDevice; private class DefaultAlgorithmColorSeter : IListItemCheckColorSetter { @@ -90,6 +92,7 @@ public void InitLocale() { public void SetAlgorithms(ComputeDevice computeDevice, bool isEnabled) { _computeDevice = computeDevice; var config = computeDevice.DeviceBenchmarkConfig; + listViewAlgorithms.BeginUpdate(); listViewAlgorithms.Items.Clear(); foreach (var alg in config.AlgorithmSettings) { ListViewItem lvi = new ListViewItem(); @@ -105,6 +108,9 @@ public void SetAlgorithms(ComputeDevice computeDevice, bool isEnabled) { _listItemCheckColorSetter.LviSetColor(lvi); listViewAlgorithms.Items.Add(lvi); } + listViewAlgorithms.EndUpdate(); + ResetListItemColors(); + listViewAlgorithms.Invalidate(true); this.Enabled = isEnabled; } @@ -140,9 +146,19 @@ private void listViewAlgorithms_ItemChecked(object sender, ItemCheckedEventArgs } var lvi = e.Item as ListViewItem; _listItemCheckColorSetter.LviSetColor(lvi); + // update benchmark status data + if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); } #endregion //Callbacks Events + public void ResetListItemColors() { + foreach (ListViewItem lvi in listViewAlgorithms.Items) { + if (_listItemCheckColorSetter != null) { + _listItemCheckColorSetter.LviSetColor(lvi); + } + } + } + // benchmark settings public void SetSpeedStatus(ComputeDevice computeDevice, AlgorithmType algorithmType, string status) { var algorithm = computeDevice.DeviceBenchmarkConfig.AlgorithmSettings[algorithmType]; diff --git a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.Designer.cs b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.Designer.cs index 7ab2e0a..4a8fbc8 100644 --- a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.Designer.cs +++ b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.Designer.cs @@ -66,7 +66,6 @@ private void InitializeComponent() { this.toolStripMenuItemEnable.Name = "toolStripMenuItemEnable"; this.toolStripMenuItemEnable.Size = new System.Drawing.Size(196, 22); this.toolStripMenuItemEnable.Text = "Enable Benchmark"; - this.toolStripMenuItemEnable.Click += new System.EventHandler(this.toolStripMenuItemEnable_Click); // // toolStripMenuItem1 // diff --git a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs index a248e3e..2d92d34 100644 --- a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs +++ b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs @@ -32,6 +32,8 @@ public void LviSetColor(ListViewItem lvi) { IListItemCheckColorSetter _listItemCheckColorSetter = new DefaultDevicesColorSeter(); + public IBenchmarkCalculation BenchmarkCalculation { get; set; } + private AlgorithmsListView _algorithmsListView = null; // disable checkboxes when in benchmark mode @@ -98,6 +100,7 @@ public DevicesListViewEnableControl() { listViewDevices.ItemChecked += new ItemCheckedEventHandler(listViewDevicesItemChecked); //listViewDevices.CheckBoxes = false; IsMining = false; + BenchmarkCalculation = null; } public void SetIListItemCheckColorSetter(IListItemCheckColorSetter listItemCheckColorSetter) { @@ -122,6 +125,8 @@ public void SetComputeDevices(List computeDevices) { bool tmp_SaveToGeneralConfig = SaveToGeneralConfig; AutoSaveChange = false; SaveToGeneralConfig = false; + listViewDevices.BeginUpdate(); + listViewDevices.Items.Clear(); // set devices foreach (var computeDevice in computeDevices) { ListViewItem lvi = new ListViewItem(); @@ -138,6 +143,8 @@ public void SetComputeDevices(List computeDevices) { listViewDevices.Items.Add(lvi); _listItemCheckColorSetter.LviSetColor(lvi); } + listViewDevices.EndUpdate(); + listViewDevices.Invalidate(true); // reset properties AutoSaveChange = tmp_AutoSaveChange; SaveToGeneralConfig = tmp_SaveToGeneralConfig; @@ -145,7 +152,6 @@ public void SetComputeDevices(List computeDevices) { public void ResetComputeDevices(List computeDevices) { Options.Clear(); - listViewDevices.Items.Clear(); SetComputeDevices(computeDevices); } @@ -166,6 +172,7 @@ private void listViewDevicesItemChecked(object sender, ItemCheckedEventArgs e) { var lvi = e.Item as ListViewItem; if (lvi != null) _listItemCheckColorSetter.LviSetColor(lvi); if (_algorithmsListView != null) _algorithmsListView.RepaintStatus(G.IsEnabled, G.CDevice.UUID); + if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); } public void SaveOptions() { @@ -222,20 +229,21 @@ private void listViewDevices_MouseClick(object sender, MouseEventArgs e) { } } - private void toolStripMenuItemEnable_Click(object sender, EventArgs e) { - ComputeDeviceEnabledOption G = listViewDevices.FocusedItem.Tag as ComputeDeviceEnabledOption; - var isEnabled = !G.IsEnabled; - G.IsEnabled = isEnabled; - if (AutoSaveChange) { - G.SaveOption(); - } - if (SaveToGeneralConfig) { - ConfigManager.Instance.GeneralConfig.Commit(); - } - var lvi = listViewDevices.FocusedItem as ListViewItem; - if (lvi != null) _listItemCheckColorSetter.LviSetColor(lvi); - if (_algorithmsListView != null) _algorithmsListView.RepaintStatus(G.IsEnabled, G.CDevice.UUID); - } + //private void toolStripMenuItemEnable_Click(object sender, EventArgs e) { + // ComputeDeviceEnabledOption G = listViewDevices.FocusedItem.Tag as ComputeDeviceEnabledOption; + // var isEnabled = !G.IsEnabled; + // G.IsEnabled = isEnabled; + // if (AutoSaveChange) { + // G.SaveOption(); + // } + // if (SaveToGeneralConfig) { + // ConfigManager.Instance.GeneralConfig.Commit(); + // } + // var lvi = listViewDevices.FocusedItem as ListViewItem; + // if (lvi != null) _listItemCheckColorSetter.LviSetColor(lvi); + // if (_algorithmsListView != null) _algorithmsListView.RepaintStatus(G.IsEnabled, G.CDevice.UUID); + // if (BenchmarkCalculation != null) _benchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); + //} private void toolStripMenuItemCopySettings_Click(object sender, EventArgs e) { ComputeDeviceEnabledOption G = listViewDevices.FocusedItem.Tag as ComputeDeviceEnabledOption; diff --git a/NiceHashMiner/Forms/Form_Benchmark.Designer.cs b/NiceHashMiner/Forms/Form_Benchmark.Designer.cs index b070dd5..09e84d3 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.Designer.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.Designer.cs @@ -86,6 +86,7 @@ private void InitializeComponent() { // // algorithmsListView1 // + this.algorithmsListView1.BenchmarkCalculation = null; this.algorithmsListView1.ComunicationInterface = null; this.algorithmsListView1.IsInBenchmark = false; this.algorithmsListView1.Location = new System.Drawing.Point(12, 133); @@ -103,6 +104,7 @@ private void InitializeComponent() { // devicesListViewEnableControl1 // this.devicesListViewEnableControl1.AutoSaveChange = false; + this.devicesListViewEnableControl1.BenchmarkCalculation = null; this.devicesListViewEnableControl1.FirstColumnText = "Benckmark"; this.devicesListViewEnableControl1.IsInBenchmark = false; this.devicesListViewEnableControl1.IsMining = false; diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index afc4268..172e5db 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -12,7 +12,7 @@ using NiceHashMiner.Interfaces; namespace NiceHashMiner.Forms { - public partial class Form_Benchmark : Form, IListItemCheckColorSetter, IBenchmarkComunicator { + public partial class Form_Benchmark : Form, IListItemCheckColorSetter, IBenchmarkComunicator, IBenchmarkCalculation { private bool _inBenchmark = false; private int _bechmarkCurrentIndex = 0; @@ -132,6 +132,10 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm CalcBenchmarkDevicesAlgorithmQueue(); devicesListViewEnableControl1.ResetListItemColors(); + // to update laclulation status + devicesListViewEnableControl1.BenchmarkCalculation = this; + algorithmsListView1.BenchmarkCalculation = this; + if (autostart) { ExitWhenFinished = true; StartStopBtn_Click(null, null); @@ -288,7 +292,7 @@ private bool StartButonClick() { return true; } - private void CalcBenchmarkDevicesAlgorithmQueue() { + public void CalcBenchmarkDevicesAlgorithmQueue() { _benchmarkAlgorithmsCount = 0; _benchmarkDevicesAlgorithmStatus = new Dictionary(); @@ -299,6 +303,9 @@ private void CalcBenchmarkDevicesAlgorithmQueue() { foreach (var kvpAlgorithm in option.CDevice.DeviceBenchmarkConfig.AlgorithmSettings) { if (ShoulBenchmark(kvpAlgorithm.Value)) { algorithmQueue.Enqueue(kvpAlgorithm.Value); + kvpAlgorithm.Value.SetBenchmarkPendingNoMsg(); + } else { + kvpAlgorithm.Value.ClearBenchmarkPending(); } } } else { // single bench @@ -524,6 +531,14 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e e.Cancel = true; return; } + + // disable all pending benchmark + foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + algorithm.ClearBenchmarkPending(); + } + } + // save already benchmarked algorithms ConfigManager.Instance.CommitBenchmarks(); // check devices without benchmarks @@ -553,12 +568,14 @@ private void radioButton_SelectedUnbenchmarked_CheckedChanged_1(object sender, E _algorithmOption = AlgorithmBenchmarkSettingsType.SelectedUnbenchmarkedAlgorithms; CalcBenchmarkDevicesAlgorithmQueue(); devicesListViewEnableControl1.ResetListItemColors(); + algorithmsListView1.ResetListItemColors(); } private void radioButton_RE_SelectedUnbenchmarked_CheckedChanged(object sender, EventArgs e) { _algorithmOption = AlgorithmBenchmarkSettingsType.ReBecnhSelectedAlgorithms; CalcBenchmarkDevicesAlgorithmQueue(); devicesListViewEnableControl1.ResetListItemColors(); + algorithmsListView1.ResetListItemColors(); } } diff --git a/NiceHashMiner/Interfaces/IBenchmarkCalculation.cs b/NiceHashMiner/Interfaces/IBenchmarkCalculation.cs new file mode 100644 index 0000000..c713941 --- /dev/null +++ b/NiceHashMiner/Interfaces/IBenchmarkCalculation.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Interfaces { + public interface IBenchmarkCalculation { + void CalcBenchmarkDevicesAlgorithmQueue(); + } +} diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 100456a..356b9c6 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -166,6 +166,7 @@ Form_ChooseLanguage.cs + From a67a2a6a7ae55d8635d1bd812a2bb8ceff510935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 16 Sep 2016 12:12:23 +0200 Subject: [PATCH 014/366] reintroduced autostart mining feature --- NiceHashMiner/Configs/GeneralConfig.cs | 4 +- NiceHashMiner/Forms/Form_Main.cs | 7 + NiceHashMiner/Forms/Form_Settings.Designer.cs | 200 ++++++++++-------- NiceHashMiner/Forms/Form_Settings.cs | 9 + 4 files changed, 134 insertions(+), 86 deletions(-) diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index df3c7e0..66ae789 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -24,6 +24,7 @@ public string DisplayCurrency { public string BitcoinAddress { get; set; } public string WorkerName { get; set; } public int ServiceLocation { get; set; } + public bool AutoStartMining { get; set; } public bool HideMiningWindows { get; set; } public bool MinimizeToTray { get; set; } //public int LessThreads { get; set; } @@ -138,6 +139,7 @@ public void SetDefaults() { BitcoinAddress = ""; WorkerName = "worker1"; ServiceLocation = 0; + AutoStartMining = false; //LessThreads = 0; DebugConsole = false; HideMiningWindows = false; @@ -207,7 +209,7 @@ protected override void InitializeObject() { BitcoinAddress = _file.BitcoinAddress; WorkerName = _file.WorkerName; ServiceLocation = _file.ServiceLocation; - //AutoStartMining = _file.AutoStartMining; + AutoStartMining = _file.AutoStartMining; HideMiningWindows = _file.HideMiningWindows; MinimizeToTray = _file.MinimizeToTray; //LessThreads = _file.LessThreads; diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 3836480..7c3125d 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -313,6 +313,13 @@ private void StartupTimer_Tick(object sender, EventArgs e) if (result == System.Windows.Forms.DialogResult.No) { Close(); return; + } else { + // users agrees he installed it so commit changes + ConfigManager.Instance.GeneralConfig.Commit(); + } + } else { + if (ConfigManager.Instance.GeneralConfig.AutoStartMining) { + buttonStartMining_Click(null, null); } } } diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index a86c7a1..9ac504e 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -115,19 +115,21 @@ private void InitializeComponent() { this.textBox_MinerRestartDelayMS = new System.Windows.Forms.TextBox(); this.textBox_MinerAPIQueryInterval = new System.Windows.Forms.TextBox(); this.groupBoxBenchmarkTimeLimits = new System.Windows.Forms.GroupBox(); + this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.tabPageDevicesAlgos = new System.Windows.Forms.TabPage(); + this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); + this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); this.groupBoxAlgorithmSettings = new System.Windows.Forms.GroupBox(); + this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.buttonAllProfit = new System.Windows.Forms.Button(); this.buttonSelectedProfit = new System.Windows.Forms.Button(); this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); - this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); - this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); + this.pictureBox_AutoStartMining = new System.Windows.Forms.PictureBox(); + this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); @@ -171,6 +173,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -205,6 +208,7 @@ private void InitializeComponent() { // // groupBox_Misc // + this.groupBox_Misc.Controls.Add(this.checkBox_AutoStartMining); this.groupBox_Misc.Controls.Add(this.checkBox_HideMiningWindows); this.groupBox_Misc.Controls.Add(this.checkBox_MinimizeToTray); this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVidia6X); @@ -219,6 +223,7 @@ private void InitializeComponent() { this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVidia3X); this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVidia5X); this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVidia6X); + this.groupBox_Misc.Controls.Add(this.pictureBox_AutoStartMining); this.groupBox_Misc.Controls.Add(this.pictureBox_MinimizeToTray); this.groupBox_Misc.Controls.Add(this.pictureBox_HideMiningWindows); this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVidia3X); @@ -239,7 +244,7 @@ private void InitializeComponent() { // checkBox_HideMiningWindows // this.checkBox_HideMiningWindows.AutoSize = true; - this.checkBox_HideMiningWindows.Location = new System.Drawing.Point(6, 19); + this.checkBox_HideMiningWindows.Location = new System.Drawing.Point(6, 39); this.checkBox_HideMiningWindows.Name = "checkBox_HideMiningWindows"; this.checkBox_HideMiningWindows.Size = new System.Drawing.Size(123, 17); this.checkBox_HideMiningWindows.TabIndex = 315; @@ -249,7 +254,7 @@ private void InitializeComponent() { // checkBox_MinimizeToTray // this.checkBox_MinimizeToTray.AutoSize = true; - this.checkBox_MinimizeToTray.Location = new System.Drawing.Point(6, 41); + this.checkBox_MinimizeToTray.Location = new System.Drawing.Point(6, 61); this.checkBox_MinimizeToTray.Name = "checkBox_MinimizeToTray"; this.checkBox_MinimizeToTray.Size = new System.Drawing.Size(100, 17); this.checkBox_MinimizeToTray.TabIndex = 316; @@ -259,7 +264,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionNVidia6X // this.checkBox_DisableDetectionNVidia6X.AutoSize = true; - this.checkBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(6, 63); + this.checkBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(6, 83); this.checkBox_DisableDetectionNVidia6X.Name = "checkBox_DisableDetectionNVidia6X"; this.checkBox_DisableDetectionNVidia6X.Size = new System.Drawing.Size(151, 17); this.checkBox_DisableDetectionNVidia6X.TabIndex = 317; @@ -269,7 +274,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionNVidia5X // this.checkBox_DisableDetectionNVidia5X.AutoSize = true; - this.checkBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(6, 85); + this.checkBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(6, 105); this.checkBox_DisableDetectionNVidia5X.Name = "checkBox_DisableDetectionNVidia5X"; this.checkBox_DisableDetectionNVidia5X.Size = new System.Drawing.Size(151, 17); this.checkBox_DisableDetectionNVidia5X.TabIndex = 317; @@ -279,7 +284,7 @@ private void InitializeComponent() { // pictureBox_NVIDIAP0State // this.pictureBox_NVIDIAP0State.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_NVIDIAP0State.Location = new System.Drawing.Point(205, 261); + this.pictureBox_NVIDIAP0State.Location = new System.Drawing.Point(205, 281); this.pictureBox_NVIDIAP0State.Name = "pictureBox_NVIDIAP0State"; this.pictureBox_NVIDIAP0State.Size = new System.Drawing.Size(18, 18); this.pictureBox_NVIDIAP0State.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -289,7 +294,7 @@ private void InitializeComponent() { // pictureBox_DisableWindowsErrorReporting // this.pictureBox_DisableWindowsErrorReporting.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(205, 239); + this.pictureBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(205, 259); this.pictureBox_DisableWindowsErrorReporting.Name = "pictureBox_DisableWindowsErrorReporting"; this.pictureBox_DisableWindowsErrorReporting.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableWindowsErrorReporting.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -299,7 +304,7 @@ private void InitializeComponent() { // pictureBox_ShowDriverVersionWarning // this.pictureBox_ShowDriverVersionWarning.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(205, 217); + this.pictureBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(205, 237); this.pictureBox_ShowDriverVersionWarning.Name = "pictureBox_ShowDriverVersionWarning"; this.pictureBox_ShowDriverVersionWarning.Size = new System.Drawing.Size(18, 18); this.pictureBox_ShowDriverVersionWarning.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -309,7 +314,7 @@ private void InitializeComponent() { // pictureBox_StartMiningWhenIdle // this.pictureBox_StartMiningWhenIdle.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_StartMiningWhenIdle.Location = new System.Drawing.Point(205, 195); + this.pictureBox_StartMiningWhenIdle.Location = new System.Drawing.Point(205, 215); this.pictureBox_StartMiningWhenIdle.Name = "pictureBox_StartMiningWhenIdle"; this.pictureBox_StartMiningWhenIdle.Size = new System.Drawing.Size(18, 18); this.pictureBox_StartMiningWhenIdle.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -319,7 +324,7 @@ private void InitializeComponent() { // pictureBox_AutoScaleBTCValues // this.pictureBox_AutoScaleBTCValues.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AutoScaleBTCValues.Location = new System.Drawing.Point(205, 173); + this.pictureBox_AutoScaleBTCValues.Location = new System.Drawing.Point(205, 193); this.pictureBox_AutoScaleBTCValues.Name = "pictureBox_AutoScaleBTCValues"; this.pictureBox_AutoScaleBTCValues.Size = new System.Drawing.Size(18, 18); this.pictureBox_AutoScaleBTCValues.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -329,7 +334,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionAMD // this.pictureBox_DisableDetectionAMD.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionAMD.Location = new System.Drawing.Point(205, 151); + this.pictureBox_DisableDetectionAMD.Location = new System.Drawing.Point(205, 171); this.pictureBox_DisableDetectionAMD.Name = "pictureBox_DisableDetectionAMD"; this.pictureBox_DisableDetectionAMD.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionAMD.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -339,7 +344,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVidia2X // this.pictureBox_DisableDetectionNVidia2X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(205, 129); + this.pictureBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(205, 149); this.pictureBox_DisableDetectionNVidia2X.Name = "pictureBox_DisableDetectionNVidia2X"; this.pictureBox_DisableDetectionNVidia2X.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVidia2X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -349,7 +354,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVidia3X // this.pictureBox_DisableDetectionNVidia3X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(205, 107); + this.pictureBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(205, 127); this.pictureBox_DisableDetectionNVidia3X.Name = "pictureBox_DisableDetectionNVidia3X"; this.pictureBox_DisableDetectionNVidia3X.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVidia3X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -359,7 +364,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVidia5X // this.pictureBox_DisableDetectionNVidia5X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(205, 85); + this.pictureBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(205, 105); this.pictureBox_DisableDetectionNVidia5X.Name = "pictureBox_DisableDetectionNVidia5X"; this.pictureBox_DisableDetectionNVidia5X.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVidia5X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -369,7 +374,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVidia6X // this.pictureBox_DisableDetectionNVidia6X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(205, 63); + this.pictureBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(205, 83); this.pictureBox_DisableDetectionNVidia6X.Name = "pictureBox_DisableDetectionNVidia6X"; this.pictureBox_DisableDetectionNVidia6X.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVidia6X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -379,7 +384,7 @@ private void InitializeComponent() { // pictureBox_MinimizeToTray // this.pictureBox_MinimizeToTray.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_MinimizeToTray.Location = new System.Drawing.Point(205, 41); + this.pictureBox_MinimizeToTray.Location = new System.Drawing.Point(205, 61); this.pictureBox_MinimizeToTray.Name = "pictureBox_MinimizeToTray"; this.pictureBox_MinimizeToTray.Size = new System.Drawing.Size(18, 18); this.pictureBox_MinimizeToTray.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -389,7 +394,7 @@ private void InitializeComponent() { // pictureBox_HideMiningWindows // this.pictureBox_HideMiningWindows.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_HideMiningWindows.Location = new System.Drawing.Point(205, 19); + this.pictureBox_HideMiningWindows.Location = new System.Drawing.Point(205, 39); this.pictureBox_HideMiningWindows.Name = "pictureBox_HideMiningWindows"; this.pictureBox_HideMiningWindows.Size = new System.Drawing.Size(18, 18); this.pictureBox_HideMiningWindows.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -399,7 +404,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionNVidia3X // this.checkBox_DisableDetectionNVidia3X.AutoSize = true; - this.checkBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(6, 107); + this.checkBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(6, 127); this.checkBox_DisableDetectionNVidia3X.Name = "checkBox_DisableDetectionNVidia3X"; this.checkBox_DisableDetectionNVidia3X.Size = new System.Drawing.Size(151, 17); this.checkBox_DisableDetectionNVidia3X.TabIndex = 318; @@ -409,7 +414,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionNVidia2X // this.checkBox_DisableDetectionNVidia2X.AutoSize = true; - this.checkBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(6, 129); + this.checkBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(6, 149); this.checkBox_DisableDetectionNVidia2X.Name = "checkBox_DisableDetectionNVidia2X"; this.checkBox_DisableDetectionNVidia2X.Size = new System.Drawing.Size(151, 17); this.checkBox_DisableDetectionNVidia2X.TabIndex = 319; @@ -419,7 +424,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionAMD // this.checkBox_DisableDetectionAMD.AutoSize = true; - this.checkBox_DisableDetectionAMD.Location = new System.Drawing.Point(6, 151); + this.checkBox_DisableDetectionAMD.Location = new System.Drawing.Point(6, 171); this.checkBox_DisableDetectionAMD.Name = "checkBox_DisableDetectionAMD"; this.checkBox_DisableDetectionAMD.Size = new System.Drawing.Size(131, 17); this.checkBox_DisableDetectionAMD.TabIndex = 320; @@ -429,7 +434,7 @@ private void InitializeComponent() { // checkBox_NVIDIAP0State // this.checkBox_NVIDIAP0State.AutoSize = true; - this.checkBox_NVIDIAP0State.Location = new System.Drawing.Point(6, 261); + this.checkBox_NVIDIAP0State.Location = new System.Drawing.Point(6, 281); this.checkBox_NVIDIAP0State.Name = "checkBox_NVIDIAP0State"; this.checkBox_NVIDIAP0State.Size = new System.Drawing.Size(100, 17); this.checkBox_NVIDIAP0State.TabIndex = 326; @@ -439,7 +444,7 @@ private void InitializeComponent() { // checkBox_AutoScaleBTCValues // this.checkBox_AutoScaleBTCValues.AutoSize = true; - this.checkBox_AutoScaleBTCValues.Location = new System.Drawing.Point(6, 173); + this.checkBox_AutoScaleBTCValues.Location = new System.Drawing.Point(6, 193); this.checkBox_AutoScaleBTCValues.Name = "checkBox_AutoScaleBTCValues"; this.checkBox_AutoScaleBTCValues.Size = new System.Drawing.Size(128, 17); this.checkBox_AutoScaleBTCValues.TabIndex = 321; @@ -449,7 +454,7 @@ private void InitializeComponent() { // checkBox_DisableWindowsErrorReporting // this.checkBox_DisableWindowsErrorReporting.AutoSize = true; - this.checkBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(6, 239); + this.checkBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(6, 259); this.checkBox_DisableWindowsErrorReporting.Name = "checkBox_DisableWindowsErrorReporting"; this.checkBox_DisableWindowsErrorReporting.Size = new System.Drawing.Size(173, 17); this.checkBox_DisableWindowsErrorReporting.TabIndex = 324; @@ -459,7 +464,7 @@ private void InitializeComponent() { // checkBox_StartMiningWhenIdle // this.checkBox_StartMiningWhenIdle.AutoSize = true; - this.checkBox_StartMiningWhenIdle.Location = new System.Drawing.Point(6, 195); + this.checkBox_StartMiningWhenIdle.Location = new System.Drawing.Point(6, 215); this.checkBox_StartMiningWhenIdle.Name = "checkBox_StartMiningWhenIdle"; this.checkBox_StartMiningWhenIdle.Size = new System.Drawing.Size(125, 17); this.checkBox_StartMiningWhenIdle.TabIndex = 322; @@ -469,7 +474,7 @@ private void InitializeComponent() { // checkBox_ShowDriverVersionWarning // this.checkBox_ShowDriverVersionWarning.AutoSize = true; - this.checkBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(6, 217); + this.checkBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(6, 237); this.checkBox_ShowDriverVersionWarning.Name = "checkBox_ShowDriverVersionWarning"; this.checkBox_ShowDriverVersionWarning.Size = new System.Drawing.Size(156, 17); this.checkBox_ShowDriverVersionWarning.TabIndex = 323; @@ -1146,6 +1151,36 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.TabStop = false; this.groupBoxBenchmarkTimeLimits.Text = "Benchmark Time Limits:"; // + // benchmarkLimitControlNVIDIA + // + this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; + this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); + this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; + this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlNVIDIA.TabIndex = 4; + this.benchmarkLimitControlNVIDIA.TimeLimits = null; + // + // benchmarkLimitControlCPU + // + this.benchmarkLimitControlCPU.GroupName = "CPU"; + this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); + this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; + this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlCPU.TabIndex = 3; + this.benchmarkLimitControlCPU.TimeLimits = null; + // + // benchmarkLimitControlAMD + // + this.benchmarkLimitControlAMD.GroupName = "AMD"; + this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); + this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; + this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlAMD.TabIndex = 5; + this.benchmarkLimitControlAMD.TimeLimits = null; + // // tabPageDevicesAlgos // this.tabPageDevicesAlgos.Controls.Add(this.devicesListViewEnableControl1); @@ -1161,6 +1196,27 @@ private void InitializeComponent() { this.tabPageDevicesAlgos.Text = "Devices/Algorithms"; this.tabPageDevicesAlgos.UseVisualStyleBackColor = true; // + // devicesListViewEnableControl1 + // + this.devicesListViewEnableControl1.AutoSaveChange = true; + this.devicesListViewEnableControl1.BenchmarkCalculation = null; + this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; + this.devicesListViewEnableControl1.IsInBenchmark = false; + this.devicesListViewEnableControl1.IsMining = false; + this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); + this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; + this.devicesListViewEnableControl1.SaveToGeneralConfig = false; + this.devicesListViewEnableControl1.SetAllEnabled = false; + this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); + this.devicesListViewEnableControl1.TabIndex = 397; + // + // algorithmSettingsControl1 + // + this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); + this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; + this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); + this.algorithmSettingsControl1.TabIndex = 396; + // // groupBoxAlgorithmSettings // this.groupBoxAlgorithmSettings.Controls.Add(this.algorithmsListView1); @@ -1171,6 +1227,16 @@ private void InitializeComponent() { this.groupBoxAlgorithmSettings.TabStop = false; this.groupBoxAlgorithmSettings.Text = "Algorithm settings for selected device:"; // + // algorithmsListView1 + // + this.algorithmsListView1.BenchmarkCalculation = null; + this.algorithmsListView1.ComunicationInterface = null; + this.algorithmsListView1.IsInBenchmark = false; + this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); + this.algorithmsListView1.Name = "algorithmsListView1"; + this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); + this.algorithmsListView1.TabIndex = 2; + // // buttonAllProfit // this.buttonAllProfit.Location = new System.Drawing.Point(364, 6); @@ -1224,64 +1290,25 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // benchmarkLimitControlNVIDIA - // - this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; - this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); - this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; - this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlNVIDIA.TabIndex = 4; - this.benchmarkLimitControlNVIDIA.TimeLimits = null; - // - // benchmarkLimitControlCPU + // pictureBox_AutoStartMining // - this.benchmarkLimitControlCPU.GroupName = "CPU"; - this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); - this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; - this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlCPU.TabIndex = 3; - this.benchmarkLimitControlCPU.TimeLimits = null; + this.pictureBox_AutoStartMining.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(205, 19); + this.pictureBox_AutoStartMining.Name = "pictureBox_AutoStartMining"; + this.pictureBox_AutoStartMining.Size = new System.Drawing.Size(18, 18); + this.pictureBox_AutoStartMining.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_AutoStartMining.TabIndex = 364; + this.pictureBox_AutoStartMining.TabStop = false; // - // benchmarkLimitControlAMD + // checkBox_AutoStartMining // - this.benchmarkLimitControlAMD.GroupName = "AMD"; - this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); - this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; - this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlAMD.TabIndex = 5; - this.benchmarkLimitControlAMD.TimeLimits = null; - // - // devicesListViewEnableControl1 - // - this.devicesListViewEnableControl1.AutoSaveChange = true; - this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; - this.devicesListViewEnableControl1.IsInBenchmark = false; - this.devicesListViewEnableControl1.IsMining = false; - this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); - this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; - this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.SetAllEnabled = false; - this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); - this.devicesListViewEnableControl1.TabIndex = 397; - // - // algorithmSettingsControl1 - // - this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); - this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; - this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); - this.algorithmSettingsControl1.TabIndex = 396; - // - // algorithmsListView1 - // - this.algorithmsListView1.ComunicationInterface = null; - this.algorithmsListView1.IsInBenchmark = false; - this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); - this.algorithmsListView1.Name = "algorithmsListView1"; - this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); - this.algorithmsListView1.TabIndex = 2; + this.checkBox_AutoStartMining.AutoSize = true; + this.checkBox_AutoStartMining.Location = new System.Drawing.Point(6, 19); + this.checkBox_AutoStartMining.Name = "checkBox_AutoStartMining"; + this.checkBox_AutoStartMining.Size = new System.Drawing.Size(102, 17); + this.checkBox_AutoStartMining.TabIndex = 315; + this.checkBox_AutoStartMining.Text = "Autostart Mining"; + this.checkBox_AutoStartMining.UseVisualStyleBackColor = true; // // Form_Settings // @@ -1348,6 +1375,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).EndInit(); this.ResumeLayout(false); } @@ -1457,6 +1485,8 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_SwitchMinSecondsDynamic; private System.Windows.Forms.PictureBox pictureBox_ethminerDefaultBlockHeight; private System.Windows.Forms.PictureBox pictureBox_DagGeneration; + private System.Windows.Forms.CheckBox checkBox_AutoStartMining; + private System.Windows.Forms.PictureBox pictureBox_AutoStartMining; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 6e3627d..a67e42d 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -172,6 +172,11 @@ private void InitializeToolTip() { toolTip1.SetToolTip(this.checkBox_NVIDIAP0State, International.GetText("Form_Settings_ToolTip_checkBox_NVIDIAP0State")); toolTip1.SetToolTip(this.pictureBox_NVIDIAP0State, International.GetText("Form_Settings_ToolTip_checkBox_NVIDIAP0State")); + + + toolTip1.SetToolTip(this.checkBox_AutoStartMining, International.GetText("Form_Settings_ToolTip_checkBox_AutoStartMining")); + toolTip1.SetToolTip(this.pictureBox_AutoStartMining, International.GetText("Form_Settings_ToolTip_checkBox_AutoStartMining")); + toolTip1.SetToolTip(this.textBox_ethminerDefaultBlockHeight, International.GetText("Form_Settings_ToolTip_ethminerDefaultBlockHeight")); toolTip1.SetToolTip(this.label_ethminerDefaultBlockHeight, International.GetText("Form_Settings_ToolTip_ethminerDefaultBlockHeight")); @@ -203,6 +208,7 @@ private void InitializeFormTranslations() { private void InitializeGeneralTabTranslations() { checkBox_DebugConsole.Text = International.GetText("Form_Settings_General_DebugConsole"); + checkBox_AutoStartMining.Text = International.GetText("Form_Settings_General_AutoStartMining"); checkBox_HideMiningWindows.Text = International.GetText("Form_Settings_General_HideMiningWindows"); checkBox_MinimizeToTray.Text = International.GetText("Form_Settings_General_MinimizeToTray"); checkBox_DisableDetectionNVidia6X.Text = String.Format(International.GetText("Form_Settings_General_DisableDetection"), "NVIDIA6.x"); @@ -289,6 +295,7 @@ private void InitializeGeneralTabCallbacks() { this.checkBox_StartMiningWhenIdle.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_NVIDIAP0State.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_LogToFile.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); + this.checkBox_AutoStartMining.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); } // Add EventHandler for all the general tab's textboxes { @@ -341,6 +348,7 @@ private void InitializeGeneralTabFieldValuesReferences() { // Checkboxes set checked value { checkBox_DebugConsole.Checked = ConfigManager.Instance.GeneralConfig.DebugConsole; + checkBox_AutoStartMining.Checked = ConfigManager.Instance.GeneralConfig.AutoStartMining; checkBox_HideMiningWindows.Checked = ConfigManager.Instance.GeneralConfig.HideMiningWindows; checkBox_MinimizeToTray.Checked = ConfigManager.Instance.GeneralConfig.MinimizeToTray; checkBox_DisableDetectionNVidia6X.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X; @@ -470,6 +478,7 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { // indicate there has been a change IsChange = true; ConfigManager.Instance.GeneralConfig.DebugConsole = checkBox_DebugConsole.Checked; + ConfigManager.Instance.GeneralConfig.AutoStartMining = checkBox_AutoStartMining.Checked; ConfigManager.Instance.GeneralConfig.HideMiningWindows = checkBox_HideMiningWindows.Checked; ConfigManager.Instance.GeneralConfig.MinimizeToTray = checkBox_MinimizeToTray.Checked; ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X = checkBox_DisableDetectionNVidia6X.Checked; From 0c9b4bf375cc562e2fde700902bdf6c2ba252be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 16 Sep 2016 12:40:38 +0200 Subject: [PATCH 015/366] AMD extra launch params on old config load fix --- NiceHashMiner/Configs/DeviceBenchmarkConfig.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs index 8bacc65..9a76c8b 100644 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs +++ b/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs @@ -106,6 +106,11 @@ protected override void InitializeObject() { foreach (var key in _file.AlgorithmSettings.Keys) { if(this.AlgorithmSettings.ContainsKey(key)) { this.AlgorithmSettings[key] = _file.AlgorithmSettings[key]; + // AMD extra params fix + if (this.AlgorithmSettings[key].ExtraLaunchParameters.Contains(AmdGpuDevice.TemperatureParam)) { + this.AlgorithmSettings[key].ExtraLaunchParameters = this.AlgorithmSettings[key].ExtraLaunchParameters.Replace(AmdGpuDevice.TemperatureParam, ""); + this.AlgorithmSettings[key].ExtraLaunchParameters = this.AlgorithmSettings[key].ExtraLaunchParameters + AmdGpuDevice.TemperatureParam; + } } else { // TODO think if we let tamnpered data } From 0ffa03b03e6ef3ef1ac3f78ff71226273529505d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 16 Sep 2016 13:31:29 +0200 Subject: [PATCH 016/366] make sure sgminer is killed during benchmarks stop --- NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/Miners/sgminer.cs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 5e12af1..4e3e28f 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -450,7 +450,7 @@ protected void CheckOutdata(string outdata) { //} // killing proccesses can take time - public void EndBenchmarkProcces() { + virtual public void EndBenchmarkProcces() { if (BenchmarkHandle != null && BenchmarkProcessStatus != BenchmarkProcessStatus.Killing) { BenchmarkProcessStatus = BenchmarkProcessStatus.Killing; try { diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index a1be52a..11862df 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -43,6 +43,11 @@ public void KillSGMiner() { } } + public override void EndBenchmarkProcces() { + base.EndBenchmarkProcces(); + KillSGMiner(); + } + protected override int GET_MAX_CooldownTimeInMilliseconds() { return 90 * 1000; // 1.5 minute max, whole waiting time 75seconds } From 8db8c9dd02bceaa84f24f074fc97e6da267df812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 16 Sep 2016 15:15:13 +0200 Subject: [PATCH 017/366] Detect if .NET45 is installed --- NiceHashMiner/Forms/Form_Main.cs | 9 ++++++ NiceHashMiner/Helpers.cs | 52 +++++++++++++++++++++++++++----- NiceHashMiner/langs/en.lang | 1 + 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 7c3125d..52df1b2 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -173,6 +173,15 @@ private void StartupTimer_Tick(object sender, EventArgs e) StartupTimer.Stop(); StartupTimer = null; + if (!Helpers.Is45NetOrHigher()) { + MessageBox.Show(International.GetText("NET45_Not_Intsalled_msg"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.OK); + + this.Close(); + return; + } + if (!Helpers.InternalCheckIsWow64()) { MessageBox.Show(International.GetText("Form_Main_x64_Support_Only"), International.GetText("Warning_with_Exclamation"), diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index 889ffda..474359c 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -152,13 +152,15 @@ public static string GetMotherboardID() { // TODO could have multiple cpus public static string GetCpuID() { - ManagementObjectCollection mbsList = null; - ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_processor"); - mbsList = mbs.Get(); - string id = ""; - foreach (ManagementObject mo in mbsList) { - id = mo["ProcessorID"].ToString(); - } + string id = "N/A"; + try { + ManagementObjectCollection mbsList = null; + ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_processor"); + mbsList = mbs.Get(); + foreach (ManagementObject mo in mbsList) { + id = mo["ProcessorID"].ToString(); + } + } catch { } return id; } @@ -174,5 +176,41 @@ public static bool WebRequestTestGoogle() { return true; } + // Checking the version using >= will enable forward compatibility, + // however you should always compile your code on newer versions of + // the framework to ensure your app works the same. + private static bool Is45DotVersion(int releaseKey) { + if (releaseKey >= 393295) { + //return "4.6 or later"; + return true; + } + if ((releaseKey >= 379893)) { + //return "4.5.2 or later"; + return true; + } + if ((releaseKey >= 378675)) { + //return "4.5.1 or later"; + return true; + } + if ((releaseKey >= 378389)) { + //return "4.5 or later"; + return true; + } + // This line should never execute. A non-null release key should mean + // that 4.5 or later is installed. + //return "No 4.5 or later version detected"; + return false; + } + + public static bool Is45NetOrHigher() { + using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) { + if (ndpKey != null && ndpKey.GetValue("Release") != null) { + return Is45DotVersion((int)ndpKey.GetValue("Release")); + } else { + return false; + } + } + } + } } diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 20d28fa..c56c0cb 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -315,5 +315,6 @@ "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "We have detected that your system has Nvidia GPUs, but your driver is older than {0}. In order for NiceHash Miner to work correctly you should upgrade your drivers to recomended {1} or newer.", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART" : " (current {0})", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended": "We have detected that your Nvidia Driver is older than {0}{1}. We recommend you to update to {2} or newer.", + "NET45_Not_Intsalled_msg" : "NiceHash Miner requires .NET Framework 4.5 or higher to work properly. Please install Microsoft .NET Framework 4.5" } } \ No newline at end of file From 45232f7b71748b78e14d9a2c20f0b7c58bea6cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 16 Sep 2016 15:50:59 +0200 Subject: [PATCH 018/366] updated russian translation --- NiceHashMiner/langs/ru.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 744a098..7785e2e 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -315,5 +315,6 @@ "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "Мы обнаружили, что в вашей системе есть Nvidia GPU, но ваш драйвер старее {0}. Для корректной работы NiceHash Miner, вам необходимо обновить драйверы до рекомендуемого {1} или новее.", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART" : " (текущий {0})", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended": "Мы обнаружили, что ваш драйвер старее {0}{1}. Мы рекомендуем вам обновиться до {2} или новее.", + "NET45_Not_Intsalled_msg" : "Для корректной работы NiceHash Miner требуется .NET Framework 4.5 или выше. Установите, пожалуйста, Microsoft .NET Framework 4.5", } } \ No newline at end of file From 1b5ac98465ff0d97bc341eb0feae53fd6daea0d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 16 Sep 2016 17:09:01 +0200 Subject: [PATCH 019/366] add lbry support --- NiceHashMiner/AlgorithmNiceHashNames.cs | 1 + .../Devices/ComputeDeviceQueryManager.cs | 2 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 7 +- NiceHashMiner/Enums/AlgorithmType.cs | 2 +- NiceHashMiner/Miners/MinerPaths.cs | 2 +- NiceHashMiner/Miners/ccminer_sm5x.cs | 5 +- NiceHashMiner/Miners/sgminer.cs | 6 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- NiceHashMiner/Utils/BINS_CODEGEN.cs | 99 +------------------ 9 files changed, 19 insertions(+), 109 deletions(-) diff --git a/NiceHashMiner/AlgorithmNiceHashNames.cs b/NiceHashMiner/AlgorithmNiceHashNames.cs index 38bdccc..d28498a 100644 --- a/NiceHashMiner/AlgorithmNiceHashNames.cs +++ b/NiceHashMiner/AlgorithmNiceHashNames.cs @@ -37,6 +37,7 @@ public static class AlgorithmNiceHashNames { AlgorithmType.DaggerHashimoto , "daggerhashimoto" }, { AlgorithmType.Decred , "decred" }, { AlgorithmType.CryptoNight , "cryptonight" }, + { AlgorithmType.Lbry , "lbry" }, }; static private List _keys = null; diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index a37f511..0c2e66c 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -333,7 +333,7 @@ private void QueryAMD() { #region AMD driver check, ADL returns 0 // check the driver version bool EnableOptimizedVersion = true; Dictionary deviceDriverOld = new Dictionary(); - string minerPath = MinerPaths.sgminer_5_4_0_general; + string minerPath = MinerPaths.sgminer_5_5_0_general; bool ShowWarningDialog = false; foreach (var vidContrllr in AvaliableVideoControllers) { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 0a15f99..75fb928 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -51,7 +51,9 @@ public static Dictionary CreateDefaultsForGroup(Device { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") - { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } } + { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } }, + { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") + { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, }; } // NVIDIA @@ -72,7 +74,8 @@ public static Dictionary CreateDefaultsForGroup(Device { AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") } + { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, + { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") }, }; if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { // minerName change => "whirlpoolx" => "whirlpool" diff --git a/NiceHashMiner/Enums/AlgorithmType.cs b/NiceHashMiner/Enums/AlgorithmType.cs index 44068ed..62bc455 100644 --- a/NiceHashMiner/Enums/AlgorithmType.cs +++ b/NiceHashMiner/Enums/AlgorithmType.cs @@ -35,8 +35,8 @@ public enum AlgorithmType : int Hodl = 19, DaggerHashimoto = 20, Decred = 21, - // TODO check CryptoNight CryptoNight = 22, + Lbry = 23 #endregion // NiceHashAPI } } diff --git a/NiceHashMiner/Miners/MinerPaths.cs b/NiceHashMiner/Miners/MinerPaths.cs index 8e53f7c..3e81175 100644 --- a/NiceHashMiner/Miners/MinerPaths.cs +++ b/NiceHashMiner/Miners/MinerPaths.cs @@ -37,7 +37,7 @@ public static class MinerPaths /// public const string sgminer_5_1_0_optimized = _bin + @"\sgminer-5-1-0-optimized\sgminer.exe"; public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; - public const string sgminer_5_4_0_general = _bin + @"\sgminer-5-4-0-general\sgminer.exe"; + public const string sgminer_5_5_0_general = _bin + @"\sgminer-5-5-0-general\sgminer.exe"; public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; } diff --git a/NiceHashMiner/Miners/ccminer_sm5x.cs b/NiceHashMiner/Miners/ccminer_sm5x.cs index 5096922..fdb854d 100644 --- a/NiceHashMiner/Miners/ccminer_sm5x.cs +++ b/NiceHashMiner/Miners/ccminer_sm5x.cs @@ -34,7 +34,10 @@ public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string } if (AlgorithmType.CryptoNight == algorithmType) { return MinerPaths.ccminer_cryptonight; - } + } + if (AlgorithmType.Lbry == algorithmType) { + return MinerPaths.ccminer_tpruvot; + } return MinerPaths.ccminer_sp; } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 11862df..b14a861 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -31,7 +31,7 @@ class sgminer : Miner public sgminer() : base(DeviceType.AMD, "AMD_OpenCL") { - Path = MinerPaths.sgminer_5_4_0_general; + Path = MinerPaths.sgminer_5_5_0_general; EnableOptimizedVersion = true; GPUPlatformNumber = ComputeDeviceQueryManager.Instance.AMDOpenCLPlatformNum; } @@ -114,7 +114,7 @@ public override string GetOptimizedMinerPath(AlgorithmType type, string gpuCoden if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type || AlgorithmType.Qubit == type) { if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { if (!Helpers.InternalCheckIsWow64()) - return MinerPaths.sgminer_5_4_0_general; + return MinerPaths.sgminer_5_5_0_general; return MinerPaths.sgminer_5_4_0_tweaked; } @@ -125,7 +125,7 @@ public override string GetOptimizedMinerPath(AlgorithmType type, string gpuCoden } } - return MinerPaths.sgminer_5_4_0_general; + return MinerPaths.sgminer_5_5_0_general; } // new decoupled benchmarking routines diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index d090d60..3a74553 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.1.2")] -[assembly: AssemblyFileVersion("1.7.1.2")] +[assembly: AssemblyVersion("1.7.1.3")] +[assembly: AssemblyFileVersion("1.7.1.3")] diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index 050de00..a56ebbc 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -210,104 +210,7 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Fri, 16 Sep 2016 17:15:13 +0200 Subject: [PATCH 020/366] download bins url update --- NiceHashMiner/Utils/MinersDownloadManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 37c7296..6122db9 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -24,7 +24,8 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Mon, 19 Sep 2016 10:58:14 +0200 Subject: [PATCH 021/366] fixes, log negative string count fix, miner grouping second device check most profitable algo existance, removed unused code --- NiceHashMiner/Miners/MinersManager.cs | 71 ++++++++++++++++----------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 10120c6..e36d7fe 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -356,7 +356,11 @@ PerDeviceProifitDictionary GetEnabledDeviceProifitDictionary(PerDeviceSpeedDicti foreach (var algoSpeedKvp in nameBenchKvp.Value) { // Log stuff and calculation string name = AlgorithmNiceHashNames.GetName(algoSpeedKvp.Key); - string namePreaty = name + new String(' ', MAX_NAME_LEN - name.Length); + int namePreatyCount = MAX_NAME_LEN - name.Length; + if (namePreatyCount <= 0) { + namePreatyCount = 1; + } + string namePreaty = name + new String(' ', namePreatyCount); bool isEnabled = algoSpeedKvp.Value > 0; double nhmSMADataVal = NiceHashData[algoSpeedKvp.Key].paying; // TODO what is the constant at the end? @@ -376,7 +380,11 @@ PerDeviceProifitDictionary GetEnabledDeviceProifitDictionary(PerDeviceSpeedDicti } // log stuff string speedStr = algoSpeedKvp.Value.ToString("F3"); - string speedPreaty = new String(' ', MAX_SPEED_LEN - speedStr.Length) + speedStr; + int speedStrCount = MAX_SPEED_LEN - speedStr.Length; + if (speedStrCount <= 0) { + speedStrCount = 1; + } + string speedPreaty = new String(' ', speedStrCount) + speedStr; stringBuilderDevice.AppendLine(String.Format("\t\t{0}\t:\tPROFIT = {1} ({2}, SPEED = {3}, NHSMA = {4})", namePreaty, // Name algoProfit.ToString(DOUBLE_FORMAT), // Profit @@ -456,30 +464,30 @@ private bool IsGroupBinaryAndAlgorithmSame(ComputeDevice a, ComputeDevice b) { } #endregion //Groupping logic - private string GetDevProfitString(string deviceName, Dictionary deviceProfits) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendLine(String.Format("\tProfits for {0}:", deviceName)); - // TODO make parameter - int MAX_NAME_LEN = "daggerhashimoto".Length; - foreach (var kvp in deviceProfits) { - string name = AlgorithmNiceHashNames.GetName(kvp.Key); - string namePreaty = name + new String(' ', MAX_NAME_LEN - name.Length); - stringBuilder.AppendLine(String.Format("\t\t{0}\t:\t{1},", - namePreaty, - kvp.Value.ToString(DOUBLE_FORMAT))); - } - - return stringBuilder.ToString(); - } - - private string GetProfitsSummery(PerDeviceProifitDictionary devProfits) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendLine("Current device profits:"); - foreach (var kvp in devProfits) { - stringBuilder.AppendLine(GetDevProfitString(kvp.Key, kvp.Value)); - } - return stringBuilder.ToString(); - } + //private string GetDevProfitString(string deviceName, Dictionary deviceProfits) { + // StringBuilder stringBuilder = new StringBuilder(); + // stringBuilder.AppendLine(String.Format("\tProfits for {0}:", deviceName)); + // // TODO make parameter + // int MAX_NAME_LEN = "daggerhashimoto".Length; + // foreach (var kvp in deviceProfits) { + // string name = AlgorithmNiceHashNames.GetName(kvp.Key); + // string namePreaty = name + new String(' ', MAX_NAME_LEN - name.Length); + // stringBuilder.AppendLine(String.Format("\t\t{0}\t:\t{1},", + // namePreaty, + // kvp.Value.ToString(DOUBLE_FORMAT))); + // } + + // return stringBuilder.ToString(); + //} + + //private string GetProfitsSummery(PerDeviceProifitDictionary devProfits) { + // StringBuilder stringBuilder = new StringBuilder(); + // stringBuilder.AppendLine("Current device profits:"); + // foreach (var kvp in devProfits) { + // stringBuilder.AppendLine(GetDevProfitString(kvp.Key, kvp.Value)); + // } + // return stringBuilder.ToString(); + //} /// /// SwichMostProfitable should check the best combination for most profit. @@ -573,10 +581,13 @@ public void SwichMostProfitableGroupUpMethod(Dictionary Date: Mon, 19 Sep 2016 12:01:37 +0200 Subject: [PATCH 022/366] Disable Driver Warnings when ShowDriverVersionWarning is false, fix --- NiceHashMiner/Devices/ComputeDeviceQueryManager.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index 0c2e66c..612af57 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -171,7 +171,7 @@ public void QueryDevices(IMessageNotifier messageNotifier) _currentNvidiaOpenCLDriver = GetNvidiaOpenCLDriver(); // if we have nvidia cards but no CUDA devices tell the user to upgrade driver bool isNvidiaErrorShown = false; // to prevent showing twice - if (HasNvidiaVideoController() && CudaDevices.Count == 0) { + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && HasNvidiaVideoController() && CudaDevices.Count == 0) { isNvidiaErrorShown = true; var minDriver = NVIDIA_MIN_DETECTION_DRIVER.ToString(); var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); @@ -181,7 +181,7 @@ public void QueryDevices(IMessageNotifier messageNotifier) MessageBoxButtons.OK, MessageBoxIcon.Error); } // recomended driver - if (HasNvidiaVideoController() && _currentNvidiaOpenCLDriver < NVIDIA_RECOMENDED_DRIVER && !isNvidiaErrorShown) { + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && HasNvidiaVideoController() && _currentNvidiaOpenCLDriver < NVIDIA_RECOMENDED_DRIVER && !isNvidiaErrorShown) { var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); var nvdriverString = _currentNvidiaOpenCLDriver > -1 ? String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART"), _currentNvidiaOpenCLDriver.ToString()) : ""; @@ -258,7 +258,7 @@ private void QueryVideoControllers() { AvaliableVideoControllers.Add(vidController); } Helpers.ConsolePrint(TAG, stringBuilder.ToString()); - if (!allVideoContollersOK) { + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && !allVideoContollersOK) { string msg = International.GetText("QueryVideoControllers_NOT_ALL_OK_Msg"); foreach (var vc in AvaliableVideoControllers) { if(!vc.Status.ToLower().Equals("ok")) { @@ -363,7 +363,7 @@ private void QueryAMD() { } } } - if (ShowWarningDialog == true && ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning == true) { + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && ShowWarningDialog == true) { Form WarningDialog = new DriverVersionConfirmationDialog(); WarningDialog.ShowDialog(); WarningDialog = null; From 504ef3f26ef0f802bff776a5e20a5780ba048be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 19 Sep 2016 13:47:54 +0200 Subject: [PATCH 023/366] profitability check fix --- NiceHashMiner/Forms/Form_Settings.cs | 31 +------------- NiceHashMiner/NiceHashMiner.csproj | 1 + NiceHashMiner/ProfitabilityCalculator.cs | 54 ++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 29 deletions(-) create mode 100644 NiceHashMiner/ProfitabilityCalculator.cs diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index a67e42d..75a8a38 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -569,33 +569,6 @@ private void devicesListView1_ItemSelectionChanged(object sender, ListViewItemSe groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); } - // TODO IMPORTANT get back to this div thing - static double[] div = new double[] { - 1000000, // 0 (MH/s) Scrypt - 1000000000000, // 1 (TH/s) SHA256 - 1000000, // 2 (MH/s) ScryptNf - 1000000, // 3 (MH/s) X11 - 1000000, // 4 (MH/s) X13 - 1000000, // 5 (MH/s) Keccak - 1000000, // 6 (MH/s) X15 - 1000000, // 7 (MH/s) Nist5 - 1000000, // 8 (MH/s) NeoScrypt - 1000000, // 9 (MH/s) Lyra2RE - 1000000, // 10 (MH/s) WhirlpoolX - 1000000, // 11 (MH/s) Qubit - 1000000, // 12 (MH/s) Quark - 1000, // 13 (kH/s) Axiom - 1000000, // 14 (MH/s) Lyra2REv2 - 1000, // 15 (kH/s) ScryptJaneNf16 - 1000000000, // 16 (GH/s) Blake256r8 - 1000000000, // 17 (GH/s) Blake256r14 - 1000000000, // 18 (GH/s) Blake256r8vnl - 1000, // 19 (kH/s) Hodl - 1000000, // 20 (MH/s) Daggerhashimoto - 1000000000, // 21 (GH/s) Decred - 1000, // 22 (kH/s) CryptoNight - 1000000 }; // 999 (MH/s) Ethereum - private void buttonSelectedProfit_Click(object sender, EventArgs e) { if (_selectedComputeDevice == null) { MessageBox.Show(International.GetText("FormSettings_ButtonProfitSingle"), @@ -606,7 +579,7 @@ private void buttonSelectedProfit_Click(object sender, EventArgs e) { var url = "https://www.nicehash.com/?p=calc&name=" + _selectedComputeDevice.Name; foreach (var algorithm in _selectedComputeDevice.DeviceBenchmarkConfig.AlgorithmSettings.Values) { var id = (int)algorithm.NiceHashID; - url += "&speed" + id + "=" + (algorithm.BenchmarkSpeed / div[id]).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + url += "&speed" + id + "=" + ProfitabilityCalculator.GetFormatedSpeed(algorithm.BenchmarkSpeed, algorithm.NiceHashID).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); } url += "&nhmver=" + Application.ProductVersion.ToString(); // Add version info url += "&cost=1&power=1"; // Set default power and cost to 1 @@ -628,7 +601,7 @@ private void buttonAllProfit_Click(object sender, EventArgs e) { } foreach (var algorithm in total) { var id = (int)algorithm.Key; - url += "&speed" + id + "=" + (algorithm.Value / div[id]).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + url += "&speed" + id + "=" + ProfitabilityCalculator.GetFormatedSpeed(algorithm.Value, algorithm.Key).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); } url += "&nhmver=" + Application.ProductVersion.ToString(); // Add version info url += "&cost=1&power=1"; // Set default power and cost to 1 diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 356b9c6..b492b41 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -226,6 +226,7 @@ + diff --git a/NiceHashMiner/ProfitabilityCalculator.cs b/NiceHashMiner/ProfitabilityCalculator.cs new file mode 100644 index 0000000..d301fb7 --- /dev/null +++ b/NiceHashMiner/ProfitabilityCalculator.cs @@ -0,0 +1,54 @@ +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner { + // this class mirrors the web profitability, chech what https://www.nicehash.com/?p=calc is using for each algo + static class ProfitabilityCalculator { + private const double kHs = 1000; + private const double MHs = 1000000; + private const double GHs = 1000000000; + private const double THs = 1000000000000; + + // divide factor to mirror web values + readonly static private Dictionary _div = new Dictionary() + { + { AlgorithmType.INVALID , 1 }, + { AlgorithmType.NONE , 1 }, + { AlgorithmType.Scrypt_UNUSED, MHs }, // NOT used + { AlgorithmType.SHA256_UNUSED , THs }, // NOT used + { AlgorithmType.ScryptNf_UNUSED , MHs }, // NOT used + { AlgorithmType.X11_UNUSED , MHs }, // NOT used + { AlgorithmType.X13 , MHs }, + { AlgorithmType.Keccak , MHs }, + { AlgorithmType.X15 , MHs }, + { AlgorithmType.Nist5 , MHs }, + { AlgorithmType.NeoScrypt , MHs }, + { AlgorithmType.Lyra2RE , MHs }, + { AlgorithmType.WhirlpoolX , MHs }, + { AlgorithmType.Qubit , MHs }, + { AlgorithmType.Quark , MHs }, + { AlgorithmType.Axiom_UNUSED , kHs }, // NOT used + { AlgorithmType.Lyra2REv2 , MHs }, + { AlgorithmType.ScryptJaneNf16_UNUSED , kHs }, // NOT used + { AlgorithmType.Blake256r8 , GHs }, + { AlgorithmType.Blake256r14 , GHs }, + { AlgorithmType.Blake256r8vnl , GHs }, + { AlgorithmType.Hodl , kHs }, + { AlgorithmType.DaggerHashimoto , MHs }, + { AlgorithmType.Decred , GHs }, + { AlgorithmType.CryptoNight , kHs }, + { AlgorithmType.Lbry , GHs }, + }; + + public static double GetFormatedSpeed(double speed, AlgorithmType type) { + if (_div.ContainsKey(type)) { + return speed / _div[type]; + } + return speed; // should never happen + } + } +} From 92966c9c90f981d9d3110d6534da501b2eef603a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 20 Sep 2016 10:39:34 +0200 Subject: [PATCH 024/366] removed intensity param (Gui and algorithm), added extra launch parameter parser (ethminer, cpuminer TODO), returned DisableAMDTempControl --- NiceHashMiner/Algorithm.cs | 3 - NiceHashMiner/AlgorithmNiceHashNames.cs | 12 +- NiceHashMiner/Configs/GeneralConfig.cs | 5 + NiceHashMiner/Devices/ComputeDevice.cs | 1 - NiceHashMiner/Enums/MinerOptionFlagType.cs | 14 + NiceHashMiner/Enums/MinerOptionType.cs | 39 +++ .../AlgorithmSettingsControl.Designer.cs | 18 +- .../Components/AlgorithmSettingsControl.cs | 96 +++---- .../Miners/ExtraLaunchParametersParser.cs | 246 ++++++++++++++++++ NiceHashMiner/Miners/Miner.cs | 6 - NiceHashMiner/Miners/MinerOption.cs | 25 ++ NiceHashMiner/Miners/MinersManager.cs | 10 +- NiceHashMiner/Miners/ccminer.cs | 3 +- NiceHashMiner/Miners/ccminer_sm6x.cs | 4 +- NiceHashMiner/NiceHashMiner.csproj | 4 + 15 files changed, 397 insertions(+), 89 deletions(-) create mode 100644 NiceHashMiner/Enums/MinerOptionFlagType.cs create mode 100644 NiceHashMiner/Enums/MinerOptionType.cs create mode 100644 NiceHashMiner/Miners/ExtraLaunchParametersParser.cs create mode 100644 NiceHashMiner/Miners/MinerOption.cs diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index 46b131c..aa9ede9 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -16,8 +16,6 @@ public class Algorithm { public double BenchmarkSpeed { get; set; } public string ExtraLaunchParameters { get; set; } - // not all miners, GPU sgminer and most ccminers - public double Intensity { get; set; } // CPU miners only setting public int LessThreads { get; set; } @@ -61,7 +59,6 @@ public Algorithm(AlgorithmType niceHashID, string minerName) { BenchmarkSpeed = 0.0d; ExtraLaunchParameters = ""; - Intensity = 0.0d; // 0.0d is default LessThreads = 0; Skip = false; BenchmarkStatus = ""; diff --git a/NiceHashMiner/AlgorithmNiceHashNames.cs b/NiceHashMiner/AlgorithmNiceHashNames.cs index d28498a..b2ffefe 100644 --- a/NiceHashMiner/AlgorithmNiceHashNames.cs +++ b/NiceHashMiner/AlgorithmNiceHashNames.cs @@ -14,10 +14,10 @@ public static class AlgorithmNiceHashNames { { AlgorithmType.INVALID , "INVALID" }, { AlgorithmType.NONE , "NONE" }, - //{ AlgorithmType.Scrypt , "scrypt" }, // NOT used - //{ AlgorithmType.SHA256 , "sha256" }, // NOT used - //{ AlgorithmType.ScryptNf , "scryptnf" }, // NOT used - //{ AlgorithmType.X11 , "x11" }, // NOT used + { AlgorithmType.Scrypt_UNUSED , "scrypt" }, // NOT used + { AlgorithmType.SHA256_UNUSED , "sha256" }, // NOT used + { AlgorithmType.ScryptNf_UNUSED , "scryptnf" }, // NOT used + { AlgorithmType.X11_UNUSED , "x11" }, // NOT used { AlgorithmType.X13 , "x13" }, { AlgorithmType.Keccak , "keccak" }, { AlgorithmType.X15 , "x15" }, @@ -27,9 +27,9 @@ public static class AlgorithmNiceHashNames { AlgorithmType.WhirlpoolX , "whirlpoolx" }, { AlgorithmType.Qubit , "qubit" }, { AlgorithmType.Quark , "quark" }, - //{ AlgorithmType.Axiom , "axiom" }, // NOT used + { AlgorithmType.Axiom_UNUSED , "axiom" }, // NOT used { AlgorithmType.Lyra2REv2 , "lyra2rev2" }, - //{ AlgorithmType.ScryptJaneNf16 , "scryptjanenf16" }, // NOT used + { AlgorithmType.ScryptJaneNf16_UNUSED , "scryptjanenf16" }, // NOT used { AlgorithmType.Blake256r8 , "blake256r8" }, { AlgorithmType.Blake256r14 , "blake256r14" }, { AlgorithmType.Blake256r8vnl , "blake256r8vnl" }, diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index 66ae789..d23365a 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -65,6 +65,8 @@ public int MinerRestartDelayMS { public BenchmarkTimeLimitsConfig BenchmarkTimeLimits { get; set; } public DeviceDetectionConfig DeviceDetection { get; set; } + + public bool DisableAMDTempControl { get; set; } public bool AutoScaleBTCValues { get; set; } public bool StartMiningWhenIdle { get; set; } @@ -146,6 +148,7 @@ public void SetDefaults() { MinimizeToTray = false; BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); DeviceDetection = new DeviceDetectionConfig(); + DisableAMDTempControl = false; AutoScaleBTCValues = true; StartMiningWhenIdle = false; LogToFile = true; @@ -238,6 +241,8 @@ protected override void InitializeObject() { ApiBindPortPoolStart = _file.ApiBindPortPoolStart; MinimumProfit = _file.MinimumProfit; + DisableAMDTempControl = _file.DisableAMDTempControl; + DownloadInit = _file.DownloadInit; hwidLoadFromFile = true; diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 7531b87..f059f3a 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -211,7 +211,6 @@ public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { var setAlgo = this.DeviceBenchmarkConfig.AlgorithmSettings[copyAlgSpeeds.Key]; setAlgo.BenchmarkSpeed = copyAlgSpeeds.Value.BenchmarkSpeed; setAlgo.ExtraLaunchParameters = copyAlgSpeeds.Value.ExtraLaunchParameters; - setAlgo.Intensity = copyAlgSpeeds.Value.Intensity; setAlgo.LessThreads = copyAlgSpeeds.Value.LessThreads; } } diff --git a/NiceHashMiner/Enums/MinerOptionFlagType.cs b/NiceHashMiner/Enums/MinerOptionFlagType.cs new file mode 100644 index 0000000..84c18bc --- /dev/null +++ b/NiceHashMiner/Enums/MinerOptionFlagType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Enums { + // indicates if uni flag (no parameter), single param or multi param + public enum MinerOptionFlagType { + Uni, + SingleParam, + MultiParam + } +} diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs new file mode 100644 index 0000000..bf088ae --- /dev/null +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Enums { + public enum MinerOptionType { + NONE, + // ccminer, sgminer + Intensity, + // sgminer + KeccakUnroll, + HamsiExpandBig, + Nfactor, + Xintensity, + Rawintensity, + ThreadConcurrency, + Worksize, + GpuThreads, + LookupGap, + RemoveDisabled, + // sgminer temp + GpuFan, + TempCutoff, + TempOverheat, + TempTarget, + AutoFan, + AutoGpu, + // ccminer cryptonight + Ccminer_CryptoNightLaunch, + Ccminer_CryptoNightBfactor, + Ccminer_CryptoNightBsleep, + // OCL ethminer + Ethminer_OCL_LocalWork, + Ethminer_OCL_GlobalWork, + // CUDA ethminer + } +} diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.Designer.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.Designer.cs index 9dd39e4..b015f1b 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.Designer.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.Designer.cs @@ -30,7 +30,6 @@ private void InitializeComponent() { this.groupBoxExtraLaunchParameters = new System.Windows.Forms.GroupBox(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.richTextBoxExtraLaunchParameters = new System.Windows.Forms.RichTextBox(); - this.fieldIntensity = new NiceHashMiner.Forms.Components.Field(); this.groupBoxSelectedAlgorithmSettings.SuspendLayout(); this.flowLayoutPanel1.SuspendLayout(); this.groupBoxExtraLaunchParameters.SuspendLayout(); @@ -50,7 +49,6 @@ private void InitializeComponent() { // flowLayoutPanel1 // this.flowLayoutPanel1.Controls.Add(this.field_LessThreads); - this.flowLayoutPanel1.Controls.Add(this.fieldIntensity); this.flowLayoutPanel1.Controls.Add(this.fieldBoxBenchmarkSpeed); this.flowLayoutPanel1.Controls.Add(this.groupBoxExtraLaunchParameters); this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; @@ -77,7 +75,7 @@ private void InitializeComponent() { this.fieldBoxBenchmarkSpeed.BackColor = System.Drawing.Color.Transparent; this.fieldBoxBenchmarkSpeed.EntryText = ""; this.fieldBoxBenchmarkSpeed.LabelText = "Benchmark Speed (H/s):"; - this.fieldBoxBenchmarkSpeed.Location = new System.Drawing.Point(3, 109); + this.fieldBoxBenchmarkSpeed.Location = new System.Drawing.Point(3, 56); this.fieldBoxBenchmarkSpeed.Name = "fieldBoxBenchmarkSpeed"; this.fieldBoxBenchmarkSpeed.Size = new System.Drawing.Size(220, 47); this.fieldBoxBenchmarkSpeed.TabIndex = 1; @@ -86,7 +84,7 @@ private void InitializeComponent() { // this.groupBoxExtraLaunchParameters.Controls.Add(this.pictureBox1); this.groupBoxExtraLaunchParameters.Controls.Add(this.richTextBoxExtraLaunchParameters); - this.groupBoxExtraLaunchParameters.Location = new System.Drawing.Point(3, 162); + this.groupBoxExtraLaunchParameters.Location = new System.Drawing.Point(3, 109); this.groupBoxExtraLaunchParameters.Name = "groupBoxExtraLaunchParameters"; this.groupBoxExtraLaunchParameters.Size = new System.Drawing.Size(217, 101); this.groupBoxExtraLaunchParameters.TabIndex = 14; @@ -112,17 +110,6 @@ private void InitializeComponent() { this.richTextBoxExtraLaunchParameters.TabIndex = 0; this.richTextBoxExtraLaunchParameters.Text = ""; // - // fieldIntensity - // - this.fieldIntensity.AutoSize = true; - this.fieldIntensity.BackColor = System.Drawing.Color.Transparent; - this.fieldIntensity.EntryText = ""; - this.fieldIntensity.LabelText = "Intensity:"; - this.fieldIntensity.Location = new System.Drawing.Point(3, 56); - this.fieldIntensity.Name = "fieldIntensity"; - this.fieldIntensity.Size = new System.Drawing.Size(220, 47); - this.fieldIntensity.TabIndex = 16; - // // AlgorithmSettingsControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -149,6 +136,5 @@ private void InitializeComponent() { private Field fieldBoxBenchmarkSpeed; private Field field_LessThreads; private System.Windows.Forms.PictureBox pictureBox1; - private Field fieldIntensity; } } diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index 783bdfe..6d1f25e 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -21,11 +21,11 @@ public partial class AlgorithmSettingsControl : UserControl, AlgorithmsListView. public AlgorithmSettingsControl() { InitializeComponent(); fieldBoxBenchmarkSpeed.SetInputModeDoubleOnly(); - fieldIntensity.SetInputModeDoubleOnly(); + //fieldIntensity.SetInputModeDoubleOnly(); field_LessThreads.SetInputModeIntOnly(); // TODO make sure intensity accepts valid ints based on Device and algo, miner... - fieldIntensity.SetOnTextLeave(textLeaveIntensity); + //fieldIntensity.SetOnTextLeave(textLeaveIntensity); field_LessThreads.SetOnTextLeave(LessThreads_Leave); fieldBoxBenchmarkSpeed.SetOnTextChanged(textChangedBenchmarkSpeed); richTextBoxExtraLaunchParameters.TextChanged += textChangedExtraLaunchParameters; @@ -38,7 +38,7 @@ public void Deselect() { International.GetText("AlgorithmsListView_GroupBox_NONE")); Enabled = false; fieldBoxBenchmarkSpeed.EntryText = ""; - fieldIntensity.EntryText = ""; + //fieldIntensity.EntryText = ""; field_LessThreads.EntryText = ""; richTextBoxExtraLaunchParameters.Text = ""; } @@ -47,9 +47,9 @@ public void InitLocale(ToolTip toolTip1) { field_LessThreads.InitLocale(toolTip1, International.GetText("Form_Settings_General_CPU_LessThreads") + ":", International.GetText("Form_Settings_ToolTip_CPU_LessThreads")); - fieldIntensity.InitLocale(toolTip1, - International.GetText("AlgorithmSettingsControl_Label_Intensity") + ":", - International.GetText("AlgorithmSettingsControl_ToolTip_Intensity")); + //fieldIntensity.InitLocale(toolTip1, + // International.GetText("AlgorithmSettingsControl_Label_Intensity") + ":", + // International.GetText("AlgorithmSettingsControl_ToolTip_Intensity")); fieldBoxBenchmarkSpeed.InitLocale(toolTip1, International.GetText("Form_Settings_Algo_BenchmarkSpeed") + ":", International.GetText("Form_Settings_ToolTip_AlgoBenchmarkSpeed")); @@ -82,21 +82,21 @@ public void SetCurrentlySelected(ListViewItem lvi, ComputeDevice computeDevice) algorithm.NiceHashName); ; - // no intensity for cpu miners and ccminer_cryptonight - fieldIntensity.Enabled = !( - _computeDevice.DeviceGroupType == DeviceGroupType.CPU - || _computeDevice.DeviceGroupType == DeviceGroupType.AMD_OpenCL - || _currentlySelectedAlgorithm.NiceHashID == AlgorithmType.CryptoNight - || _currentlySelectedAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto); - if (fieldIntensity.Enabled) { - if (algorithm.Intensity == 0) { - fieldIntensity.EntryText = "0"; - } else { - fieldIntensity.EntryText = algorithm.Intensity.ToString("F8"); - } - } else { - fieldIntensity.EntryText = ""; - } + //// no intensity for cpu miners and ccminer_cryptonight + //fieldIntensity.Enabled = !( + // _computeDevice.DeviceGroupType == DeviceGroupType.CPU + // || _computeDevice.DeviceGroupType == DeviceGroupType.AMD_OpenCL + // || _currentlySelectedAlgorithm.NiceHashID == AlgorithmType.CryptoNight + // || _currentlySelectedAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto); + //if (fieldIntensity.Enabled) { + // if (algorithm.Intensity == 0) { + // fieldIntensity.EntryText = "0"; + // } else { + // fieldIntensity.EntryText = algorithm.Intensity.ToString("F8"); + // } + //} else { + // fieldIntensity.EntryText = ""; + //} field_LessThreads.Enabled = _computeDevice.DeviceGroupType == DeviceGroupType.CPU; if (field_LessThreads.Enabled) { @@ -122,33 +122,33 @@ private bool CanEdit() { #region Callbacks Events // TODO Intensity - private void textLeaveIntensity(object sender, EventArgs e) { - if (!CanEdit()) return; - var deviceType = _computeDevice.DeviceGroupType; - var minerPath = MinersManager.Instance.MinerPathChecker[deviceType].GetOptimizedMinerPath(_currentlySelectedAlgorithm.NiceHashID); - if (MinersManager.Instance.CCMinersIntensitiesBoundries.ContainsKey(minerPath)) { - double min = MinersManager.Instance.CCMinersIntensitiesBoundries[minerPath].Item1; - double max = MinersManager.Instance.CCMinersIntensitiesBoundries[minerPath].Item2; - // parse - double value; - if (Double.TryParse(fieldIntensity.EntryText, out value)) { - if (min <= value && value <= max) { - _currentlySelectedAlgorithm.Intensity = value; - } else if (value != 0) { - _currentlySelectedAlgorithm.Intensity = 0; - MessageBox.Show( - String.Format(International.GetText("AlgorithmSettingsControl_IntensityWaringn"), - min.ToString("F2"), - max.ToString("F2")), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } else { - _currentlySelectedAlgorithm.Intensity = 0; - } - //_currentlySelectedAlgorithm.Intensity = fieldIntensity.EntryText.Trim(); - } - } + //private void textLeaveIntensity(object sender, EventArgs e) { + // if (!CanEdit()) return; + // var deviceType = _computeDevice.DeviceGroupType; + // var minerPath = MinersManager.Instance.MinerPathChecker[deviceType].GetOptimizedMinerPath(_currentlySelectedAlgorithm.NiceHashID); + // if (MinersManager.Instance.CCMinersIntensitiesBoundries.ContainsKey(minerPath)) { + // double min = MinersManager.Instance.CCMinersIntensitiesBoundries[minerPath].Item1; + // double max = MinersManager.Instance.CCMinersIntensitiesBoundries[minerPath].Item2; + // // parse + // double value; + // if (Double.TryParse(fieldIntensity.EntryText, out value)) { + // if (min <= value && value <= max) { + // _currentlySelectedAlgorithm.Intensity = value; + // } else if (value != 0) { + // _currentlySelectedAlgorithm.Intensity = 0; + // MessageBox.Show( + // String.Format(International.GetText("AlgorithmSettingsControl_IntensityWaringn"), + // min.ToString("F2"), + // max.ToString("F2")), + // International.GetText("Warning_with_Exclamation"), + // MessageBoxButtons.OK, MessageBoxIcon.Warning); + // } + // } else { + // _currentlySelectedAlgorithm.Intensity = 0; + // } + // //_currentlySelectedAlgorithm.Intensity = fieldIntensity.EntryText.Trim(); + // } + //} private void textChangedBenchmarkSpeed(object sender, EventArgs e) { if (!CanEdit()) return; double value; diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs new file mode 100644 index 0000000..9fe4df2 --- /dev/null +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -0,0 +1,246 @@ +using NiceHashMiner.Configs; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners { + static class ExtraLaunchParametersParser { + private static readonly string TAG = "ExtraLaunchParametersParser"; + + // Order of miner options tpyes is important make sure to implement it corectly + // ccminer + private static List _ccimerOptions = new List() { + new MinerOption(MinerOptionType.Intensity, "-i", "--intensity=", "0") + }; + // ccminer CryptoNight + private static List _ccimerCryptoNightOptions = new List() { + new MinerOption(MinerOptionType.Ccminer_CryptoNightLaunch, "-l", "--launch=", "8x40"), + new MinerOption(MinerOptionType.Ccminer_CryptoNightBfactor, "", "--bfactor=", "0"), + new MinerOption(MinerOptionType.Ccminer_CryptoNightBsleep, "", "--bsleep=", "0") // TODO check default + }; + // OCL ethminer + private static List _oclEthminerOptions = new List() { + new MinerOption(MinerOptionType.Ethminer_OCL_LocalWork, "", "--cl-local-work", "64"), + new MinerOption(MinerOptionType.Ethminer_OCL_GlobalWork, "", "--cl-global-work", "262144"), + }; + + // sgminer + private static List _sgminerOptions = new List() { + // SingleParam + new MinerOption(MinerOptionType.KeccakUnroll, "", "--keccak-unroll", "0", MinerOptionFlagType.SingleParam), + new MinerOption(MinerOptionType.HamsiExpandBig, "", "--hamsi-expand-big", "4", MinerOptionFlagType.SingleParam), + new MinerOption(MinerOptionType.Nfactor, "", "--nfactor", "10", MinerOptionFlagType.SingleParam), + // MultiParam TODO IMPORTANT check defaults + new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "-1"), // default is "d" check if -1 works + new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1"), + new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1"), + new MinerOption(MinerOptionType.ThreadConcurrency, "", "--thread-concurrency", "-1"), + new MinerOption(MinerOptionType.Worksize, "-w", "--worksize", "-1"), + new MinerOption(MinerOptionType.GpuThreads, "-g", "--gpu-threads", "1"), + new MinerOption(MinerOptionType.LookupGap, "", "--lookup-gap", "-1"), + // Uni + new MinerOption(MinerOptionType.RemoveDisabled, "", "--remove-disabled", null, MinerOptionFlagType.Uni), + }; + private static List _sgminerTemperatureOptions = new List() { + // temperature stuff + new MinerOption(MinerOptionType.GpuFan, "", "--gpu-fan", "-1"), // default none + new MinerOption(MinerOptionType.TempCutoff, "", "--temp-cutoff", "95"), + new MinerOption(MinerOptionType.TempOverheat, "", "--temp-overheat", "85"), + new MinerOption(MinerOptionType.TempTarget, "", "--temp-target", "75"), + new MinerOption(MinerOptionType.AutoFan, "", "--auto-fan", null, MinerOptionFlagType.Uni), + new MinerOption(MinerOptionType.AutoGpu, "", "--auto-gpu", null, MinerOptionFlagType.Uni) + }; + + private static string Parse(List CDevs, List options, bool useIfDefaults = false) { + List optionsOrder = new List(); + Dictionary paramsFlags = new Dictionary(); + Dictionary> cdevOptions = new Dictionary>(); + + // init devs options, and defaults + foreach (var cDev in CDevs) { + var defaults = new Dictionary(); + foreach (var option in options) { + defaults.Add(option.Type, option.Default); + } + cdevOptions.Add(cDev.UUID, defaults); + } + // init order and params flags, and params list + foreach (var option in options) { + MinerOptionType optionType = option.Type; + optionsOrder.Add(optionType); + paramsFlags.Add(optionType, option.LongName); + } + // parse + foreach (var cDev in CDevs) { + Helpers.ConsolePrint(TAG, String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", cDev.MostProfitableAlgorithm.ExtraLaunchParameters, cDev.UUID)); + var parameters = cDev.MostProfitableAlgorithm.ExtraLaunchParameters.Replace("=", "= ").Split(' '); + + MinerOptionType currentFlag = MinerOptionType.NONE; + foreach (var param in parameters) { + if (param.Equals("")) { // skip + continue; + } else if (currentFlag == MinerOptionType.NONE) { + bool isIngored = true; + foreach (var option in options) { + if (param.Equals(option.ShortName) || param.Equals(option.LongName)) { + isIngored = false; + if (option.FlagType == MinerOptionFlagType.Uni) { + cdevOptions[cDev.UUID][option.Type] = "notNull"; // if Uni param is null it is not present + } else { // Sinlge and Multi param + currentFlag = option.Type; + } + } + } + if (isIngored) { // ignored + Helpers.ConsolePrint(TAG, String.Format("Cannot parse \"{0}\", not supported or wrong extra launch parameter settings", param)); + } + } else if (currentFlag != MinerOptionType.NONE) { + cdevOptions[cDev.UUID][currentFlag] = param; + currentFlag = MinerOptionType.NONE; + } else { // problem + Helpers.ConsolePrint(TAG, String.Format("Cannot parse \"{0}\", not supported or wrong extra launch parameter settings", param)); + } + } + } + + string retVal = ""; + + // check if is all defaults + bool isAllDefault = true; + foreach (var cDev in CDevs) { + foreach (var option in options) { + if (option.Default != cdevOptions[cDev.UUID][option.Type]) { + isAllDefault = false; + break; + } + } + if (!isAllDefault) break; + } + + if (!isAllDefault || useIfDefaults) { + foreach (var option in options) { + if(option.FlagType == MinerOptionFlagType.Uni) { + // uni params if one exist use or all must exist? + bool isOptionInUse = false; + foreach (var cDev in CDevs) { + if (cdevOptions[cDev.UUID][option.Type] != null) { + isOptionInUse = true; + break; + } + } + if (isOptionInUse) { + retVal += String.Format(" {0}", option.LongName); + } + } else if(option.FlagType == MinerOptionFlagType.MultiParam) { + List values = new List(); + foreach (var cDev in CDevs) { + values.Add(cdevOptions[cDev.UUID][option.Type]); + } + string MASK = " {0} {1}"; + if(option.LongName.Contains('=')) { + MASK = " {0}{1}"; + } + retVal += String.Format(MASK, option.LongName, string.Join(option.Separator, values)); + } else if (option.FlagType == MinerOptionFlagType.SingleParam) { + HashSet values = new HashSet(); + foreach (var cDev in CDevs) { + values.Add(cdevOptions[cDev.UUID][option.Type]); + } + string setValue = option.Default; + if (values.Count == 1) { + setValue = values.First(); + } + string MASK = " {0} {1}"; + if (option.LongName.Contains('=')) { + MASK = " {0}{1}"; + } + retVal += String.Format(MASK, option.LongName, setValue); + } + } + } + + Helpers.ConsolePrint(TAG, String.Format("Final extra launch params parse \"{0}\"", retVal)); + + return retVal; + } + + public static string ParseForCDevs(List CDevs, AlgorithmType algorithmType, DeviceType deviceType) { + if (deviceType == DeviceType.NVIDIA) { + if (algorithmType != AlgorithmType.DaggerHashimoto && algorithmType != AlgorithmType.CryptoNight) { + return Parse(CDevs, _ccimerOptions); + } else if (algorithmType == AlgorithmType.CryptoNight) { + return Parse(CDevs, _ccimerCryptoNightOptions); + } else { // ethminer dagger + return ""; // TODO + } + } else if (deviceType == DeviceType.AMD) { + if (algorithmType != AlgorithmType.DaggerHashimoto) { + string temperatureControl = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl ? "" : Parse(CDevs, _sgminerTemperatureOptions, true); + return String.Format("{0} {1}", Parse(CDevs, _sgminerOptions), temperatureControl); + } else { // ethminer dagger + return ""; // TODO + } + } + + return ""; + } + + + // testing + private static List CreateFakeCDevs(List algos) { + List CDevs = new List(); + int uuid = 0; + foreach (var algo in algos) { + ++uuid; + ComputeDevice cDev = new ComputeDevice(0, "", String.Format("device_{0}", uuid.ToString()), uuid.ToString()); + cDev.MostProfitableAlgorithm = algo; + CDevs.Add(cDev); + } + return CDevs; + } + + public static string GetCcminer_CryptonightTest() { + List algos = new List() { + new Algorithm(AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x13" }, + new Algorithm(AlgorithmType.CryptoNight, "cryptonight") {ExtraLaunchParameters = "should not be here --bfactor= ssw"}, // no extra launch params + new Algorithm(AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x8" } + }; + return ParseForCDevs(CreateFakeCDevs(algos), AlgorithmType.CryptoNight, DeviceType.NVIDIA); + } + + public static string GetCcminer_CryptonightTest2() { + List algos = new List() { + new Algorithm(AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = "--bsleep= 0 --bfactor= 0 --launch=32x13" }, + new Algorithm(AlgorithmType.CryptoNight, "cryptonight"), // no extra launch params + new Algorithm(AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x8" } + }; + return ParseForCDevs(CreateFakeCDevs(algos), AlgorithmType.CryptoNight, DeviceType.NVIDIA); + } + + public static string Get_NoParamsTest() { + List algos = new List() { + new Algorithm(AlgorithmType.CryptoNight, "cryptonight"), + new Algorithm(AlgorithmType.CryptoNight, "cryptonight"), // no extra launch params + new Algorithm(AlgorithmType.CryptoNight, "cryptonight") + }; + return ParseForCDevs(CreateFakeCDevs(algos), AlgorithmType.CryptoNight, DeviceType.NVIDIA); + } + + public static string Get_SgminerTest() { + List algos = new List() { + new Algorithm(AlgorithmType.X13, "x13") + { ExtraLaunchParameters = AmdGpuDevice.TemperatureParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 64 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam }, + new Algorithm(AlgorithmType.X13, "x13") + { ExtraLaunchParameters = AmdGpuDevice.TemperatureParam + "--nfactor 10 --xintensity 512 --thread-concurrency 128 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam }, + new Algorithm(AlgorithmType.X13, "x13") + { ExtraLaunchParameters = AmdGpuDevice.TemperatureParam + "--nfactor 10 --xintensity 64 --thread-concurrency 64 --worksize 64 --gpu-threads 4" + AmdGpuDevice.TemperatureParam }, + }; + + return ParseForCDevs(CreateFakeCDevs(algos), AlgorithmType.X13, DeviceType.AMD); + } + } +} diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 4e3e28f..33d82bf 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -164,10 +164,6 @@ virtual public void SetCDevs(string[] deviceUUIDs) { CDevs.Sort((a, b) => a.ID - b.ID); } - public void ClearCDevs() { - CDevs.Clear(); - } - // TAG for identifying miner public string MinerTAG() { if (_minetTag == null) { @@ -667,8 +663,6 @@ protected string GetAPIData(int port, string cmd) catch (Exception ex) { return null; - } catch { // all - return null; } return ResponseFromServer; diff --git a/NiceHashMiner/Miners/MinerOption.cs b/NiceHashMiner/Miners/MinerOption.cs new file mode 100644 index 0000000..8d4762f --- /dev/null +++ b/NiceHashMiner/Miners/MinerOption.cs @@ -0,0 +1,25 @@ +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners { + public class MinerOption { + public MinerOption(MinerOptionType iType, string iShortName, string iLongName, string iDefault, MinerOptionFlagType iFlagType = MinerOptionFlagType.MultiParam, string iSeparator = ",") { + this.Type = iType; + this.ShortName = iShortName; + this.LongName = iLongName; + this.Default = iDefault; + this.FlagType = iFlagType; + this.Separator = iSeparator; + } + public readonly MinerOptionType Type; + public readonly string ShortName; + public readonly string LongName; + public readonly string Default; + public readonly MinerOptionFlagType FlagType; + public readonly string Separator; + } +} diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index e36d7fe..84af288 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -412,13 +412,13 @@ private bool IsAlgorithmSettingsSame(Algorithm a, Algorithm b) { #if (SWITCH_TESTING) && (!ForcePerCardMiners) // this will force individual miners #endif - && SafeStrCompare(a.ExtraLaunchParameters, b.ExtraLaunchParameters); +; } - private bool SafeStrCompare(string a, string b) { - if (string.IsNullOrEmpty(a) == true && string.IsNullOrEmpty(a) == string.IsNullOrEmpty(b)) return true; - return a == b; - } + //private bool SafeStrCompare(string a, string b) { + // if (string.IsNullOrEmpty(a) == true && string.IsNullOrEmpty(a) == string.IsNullOrEmpty(b)) return true; + // return a == b; + //} private bool IsNvidiaDevice(ComputeDevice a) { foreach (var type in _nvidiaTypes) { diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index ed8164a..518d058 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -30,7 +30,8 @@ protected string getIntensityString() { List intensityString = new List(); bool ignore = true; foreach (var cdev in CDevs) { - double intensity = cdev.DeviceBenchmarkConfig.AlgorithmSettings[CurrentAlgorithmType].Intensity; + // TODO refactoring ExtraLaunchParameters + double intensity = 0; // cdev.DeviceBenchmarkConfig.AlgorithmSettings[CurrentAlgorithmType].Intensity; if (intensity < 8.0d) { // all have minimum of 8 intensityString.Add("0"); } else { diff --git a/NiceHashMiner/Miners/ccminer_sm6x.cs b/NiceHashMiner/Miners/ccminer_sm6x.cs index 7e5f8ae..7af0409 100644 --- a/NiceHashMiner/Miners/ccminer_sm6x.cs +++ b/NiceHashMiner/Miners/ccminer_sm6x.cs @@ -12,9 +12,7 @@ namespace NiceHashMiner.Miners { class ccminer_sm6x : ccminer_sm5x { public ccminer_sm6x() : base("NVIDIA6.x") - { - Path = MinerPaths.ccminer_nanashi; - } + { } } } diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index b492b41..0224301 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -104,6 +104,8 @@ + + UserControl @@ -177,12 +179,14 @@ + + From 0bbff86e324787fc81e2c04e10b79a40c216fc8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 20 Sep 2016 13:50:08 +0200 Subject: [PATCH 025/366] sgminer, ccminer, ccminer_cryptonight parsing --- .../Configs/DeviceBenchmarkConfig.cs | 5 --- .../Miners/ExtraLaunchParametersParser.cs | 35 +++++++++-------- NiceHashMiner/Miners/Miner.cs | 8 ++-- NiceHashMiner/Miners/MinerEtherum.cs | 6 +-- NiceHashMiner/Miners/MinerEtherumCUDA.cs | 14 +++++-- NiceHashMiner/Miners/MinerEtherumOCL.cs | 14 +++++-- NiceHashMiner/Miners/ccminer.cs | 38 ++++++------------- NiceHashMiner/Miners/cpuminer.cs | 19 +++++++--- NiceHashMiner/Miners/sgminer.cs | 14 +++++-- 9 files changed, 85 insertions(+), 68 deletions(-) diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs index 9a76c8b..8bacc65 100644 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs +++ b/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs @@ -106,11 +106,6 @@ protected override void InitializeObject() { foreach (var key in _file.AlgorithmSettings.Keys) { if(this.AlgorithmSettings.ContainsKey(key)) { this.AlgorithmSettings[key] = _file.AlgorithmSettings[key]; - // AMD extra params fix - if (this.AlgorithmSettings[key].ExtraLaunchParameters.Contains(AmdGpuDevice.TemperatureParam)) { - this.AlgorithmSettings[key].ExtraLaunchParameters = this.AlgorithmSettings[key].ExtraLaunchParameters.Replace(AmdGpuDevice.TemperatureParam, ""); - this.AlgorithmSettings[key].ExtraLaunchParameters = this.AlgorithmSettings[key].ExtraLaunchParameters + AmdGpuDevice.TemperatureParam; - } } else { // TODO think if we let tamnpered data } diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index 9fe4df2..21553d3 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -18,7 +18,7 @@ static class ExtraLaunchParametersParser { }; // ccminer CryptoNight private static List _ccimerCryptoNightOptions = new List() { - new MinerOption(MinerOptionType.Ccminer_CryptoNightLaunch, "-l", "--launch=", "8x40"), + new MinerOption(MinerOptionType.Ccminer_CryptoNightLaunch, "-l", "--launch=", "0"), // default is 8x40 new MinerOption(MinerOptionType.Ccminer_CryptoNightBfactor, "", "--bfactor=", "0"), new MinerOption(MinerOptionType.Ccminer_CryptoNightBsleep, "", "--bsleep=", "0") // TODO check default }; @@ -35,19 +35,18 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.HamsiExpandBig, "", "--hamsi-expand-big", "4", MinerOptionFlagType.SingleParam), new MinerOption(MinerOptionType.Nfactor, "", "--nfactor", "10", MinerOptionFlagType.SingleParam), // MultiParam TODO IMPORTANT check defaults - new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "-1"), // default is "d" check if -1 works - new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1"), - new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1"), - new MinerOption(MinerOptionType.ThreadConcurrency, "", "--thread-concurrency", "-1"), - new MinerOption(MinerOptionType.Worksize, "-w", "--worksize", "-1"), + new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d"), // default is "d" check if -1 works + new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1"), // default none + new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1"), // default none + new MinerOption(MinerOptionType.ThreadConcurrency, "", "--thread-concurrency", "-1"), // default none + new MinerOption(MinerOptionType.Worksize, "-w", "--worksize", "-1"), // default none new MinerOption(MinerOptionType.GpuThreads, "-g", "--gpu-threads", "1"), - new MinerOption(MinerOptionType.LookupGap, "", "--lookup-gap", "-1"), + new MinerOption(MinerOptionType.LookupGap, "", "--lookup-gap", "-1"), // default none // Uni - new MinerOption(MinerOptionType.RemoveDisabled, "", "--remove-disabled", null, MinerOptionFlagType.Uni), }; private static List _sgminerTemperatureOptions = new List() { // temperature stuff - new MinerOption(MinerOptionType.GpuFan, "", "--gpu-fan", "-1"), // default none + new MinerOption(MinerOptionType.GpuFan, "", "--gpu-fan", "30-60"), // default none new MinerOption(MinerOptionType.TempCutoff, "", "--temp-cutoff", "95"), new MinerOption(MinerOptionType.TempOverheat, "", "--temp-overheat", "85"), new MinerOption(MinerOptionType.TempTarget, "", "--temp-target", "75"), @@ -56,10 +55,11 @@ static class ExtraLaunchParametersParser { }; private static string Parse(List CDevs, List options, bool useIfDefaults = false) { + const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); Dictionary paramsFlags = new Dictionary(); Dictionary> cdevOptions = new Dictionary>(); - + Dictionary isOptionDefaults = new Dictionary(); // init devs options, and defaults foreach (var cDev in CDevs) { var defaults = new Dictionary(); @@ -73,6 +73,7 @@ private static string Parse(List CDevs, List options MinerOptionType optionType = option.Type; optionsOrder.Add(optionType); paramsFlags.Add(optionType, option.LongName); + isOptionDefaults.Add(option.Type, true); } // parse foreach (var cDev in CDevs) { @@ -96,13 +97,13 @@ private static string Parse(List CDevs, List options } } if (isIngored) { // ignored - Helpers.ConsolePrint(TAG, String.Format("Cannot parse \"{0}\", not supported or wrong extra launch parameter settings", param)); + Helpers.ConsolePrint(TAG, String.Format(IGNORE_PARAM, param)); } } else if (currentFlag != MinerOptionType.NONE) { cdevOptions[cDev.UUID][currentFlag] = param; currentFlag = MinerOptionType.NONE; } else { // problem - Helpers.ConsolePrint(TAG, String.Format("Cannot parse \"{0}\", not supported or wrong extra launch parameter settings", param)); + Helpers.ConsolePrint(TAG, String.Format(IGNORE_PARAM, param)); } } } @@ -115,15 +116,15 @@ private static string Parse(List CDevs, List options foreach (var option in options) { if (option.Default != cdevOptions[cDev.UUID][option.Type]) { isAllDefault = false; - break; + isOptionDefaults[option.Type] = false; } } - if (!isAllDefault) break; } if (!isAllDefault || useIfDefaults) { foreach (var option in options) { - if(option.FlagType == MinerOptionFlagType.Uni) { + if (!isOptionDefaults[option.Type] || useIfDefaults) { // if options all default ignore + if(option.FlagType == MinerOptionFlagType.Uni) { // uni params if one exist use or all must exist? bool isOptionInUse = false; foreach (var cDev in CDevs) { @@ -160,6 +161,7 @@ private static string Parse(List CDevs, List options } retVal += String.Format(MASK, option.LongName, setValue); } + } } } @@ -173,7 +175,7 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo if (algorithmType != AlgorithmType.DaggerHashimoto && algorithmType != AlgorithmType.CryptoNight) { return Parse(CDevs, _ccimerOptions); } else if (algorithmType == AlgorithmType.CryptoNight) { - return Parse(CDevs, _ccimerCryptoNightOptions); + return Parse(CDevs, _ccimerCryptoNightOptions, true); } else { // ethminer dagger return ""; // TODO } @@ -184,6 +186,7 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo } else { // ethminer dagger return ""; // TODO } + } else if (deviceType == DeviceType.CPU) { } return ""; diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 33d82bf..ee9fb38 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -311,13 +311,15 @@ public int BenchmarkTimeoutInSeconds(int timeInSeconds) { return timeInSeconds + 120; // wait time plus two minutes } - abstract protected string BenchmarkCreateCommandLine(ComputeDevice benchmarkDevice, Algorithm algorithm, int time); + abstract protected string BenchmarkCreateCommandLine(Algorithm algorithm, int time); // The benchmark config and algorithm must guarantee that they are compatible with miner // we guarantee algorithm is supported // we will not have empty benchmark configs, all benchmark configs will have device list virtual public void BenchmarkStart(ComputeDevice benchmarkDevice, Algorithm algorithm, int time, IBenchmarkComunicator benchmarkComunicator) { - + // for extra launch parameters parsing purposes + benchmarkDevice.MostProfitableAlgorithm = algorithm; + BenchmarkComunicator = benchmarkComunicator; BenchmarkAlgorithm = algorithm; BenchmarkTimeInSeconds = time; @@ -327,7 +329,7 @@ virtual public void BenchmarkStart(ComputeDevice benchmarkDevice, Algorithm algo OnBenchmarkCompleteCalled = false; BenchmarkTimeOutStopWatch = null; - string CommandLine = BenchmarkCreateCommandLine(benchmarkDevice, algorithm, time); + string CommandLine = BenchmarkCreateCommandLine(algorithm, time); Thread BenchmarkThread = new Thread(BenchmarkThreadRoutine); BenchmarkThread.Start(CommandLine); diff --git a/NiceHashMiner/Miners/MinerEtherum.cs b/NiceHashMiner/Miners/MinerEtherum.cs index a31a771..a997c87 100644 --- a/NiceHashMiner/Miners/MinerEtherum.cs +++ b/NiceHashMiner/Miners/MinerEtherum.cs @@ -41,7 +41,7 @@ protected override void InitSupportedMinerAlgorithms() { } protected abstract string GetStartCommandStringPart(Algorithm miningAlgorithm, string url, string username); - protected abstract string GetBenchmarkCommandStringPart(ComputeDevice benchmarkDevice, Algorithm algorithm); + protected abstract string GetBenchmarkCommandStringPart(Algorithm algorithm); protected override string GetDevicesCommandString() { string deviceStringCommand = " "; @@ -93,8 +93,8 @@ public override void Start(Algorithm miningAlgorithm, string url, string usernam } } - protected override string BenchmarkCreateCommandLine(ComputeDevice benchmarkDevice, Algorithm algorithm, int time) { - string CommandLine = GetBenchmarkCommandStringPart(benchmarkDevice, algorithm) + GetDevicesCommandString(); + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + string CommandLine = GetBenchmarkCommandStringPart(algorithm) + GetDevicesCommandString(); Ethereum.GetCurrentBlock(CurrentBlockString); CommandLine += " --benchmark " + Ethereum.CurrentBlockNum; diff --git a/NiceHashMiner/Miners/MinerEtherumCUDA.cs b/NiceHashMiner/Miners/MinerEtherumCUDA.cs index e5e0c10..7c07de1 100644 --- a/NiceHashMiner/Miners/MinerEtherumCUDA.cs +++ b/NiceHashMiner/Miners/MinerEtherumCUDA.cs @@ -38,16 +38,24 @@ public override void Start(Algorithm miningAlgorithm, string url, string usernam protected override string GetStartCommandStringPart(Algorithm miningAlgorithm, string url, string username) { return " --cuda" - + " " + miningAlgorithm.ExtraLaunchParameters + + " " + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + AlgorithmType.DaggerHashimoto, + DeviceType.NVIDIA) + " -S " + url.Substring(14) + " -O " + username + ":" + Algorithm.PasswordDefault + " --api-port " + APIPort.ToString() + " --cuda-devices "; } - protected override string GetBenchmarkCommandStringPart(ComputeDevice benchmarkDevice, Algorithm algorithm) { + protected override string GetBenchmarkCommandStringPart(Algorithm algorithm) { return " --benchmark-warmup 40 --benchmark-trial 20" - + " " + algorithm.ExtraLaunchParameters + + " " + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + AlgorithmType.DaggerHashimoto, + DeviceType.NVIDIA) + " --cuda --cuda-devices "; } diff --git a/NiceHashMiner/Miners/MinerEtherumOCL.cs b/NiceHashMiner/Miners/MinerEtherumOCL.cs index 79c5bfe..420035b 100644 --- a/NiceHashMiner/Miners/MinerEtherumOCL.cs +++ b/NiceHashMiner/Miners/MinerEtherumOCL.cs @@ -45,16 +45,24 @@ protected override string GetStartCommandStringPart(Algorithm miningAlgorithm, s // set directory WorkingDirectory = ""; return " --opencl --opencl-platform " + GPUPlatformNumber - + " " + miningAlgorithm.ExtraLaunchParameters + + " " + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + AlgorithmType.DaggerHashimoto, + DeviceType.AMD) + " -S " + url.Substring(14) + " -O " + username + ":" + Algorithm.PasswordDefault + " --api-port " + APIPort.ToString() + " --opencl-devices "; } - protected override string GetBenchmarkCommandStringPart(ComputeDevice benchmarkDevice, Algorithm algorithm) { + protected override string GetBenchmarkCommandStringPart(Algorithm algorithm) { return " --opencl --opencl-platform " + GPUPlatformNumber - + " " + algorithm.ExtraLaunchParameters + + " " + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + AlgorithmType.DaggerHashimoto, + DeviceType.AMD) + " --benchmark-warmup 40 --benchmark-trial 20" + " --opencl-devices "; } diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index 518d058..bf47687 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -26,25 +26,6 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { return 60 * 1000; // 1 minute max, whole waiting time 75seconds } - protected string getIntensityString() { - List intensityString = new List(); - bool ignore = true; - foreach (var cdev in CDevs) { - // TODO refactoring ExtraLaunchParameters - double intensity = 0; // cdev.DeviceBenchmarkConfig.AlgorithmSettings[CurrentAlgorithmType].Intensity; - if (intensity < 8.0d) { // all have minimum of 8 - intensityString.Add("0"); - } else { - intensityString.Add(intensity.ToString("F8")); - ignore = false; - } - } - if (!ignore && intensityString.Count > 0) { - return "--intensity="+string.Join(",", intensityString); - } - return ""; - } - public override void Start(Algorithm miningAlgorithm, string url, string username) { CurrentMiningAlgorithm = miningAlgorithm; @@ -52,11 +33,9 @@ public override void Start(Algorithm miningAlgorithm, string url, string usernam string algo = ""; string apiBind = ""; - string intensity = ""; if (CurrentMiningAlgorithm.NiceHashID != AlgorithmType.CryptoNight) { algo = "--algo=" + miningAlgorithm.MinerName; apiBind = " --api-bind=" + APIPort.ToString(); - intensity = getIntensityString(); } IsAPIReadException = CurrentMiningAlgorithm.NiceHashID == AlgorithmType.CryptoNight; @@ -64,9 +43,11 @@ public override void Start(Algorithm miningAlgorithm, string url, string usernam LastCommandLine = algo + " --url=" + url + " --userpass=" + username + ":" + Algorithm.PasswordDefault + - apiBind + - " " + miningAlgorithm.ExtraLaunchParameters + - intensity + + apiBind + " " + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + CurrentMiningAlgorithm.NiceHashID, + DeviceType.NVIDIA) + " --devices "; LastCommandLine += GetDevicesCommandString(); @@ -87,12 +68,15 @@ protected override bool UpdateBindPortCommand(int oldPort, int newPort) { // new decoupled benchmarking routines #region Decoupled benchmarking routines - protected override string BenchmarkCreateCommandLine(ComputeDevice benchmarkDevice, Algorithm algorithm, int time) { + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { string timeLimit = algorithm.NiceHashID == AlgorithmType.CryptoNight ? "" : " --time-limit " + time.ToString(); string CommandLine = " --algo=" + algorithm.MinerName + " --benchmark" + - timeLimit + - " " + algorithm.ExtraLaunchParameters + + timeLimit + " " + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + algorithm.NiceHashID, + DeviceType.NVIDIA) + " --devices "; CommandLine += GetDevicesCommandString(); diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index 5bb9c2a..e004f91 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -130,8 +130,13 @@ public override void Start(Algorithm miningAlgorithm, string url, string usernam LastCommandLine = "--algo=" + miningAlgorithm.MinerName + " --url=" + url + " --userpass=" + username + ":" + Algorithm.PasswordDefault + - " --threads=" + GetThreads(miningAlgorithm.LessThreads).ToString() + - " " + miningAlgorithm.ExtraLaunchParameters + + // TODO IMPORTANT HANDLE + //" --threads=" + GetThreads(miningAlgorithm.LessThreads).ToString() + + //" " + miningAlgorithm.ExtraLaunchParameters + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + CurrentMiningAlgorithm.NiceHashID, + DeviceType.CPU) + " --api-bind=" + APIPort.ToString(); ProcessHandle = _Start(); @@ -168,7 +173,7 @@ private int GetThreads(int LessThreads) { // new decoupled benchmarking routines #region Decoupled benchmarking routines - protected override string BenchmarkCreateCommandLine(ComputeDevice benchmarkDevice, Algorithm algorithm, int time) { + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { // to set miner paths InitializeMinerPaths(); @@ -176,8 +181,12 @@ protected override string BenchmarkCreateCommandLine(ComputeDevice benchmarkDevi return "--algo=" + algorithm.MinerName + " --benchmark" + - " --threads=" + GetThreads(algorithm.LessThreads).ToString() + - " " + algorithm.ExtraLaunchParameters + + //" --threads=" + GetThreads(algorithm.LessThreads).ToString() + + //" " + algorithm.ExtraLaunchParameters + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + algorithm.NiceHashID, + DeviceType.CPU) + " --time-limit " + time.ToString(); } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index b14a861..ca53f30 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -89,7 +89,11 @@ public override void Start(Algorithm miningAlgorithm, string url, string usernam " --userpass=" + username + ":" + Algorithm.PasswordDefault + " --api-listen" + " --api-port=" + APIPort.ToString() + - " " + miningAlgorithm.ExtraLaunchParameters + + " " + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + CurrentMiningAlgorithm.NiceHashID, + DeviceType.AMD) + " --device "; LastCommandLine += GetDevicesCommandString(); @@ -131,7 +135,7 @@ public override string GetOptimizedMinerPath(AlgorithmType type, string gpuCoden // new decoupled benchmarking routines #region Decoupled benchmarking routines - protected override string BenchmarkCreateCommandLine(ComputeDevice benchmarkDevice, Algorithm algorithm, int time) { + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { string CommandLine; Path = "cmd"; string MinerPath = GetOptimizedMinerPath(algorithm.NiceHashID, CommonGpuCodenameSetting, EnableOptimizedVersion); @@ -156,7 +160,11 @@ protected override string BenchmarkCreateCommandLine(ComputeDevice benchmarkDevi " --userpass=" + username + ":" + Algorithm.PasswordDefault + " --sched-stop " + DateTime.Now.AddSeconds(time).ToString("HH:mm") + " -T --log 10 --log-file dump.txt" + - " " + algorithm.ExtraLaunchParameters + + " " + + ExtraLaunchParametersParser.ParseForCDevs( + CDevs, + algorithm.NiceHashID, + DeviceType.AMD) + " --device "; CommandLine += GetDevicesCommandString(); From 1f4d3d64951fa47ca4ab51228baad3eac9e58ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 20 Sep 2016 14:14:50 +0200 Subject: [PATCH 026/366] Main Form resizing fix --- NiceHashMiner/Forms/Form_Main.Designer.cs | 9 +++++---- NiceHashMiner/Forms/Form_Main.cs | 12 ++++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.Designer.cs b/NiceHashMiner/Forms/Form_Main.Designer.cs index 6b09f8a..0ff3af5 100644 --- a/NiceHashMiner/Forms/Form_Main.Designer.cs +++ b/NiceHashMiner/Forms/Form_Main.Designer.cs @@ -129,7 +129,7 @@ private void InitializeComponent() this.toolStripStatusLabelBalanceDollarText, this.toolStripStatusLabelBalanceDollarValue, this.toolStripStatusLabel10}); - this.statusStrip1.Location = new System.Drawing.Point(0, 345); + this.statusStrip1.Location = new System.Drawing.Point(0, 266); this.statusStrip1.Name = "statusStrip1"; this.statusStrip1.Size = new System.Drawing.Size(565, 25); this.statusStrip1.TabIndex = 8; @@ -323,7 +323,7 @@ private void InitializeComponent() this.flowLayoutPanelRates.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; this.flowLayoutPanelRates.Location = new System.Drawing.Point(3, 16); this.flowLayoutPanelRates.Name = "flowLayoutPanelRates"; - this.flowLayoutPanelRates.Size = new System.Drawing.Size(536, 123); + this.flowLayoutPanelRates.Size = new System.Drawing.Size(536, 40); this.flowLayoutPanelRates.TabIndex = 107; this.flowLayoutPanelRates.WrapContents = false; // @@ -333,7 +333,7 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.flowLayoutPanelRates); this.groupBox1.Location = new System.Drawing.Point(11, 202); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(542, 142); + this.groupBox1.Size = new System.Drawing.Size(542, 59); this.groupBox1.TabIndex = 108; this.groupBox1.TabStop = false; this.groupBox1.Text = "Group/Device Rates:"; @@ -352,6 +352,7 @@ private void InitializeComponent() // devicesListViewEnableControl1 // this.devicesListViewEnableControl1.AutoSaveChange = false; + this.devicesListViewEnableControl1.BenchmarkCalculation = null; this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; this.devicesListViewEnableControl1.IsInBenchmark = false; this.devicesListViewEnableControl1.IsMining = false; @@ -366,7 +367,7 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(565, 370); + this.ClientSize = new System.Drawing.Size(565, 291); this.Controls.Add(this.devicesListViewEnableControl1); this.Controls.Add(this.groupBox1); this.Controls.Add(this.labelDemoMode); diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 52df1b2..11834d4 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -45,6 +45,9 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; + const int MINIMUM_HEIGHT = 330 - 50; + const int MINIMUM_WIDTH = 581; + const string _betaAlphaPostfixString = ""; @@ -399,13 +402,14 @@ public void ClearRates(int groupCount) { ++hideIndex; } } + flowLayoutPanelRatesIndex = 0; + int visibleGroupCount = groupCount + 1; + if (visibleGroupCount <= 0) visibleGroupCount = 1; var oldHeight = groupBox1.Size.Height; - flowLayoutPanelRatesIndex = 0; - if (groupCount < 0) groupCount = 0; - groupBox1.Size = new Size(groupBox1.Size.Width, (groupCount + 1) * 40); + groupBox1.Size = new Size(groupBox1.Size.Width, (visibleGroupCount) * 40); // set new height - this.Size = new Size(this.Size.Width, this.Size.Height - (oldHeight - groupBox1.Size.Height)); + this.Size = new Size(MINIMUM_WIDTH, MINIMUM_HEIGHT + groupBox1.Size.Height); } public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPIData, double paying, bool isApiGetException) { From a4dcc0a5c621382f889bc3f3a575276765d5e1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 20 Sep 2016 16:19:52 +0200 Subject: [PATCH 027/366] add old ccminer benchmark parser --- NiceHashMiner/Miners/Miner.cs | 54 ++++++++++++++------------------- NiceHashMiner/Miners/ccminer.cs | 7 ++++- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 4e3e28f..bff0bd9 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -367,16 +367,6 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { return BenchmarkHandle; } - - private string ElapsedTimeString(long timeMillies) { - if (timeMillies < 1000) { - return timeMillies.ToString() + " milliseconds"; - } else if (timeMillies < 60 * 1000) { - return (timeMillies / 1000).ToString() + " seconds"; - } - return (timeMillies / (60 * 1000)).ToString() + " minutes"; - } - private void BenchmarkOutputErrorDataReceived(object sender, DataReceivedEventArgs e) { if (BenchmarkTimeOutStopWatch == null) { BenchmarkTimeOutStopWatch = new Stopwatch(); @@ -426,28 +416,28 @@ protected void CheckOutdata(string outdata) { } } - //protected double BenchmarkParseLine_cpu_ccminer_extra(string outdata) { - // // parse line - // if (outdata.Contains("Benchmark: ") && outdata.Contains("/s")) { - // int i = outdata.IndexOf("Benchmark:"); - // int k = outdata.IndexOf("/s"); - // string hashspeed = outdata.Substring(i + 11, k - i - 9); - // Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + hashspeed); - - // // save speed - // int b = hashspeed.IndexOf(" "); - // double spd = Double.Parse(hashspeed.Substring(0, b), CultureInfo.InvariantCulture); - // if (hashspeed.Contains("kH/s")) - // spd *= 1000; - // else if (hashspeed.Contains("MH/s")) - // spd *= 1000000; - // else if (hashspeed.Contains("GH/s")) - // spd *= 1000000000; - - // return spd; - // } - // return 0.0d; - //} + protected double BenchmarkParseLine_cpu_ccminer_extra(string outdata) { + // parse line + if (outdata.Contains("Benchmark: ") && outdata.Contains("/s")) { + int i = outdata.IndexOf("Benchmark:"); + int k = outdata.IndexOf("/s"); + string hashspeed = outdata.Substring(i + 11, k - i - 9); + Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + hashspeed); + + // save speed + int b = hashspeed.IndexOf(" "); + double spd = Double.Parse(hashspeed.Substring(0, b), CultureInfo.InvariantCulture); + if (hashspeed.Contains("kH/s")) + spd *= 1000; + else if (hashspeed.Contains("MH/s")) + spd *= 1000000; + else if (hashspeed.Contains("GH/s")) + spd *= 1000000000; + + return spd; + } + return 0.0d; + } // killing proccesses can take time virtual public void EndBenchmarkProcces() { diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index ed8164a..1186faa 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -138,7 +138,12 @@ protected override bool BenchmarkParseLine(string outdata) { } } - double lastSpeed = 0; + double lastSpeed = BenchmarkParseLine_cpu_ccminer_extra(outdata); + if (lastSpeed > 0.0d) { + BenchmarkAlgorithm.BenchmarkSpeed = lastSpeed; + return true; + } + if (double.TryParse(outdata, out lastSpeed)) { BenchmarkAlgorithm.BenchmarkSpeed = lastSpeed; return true; From 4b93ab4eefbcce89896a423cb4634d4c47b3f233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 20 Sep 2016 16:46:35 +0200 Subject: [PATCH 028/366] Select first compute device in Benchmark and Settings form --- NiceHashMiner/Forms/Form_Benchmark.cs | 32 ++++++--------------------- NiceHashMiner/Forms/Form_Settings.cs | 6 +++++ 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 172e5db..46bbe7c 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -136,6 +136,13 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm devicesListViewEnableControl1.BenchmarkCalculation = this; algorithmsListView1.BenchmarkCalculation = this; + + // set first device selected { + if (ComputeDevice.AllAvaliableDevices.Count > 0) { + var firstComputedevice = ComputeDevice.AllAvaliableDevices[0]; + algorithmsListView1.SetAlgorithms(firstComputedevice, firstComputedevice.ComputeDeviceEnabledOption.IsEnabled); + } + if (autostart) { ExitWhenFinished = true; StartStopBtn_Click(null, null); @@ -502,30 +509,6 @@ private void CloseBtn_Click(object sender, EventArgs e) { this.Close(); } - //private void radioButton_SelectedUnbenchmarked_CheckedChanged(object sender, EventArgs e) { - // _algorithmOption = AlgorithmBenchmarkSettingsType.SelectedUnbenchmarkedAlgorithms; - // CalcBenchmarkDevicesAlgorithmQueue(); - // devicesListViewEnableControl1.ResetListItemColors(); - //} - - //private void radioButton_Unbenchmarked_CheckedChanged(object sender, EventArgs e) { - // _algorithmOption = AlgorithmBenchmarkSettingsType.UnbenchmarkedAlgorithms; - // CalcBenchmarkDevicesAlgorithmQueue(); - // devicesListViewEnableControl1.ResetListItemColors(); - //} - - //private void radioButton_ReOnlySelected_CheckedChanged(object sender, EventArgs e) { - // _algorithmOption = AlgorithmBenchmarkSettingsType.ReBecnhSelectedAlgorithms; - // CalcBenchmarkDevicesAlgorithmQueue(); - // devicesListViewEnableControl1.ResetListItemColors(); - //} - - //private void radioButton_All_CheckedChanged(object sender, EventArgs e) { - // _algorithmOption = AlgorithmBenchmarkSettingsType.AllAlgorithms; - // CalcBenchmarkDevicesAlgorithmQueue(); - // devicesListViewEnableControl1.ResetListItemColors(); - //} - private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e) { if (_inBenchmark) { e.Cancel = true; @@ -561,7 +544,6 @@ private void devicesListView1_ItemSelectionChanged(object sender, ListViewItemSe // show algorithms var _selectedComputeDevice = ComputeDevice.GetCurrentlySelectedComputeDevice(e.ItemIndex, true); algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); - //groupBoxAlgorithmSettings.Text = String.Format("Algorithm settings for {0} :", _selectedComputeDevice.Name); } private void radioButton_SelectedUnbenchmarked_CheckedChanged_1(object sender, EventArgs e) { diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 75a8a38..cc38fed 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -65,6 +65,12 @@ public Form_Settings() { //algorithmsListView1.RemoveRatioRates(); + // set first device selected { + if (ComputeDevice.AllAvaliableDevices.Count > 0) { + var firstComputedevice = ComputeDevice.AllAvaliableDevices[0]; + algorithmsListView1.SetAlgorithms(firstComputedevice, firstComputedevice.ComputeDeviceEnabledOption.IsEnabled); + } + // At the very end set to true _isInitFinished = true; } From 179aa64bc499845c6a430ced0631be9f1f47e025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 20 Sep 2016 20:29:54 +0200 Subject: [PATCH 029/366] added CPU parsing, sgminer intesity parsing WIP --- NiceHashMiner/Devices/ComputeDevice.cs | 11 +- NiceHashMiner/Enums/MinerOptionType.cs | 5 + .../Miners/ExtraLaunchParametersParser.cs | 127 ++++++++++++++---- NiceHashMiner/Miners/MinersManager.cs | 25 ---- NiceHashMiner/Miners/cpuminer.cs | 9 +- 5 files changed, 116 insertions(+), 61 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index f059f3a..2a540aa 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -37,6 +37,14 @@ public class ComputeDevice // UUID now used for saving readonly public string UUID; + // Current Extra Launch Parameters copied from most profitable algorithm for benchmarking + [JsonIgnore] + public string CurrentExtraLaunchParameters { get; set; } + + // CPU, NVIDIA, AMD + [JsonIgnore] + readonly public int Threads; + // CPU, NVIDIA, AMD [JsonIgnore] public DeviceType DeviceType { get; private set; } @@ -109,11 +117,12 @@ private void InitGlobalsList(bool addToGlobalList) { } // CPU - public ComputeDevice(int id, string group, string name, bool addToGlobalList = false, bool enabled = true) + public ComputeDevice(int id, string group, string name, int threads, bool addToGlobalList = false, bool enabled = true) { ID = id; Group = group; Name = name; + Threads = threads; _nameNoNums = name; Enabled = enabled; DeviceGroupType = GroupNames.GetType(Group); diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index bf088ae..051d439 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -35,5 +35,10 @@ public enum MinerOptionType { Ethminer_OCL_LocalWork, Ethminer_OCL_GlobalWork, // CUDA ethminer + // TODO + // cpuminer + Threads, + CpuAffinity, + CpuPriority } } diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index 21553d3..8429f92 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -54,6 +54,13 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.AutoGpu, "", "--auto-gpu", null, MinerOptionFlagType.Uni) }; + private static List _cpuminerOptions = new List() { + // temperature stuff + new MinerOption(MinerOptionType.Threads, "-t", "--threads=", "-1"), // default none + new MinerOption(MinerOptionType.CpuAffinity, "", "--cpu-affinity", "-1"), // default none + new MinerOption(MinerOptionType.CpuPriority, "", "--cpu-priority", "-1"), // default none + }; + private static string Parse(List CDevs, List options, bool useIfDefaults = false) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); @@ -77,8 +84,8 @@ private static string Parse(List CDevs, List options } // parse foreach (var cDev in CDevs) { - Helpers.ConsolePrint(TAG, String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", cDev.MostProfitableAlgorithm.ExtraLaunchParameters, cDev.UUID)); - var parameters = cDev.MostProfitableAlgorithm.ExtraLaunchParameters.Replace("=", "= ").Split(' '); + Helpers.ConsolePrint(TAG, String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", cDev.CurrentExtraLaunchParameters, cDev.UUID)); + var parameters = cDev.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' '); MinerOptionType currentFlag = MinerOptionType.NONE; foreach (var param in parameters) { @@ -136,31 +143,31 @@ private static string Parse(List CDevs, List options if (isOptionInUse) { retVal += String.Format(" {0}", option.LongName); } - } else if(option.FlagType == MinerOptionFlagType.MultiParam) { - List values = new List(); - foreach (var cDev in CDevs) { - values.Add(cdevOptions[cDev.UUID][option.Type]); - } - string MASK = " {0} {1}"; - if(option.LongName.Contains('=')) { - MASK = " {0}{1}"; - } - retVal += String.Format(MASK, option.LongName, string.Join(option.Separator, values)); - } else if (option.FlagType == MinerOptionFlagType.SingleParam) { - HashSet values = new HashSet(); - foreach (var cDev in CDevs) { - values.Add(cdevOptions[cDev.UUID][option.Type]); - } - string setValue = option.Default; - if (values.Count == 1) { - setValue = values.First(); - } - string MASK = " {0} {1}"; - if (option.LongName.Contains('=')) { - MASK = " {0}{1}"; + } else if(option.FlagType == MinerOptionFlagType.MultiParam) { + List values = new List(); + foreach (var cDev in CDevs) { + values.Add(cdevOptions[cDev.UUID][option.Type]); + } + string MASK = " {0} {1}"; + if(option.LongName.Contains('=')) { + MASK = " {0}{1}"; + } + retVal += String.Format(MASK, option.LongName, string.Join(option.Separator, values)); + } else if (option.FlagType == MinerOptionFlagType.SingleParam) { + HashSet values = new HashSet(); + foreach (var cDev in CDevs) { + values.Add(cdevOptions[cDev.UUID][option.Type]); + } + string setValue = option.Default; + if (values.Count == 1) { + setValue = values.First(); + } + string MASK = " {0} {1}"; + if (option.LongName.Contains('=')) { + MASK = " {0}{1}"; + } + retVal += String.Format(MASK, option.LongName, setValue); } - retVal += String.Format(MASK, option.LongName, setValue); - } } } } @@ -170,30 +177,96 @@ private static string Parse(List CDevs, List options return retVal; } + public static string ParseForCDevs(List CDevs, AlgorithmType algorithmType, DeviceType deviceType) { + // init cdevs extra launch parameters + foreach (var cDev in CDevs) { + cDev.CurrentExtraLaunchParameters = cDev.MostProfitableAlgorithm.ExtraLaunchParameters; + } + // parse for device if (deviceType == DeviceType.NVIDIA) { if (algorithmType != AlgorithmType.DaggerHashimoto && algorithmType != AlgorithmType.CryptoNight) { return Parse(CDevs, _ccimerOptions); } else if (algorithmType == AlgorithmType.CryptoNight) { return Parse(CDevs, _ccimerCryptoNightOptions, true); } else { // ethminer dagger + Helpers.ConsolePrint(TAG, "ExtraLaunch params ethminer CUDA not implemented"); + if (CDevs.Count > 0) { + return CDevs.First().MostProfitableAlgorithm.ExtraLaunchParameters; + } return ""; // TODO } } else if (deviceType == DeviceType.AMD) { if (algorithmType != AlgorithmType.DaggerHashimoto) { + // rawIntensity overrides xintensity, xintensity overrides intensity + var sgminer_intensities = new List() { + new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d"), // default is "d" check if -1 works + new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1"), // default none + new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1"), // default none + }; + var contains_intensity = new Dictionary() { + { MinerOptionType.Intensity, false }, + { MinerOptionType.Xintensity, false }, + { MinerOptionType.Rawintensity, false }, + }; + // check intensity and xintensity, the latter overrides so change accordingly + foreach (var cDev in CDevs) { + foreach (var intensityOption in sgminer_intensities) { + if (cDev.CurrentExtraLaunchParameters.Contains(intensityOption.ShortName)) { + cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace(intensityOption.ShortName, intensityOption.LongName); + contains_intensity[intensityOption.Type] = true; + } + if (cDev.CurrentExtraLaunchParameters.Contains(intensityOption.LongName)) { + contains_intensity[intensityOption.Type] = true; + } + } + } + // TODO IMPORTANT + //// replace + //MinerOptionType prevKey = MinerOptionType.NONE; + //foreach (var intensityOption in sgminer_intensities) { + // if (prevKey != MinerOptionType.NONE) { + // foreach (var cDev in CDevs) { + // cDev.CurrentExtraLaunchParameters + // } + // } + // prevKey = intensityOption.Type; + //} + + // temp control and parse string temperatureControl = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl ? "" : Parse(CDevs, _sgminerTemperatureOptions, true); return String.Format("{0} {1}", Parse(CDevs, _sgminerOptions), temperatureControl); } else { // ethminer dagger + Helpers.ConsolePrint(TAG, "ExtraLaunch params ethminer AMD not implemented"); + if (CDevs.Count > 0) { + return CDevs.First().MostProfitableAlgorithm.ExtraLaunchParameters; + } return ""; // TODO } } else if (deviceType == DeviceType.CPU) { + foreach (var cDev in CDevs) { + // extra thread check + if (cDev.CurrentExtraLaunchParameters.Contains("--threads=") || cDev.CurrentExtraLaunchParameters.Contains("-t")) { + // nothing + } else { // add threads params mandatory + cDev.CurrentExtraLaunchParameters += " --threads=" + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); + } + } + return Parse(CDevs, _cpuminerOptions); } return ""; } + private static int GetThreads(int Threads, int LessThreads) { + if (Threads > LessThreads) { + return Threads - LessThreads; + } + return Threads; + } + - // testing + /////////////////////////////////////////////////////////////////// testing private static List CreateFakeCDevs(List algos) { List CDevs = new List(); int uuid = 0; diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 84af288..868b916 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -464,31 +464,6 @@ private bool IsGroupBinaryAndAlgorithmSame(ComputeDevice a, ComputeDevice b) { } #endregion //Groupping logic - //private string GetDevProfitString(string deviceName, Dictionary deviceProfits) { - // StringBuilder stringBuilder = new StringBuilder(); - // stringBuilder.AppendLine(String.Format("\tProfits for {0}:", deviceName)); - // // TODO make parameter - // int MAX_NAME_LEN = "daggerhashimoto".Length; - // foreach (var kvp in deviceProfits) { - // string name = AlgorithmNiceHashNames.GetName(kvp.Key); - // string namePreaty = name + new String(' ', MAX_NAME_LEN - name.Length); - // stringBuilder.AppendLine(String.Format("\t\t{0}\t:\t{1},", - // namePreaty, - // kvp.Value.ToString(DOUBLE_FORMAT))); - // } - - // return stringBuilder.ToString(); - //} - - //private string GetProfitsSummery(PerDeviceProifitDictionary devProfits) { - // StringBuilder stringBuilder = new StringBuilder(); - // stringBuilder.AppendLine("Current device profits:"); - // foreach (var kvp in devProfits) { - // stringBuilder.AppendLine(GetDevProfitString(kvp.Key, kvp.Value)); - // } - // return stringBuilder.ToString(); - //} - /// /// SwichMostProfitable should check the best combination for most profit. /// Calculate profit for each supported algorithm per device group. diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index e004f91..985acdc 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -22,7 +22,7 @@ public cpuminer(int id, int threads, ulong affinity) // if our CPU is supported add it to devices // TODO if Miner and ComputeDevice decoupling redo this this is going to be at detecting CPUs if (isInitialized) { - CDevs.Add(new ComputeDevice(0, MinerDeviceName, CPUID.GetCPUName().Trim(), true)); + CDevs.Add(new ComputeDevice(0, MinerDeviceName, CPUID.GetCPUName().Trim(), Threads, true)); } } @@ -163,13 +163,6 @@ protected override bool UpdateBindPortCommand(int oldPort, int newPort) { return UpdateBindPortCommand_ccminer_cpuminer(oldPort, newPort); } - private int GetThreads(int LessThreads) { - if (Threads > LessThreads) { - return Threads - LessThreads; - } - return Threads; - } - // new decoupled benchmarking routines #region Decoupled benchmarking routines From 2ab6bda5512f4cb6fcaa107fe8e273492624b7d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 20 Sep 2016 20:53:39 +0200 Subject: [PATCH 030/366] sgminer correct intensity hangling --- .../Miners/ExtraLaunchParametersParser.cs | 24 ++++++++++--------- NiceHashMiner/Miners/cpuminer.cs | 5 ---- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index 8429f92..643ebee 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -221,17 +221,19 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo } } } - // TODO IMPORTANT - //// replace - //MinerOptionType prevKey = MinerOptionType.NONE; - //foreach (var intensityOption in sgminer_intensities) { - // if (prevKey != MinerOptionType.NONE) { - // foreach (var cDev in CDevs) { - // cDev.CurrentExtraLaunchParameters - // } - // } - // prevKey = intensityOption.Type; - //} + + // replace + if(contains_intensity[MinerOptionType.Intensity] && contains_intensity[MinerOptionType.Xintensity]) { + foreach (var cDev in CDevs) { + cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--intensity", "--xintensity"); + } + } + if (contains_intensity[MinerOptionType.Xintensity] && contains_intensity[MinerOptionType.Rawintensity]) { + foreach (var cDev in CDevs) { + cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--xintensity", "--rawintensity"); + } + } + // temp control and parse string temperatureControl = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl ? "" : Parse(CDevs, _sgminerTemperatureOptions, true); diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index 985acdc..7c520f1 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -130,9 +130,6 @@ public override void Start(Algorithm miningAlgorithm, string url, string usernam LastCommandLine = "--algo=" + miningAlgorithm.MinerName + " --url=" + url + " --userpass=" + username + ":" + Algorithm.PasswordDefault + - // TODO IMPORTANT HANDLE - //" --threads=" + GetThreads(miningAlgorithm.LessThreads).ToString() + - //" " + miningAlgorithm.ExtraLaunchParameters + ExtraLaunchParametersParser.ParseForCDevs( CDevs, CurrentMiningAlgorithm.NiceHashID, @@ -174,8 +171,6 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti return "--algo=" + algorithm.MinerName + " --benchmark" + - //" --threads=" + GetThreads(algorithm.LessThreads).ToString() + - //" " + algorithm.ExtraLaunchParameters + ExtraLaunchParametersParser.ParseForCDevs( CDevs, algorithm.NiceHashID, From 8711f43c6b249ff4a7c0739583908e771ae0389a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 20 Sep 2016 22:19:35 +0200 Subject: [PATCH 031/366] removed unused code, extra localization settings to invariant --- NiceHashMiner/Forms/Components/AlgorithmsListView.cs | 5 ----- NiceHashMiner/Miners/Miner.cs | 1 + NiceHashMiner/Program.cs | 3 +++ NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 5ef6e34..00b11df 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -84,11 +84,6 @@ public void InitLocale() { listViewAlgorithms.Columns[RATE].Text = International.GetText("AlgorithmsListView_Rate"); } - //public void RemoveRatioRates() { - // listViewAlgorithms.Columns.RemoveAt(RATE); - // listViewAlgorithms.Columns.RemoveAt(RATIO); - //} - public void SetAlgorithms(ComputeDevice computeDevice, bool isEnabled) { _computeDevice = computeDevice; var config = computeDevice.DeviceBenchmarkConfig; diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index bff0bd9..c7fc61d 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -338,6 +338,7 @@ virtual public void BenchmarkStart(ComputeDevice benchmarkDevice, Algorithm algo } virtual protected Process BenchmarkStartProcess(string CommandLine) { + Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; Helpers.ConsolePrint(MinerTAG(), "Starting benchmark: " + CommandLine); Process BenchmarkHandle = new Process(); diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index 6781a4c..814af4e 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -22,6 +22,9 @@ static void Main(string[] argv) Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); + + CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; //Console.OutputEncoding = System.Text.Encoding.Unicode; // #0 set this first so data parsing will work correctly diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 3a74553..610d888 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.1.3")] -[assembly: AssemblyFileVersion("1.7.1.3")] +[assembly: AssemblyVersion("1.7.1.4")] +[assembly: AssemblyFileVersion("1.7.1.4")] From 30a8b4c4e24415e4ab7b651756fe05506153bced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 10:46:32 +0200 Subject: [PATCH 032/366] added new cpu miners --- NiceHashMiner/Enums/CPUExtensionType.cs | 11 ++-- .../Forms/Components/AlgorithmsListView.cs | 6 +-- NiceHashMiner/Forms/Form_Settings.Designer.cs | 50 ++++++++++--------- NiceHashMiner/Miners/MinerPaths.cs | 10 ++-- NiceHashMiner/Miners/cpuminer.cs | 39 +++++++++------ NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- NiceHashMiner/Utils/BINS_CODEGEN.cs | 9 ++-- NiceHashMiner/Utils/MinersDownloadManager.cs | 3 +- 8 files changed, 73 insertions(+), 59 deletions(-) diff --git a/NiceHashMiner/Enums/CPUExtensionType.cs b/NiceHashMiner/Enums/CPUExtensionType.cs index eb09588..dce216e 100644 --- a/NiceHashMiner/Enums/CPUExtensionType.cs +++ b/NiceHashMiner/Enums/CPUExtensionType.cs @@ -5,11 +5,12 @@ namespace NiceHashMiner.Enums { public enum CPUExtensionType : int { - // 0 - automatic, 1 - AVX2, 2 - AVX, 3 - AES, 4 - SSE2 Automatic = 0, - AVX2 = 1, - AVX = 2, - AES = 3, - SSE2 = 4 + AVX2_AES = 1, + AVX2 = 2, + AVX_AES = 3, + AVX = 4, + AES = 5, + SSE2 = 6, } } diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 00b11df..5900a31 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -91,8 +91,6 @@ public void SetAlgorithms(ComputeDevice computeDevice, bool isEnabled) { listViewAlgorithms.Items.Clear(); foreach (var alg in config.AlgorithmSettings) { ListViewItem lvi = new ListViewItem(); - lvi.Checked = !alg.Value.Skip; - //lvi.Text = alg.Value.NiceHashName; ListViewItem.ListViewSubItem sub = lvi.SubItems.Add(alg.Value.NiceHashName); //sub.Tag = alg.Value; @@ -100,12 +98,10 @@ public void SetAlgorithms(ComputeDevice computeDevice, bool isEnabled) { lvi.SubItems.Add(alg.Value.CurPayingRatio); lvi.SubItems.Add(alg.Value.CurPayingRate); lvi.Tag = alg.Value; - _listItemCheckColorSetter.LviSetColor(lvi); + lvi.Checked = !alg.Value.Skip; listViewAlgorithms.Items.Add(lvi); } listViewAlgorithms.EndUpdate(); - ResetListItemColors(); - listViewAlgorithms.Invalidate(true); this.Enabled = isEnabled; } diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 9ac504e..1de87d6 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -29,6 +29,7 @@ private void InitializeComponent() { this.tabControlGeneral = new System.Windows.Forms.TabControl(); this.tabPageGeneral = new System.Windows.Forms.TabPage(); this.groupBox_Misc = new System.Windows.Forms.GroupBox(); + this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); this.checkBox_HideMiningWindows = new System.Windows.Forms.CheckBox(); this.checkBox_MinimizeToTray = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDetectionNVidia6X = new System.Windows.Forms.CheckBox(); @@ -43,6 +44,7 @@ private void InitializeComponent() { this.pictureBox_DisableDetectionNVidia3X = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableDetectionNVidia5X = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableDetectionNVidia6X = new System.Windows.Forms.PictureBox(); + this.pictureBox_AutoStartMining = new System.Windows.Forms.PictureBox(); this.pictureBox_MinimizeToTray = new System.Windows.Forms.PictureBox(); this.pictureBox_HideMiningWindows = new System.Windows.Forms.PictureBox(); this.checkBox_DisableDetectionNVidia3X = new System.Windows.Forms.CheckBox(); @@ -128,8 +130,6 @@ private void InitializeComponent() { this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.pictureBox_AutoStartMining = new System.Windows.Forms.PictureBox(); - this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); @@ -143,6 +143,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia3X)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia5X)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia6X)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinimizeToTray)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_HideMiningWindows)).BeginInit(); this.groupBox_Logging.SuspendLayout(); @@ -173,7 +174,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -241,6 +241,16 @@ private void InitializeComponent() { this.groupBox_Misc.TabStop = false; this.groupBox_Misc.Text = "Misc:"; // + // checkBox_AutoStartMining + // + this.checkBox_AutoStartMining.AutoSize = true; + this.checkBox_AutoStartMining.Location = new System.Drawing.Point(6, 19); + this.checkBox_AutoStartMining.Name = "checkBox_AutoStartMining"; + this.checkBox_AutoStartMining.Size = new System.Drawing.Size(102, 17); + this.checkBox_AutoStartMining.TabIndex = 315; + this.checkBox_AutoStartMining.Text = "Autostart Mining"; + this.checkBox_AutoStartMining.UseVisualStyleBackColor = true; + // // checkBox_HideMiningWindows // this.checkBox_HideMiningWindows.AutoSize = true; @@ -381,6 +391,16 @@ private void InitializeComponent() { this.pictureBox_DisableDetectionNVidia6X.TabIndex = 364; this.pictureBox_DisableDetectionNVidia6X.TabStop = false; // + // pictureBox_AutoStartMining + // + this.pictureBox_AutoStartMining.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(205, 19); + this.pictureBox_AutoStartMining.Name = "pictureBox_AutoStartMining"; + this.pictureBox_AutoStartMining.Size = new System.Drawing.Size(18, 18); + this.pictureBox_AutoStartMining.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_AutoStartMining.TabIndex = 364; + this.pictureBox_AutoStartMining.TabStop = false; + // // pictureBox_MinimizeToTray // this.pictureBox_MinimizeToTray.Image = global::NiceHashMiner.Properties.Resources.info_black_18; @@ -992,7 +1012,9 @@ private void InitializeComponent() { this.comboBox_CPU0_ForceCPUExtension.FormattingEnabled = true; this.comboBox_CPU0_ForceCPUExtension.Items.AddRange(new object[] { "Automatic", + "AVX2_AES", "AVX2", + "AVX_AES", "AVX", "AES", "SSE2"}); @@ -1290,26 +1312,6 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // pictureBox_AutoStartMining - // - this.pictureBox_AutoStartMining.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(205, 19); - this.pictureBox_AutoStartMining.Name = "pictureBox_AutoStartMining"; - this.pictureBox_AutoStartMining.Size = new System.Drawing.Size(18, 18); - this.pictureBox_AutoStartMining.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_AutoStartMining.TabIndex = 364; - this.pictureBox_AutoStartMining.TabStop = false; - // - // checkBox_AutoStartMining - // - this.checkBox_AutoStartMining.AutoSize = true; - this.checkBox_AutoStartMining.Location = new System.Drawing.Point(6, 19); - this.checkBox_AutoStartMining.Name = "checkBox_AutoStartMining"; - this.checkBox_AutoStartMining.Size = new System.Drawing.Size(102, 17); - this.checkBox_AutoStartMining.TabIndex = 315; - this.checkBox_AutoStartMining.Text = "Autostart Mining"; - this.checkBox_AutoStartMining.UseVisualStyleBackColor = true; - // // Form_Settings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1341,6 +1343,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia3X)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia5X)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia6X)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinimizeToTray)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_HideMiningWindows)).EndInit(); this.groupBox_Logging.ResumeLayout(false); @@ -1375,7 +1378,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).EndInit(); this.ResumeLayout(false); } diff --git a/NiceHashMiner/Miners/MinerPaths.cs b/NiceHashMiner/Miners/MinerPaths.cs index 3e81175..0ada488 100644 --- a/NiceHashMiner/Miners/MinerPaths.cs +++ b/NiceHashMiner/Miners/MinerPaths.cs @@ -23,10 +23,12 @@ public static class MinerPaths /// /// cpuminers opt new /// - public const string cpuminer_opt_AVX = _bin + @"\cpuminer_opt_AVX.exe"; - public const string cpuminer_opt_AVX2 = _bin + @"\cpuminer_opt_AVX2.exe"; - public const string cpuminer_opt_SSE2 = _bin + @"\cpuminer_opt_SSE2.exe"; - public const string cpuminer_opt_AES = _bin + @"\cpuminer_opt_AES.exe"; // TODO check + public const string cpuminer_opt_AVX2_AES = _bin + @"\cpuminer_opt_AVX2_AES.exe"; + public const string cpuminer_opt_AVX2 = _bin + @"\cpuminer_opt_AVX2.exe"; + public const string cpuminer_opt_AVX_AES = _bin + @"\cpuminer_opt_AVX_AES.exe"; + public const string cpuminer_opt_AVX = _bin + @"\cpuminer_opt_AVX.exe"; + public const string cpuminer_opt_AES = _bin + @"\cpuminer_opt_AES.exe"; + public const string cpuminer_opt_SSE2 = _bin + @"\cpuminer_opt_SSE2.exe"; /// /// ethminers /// diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index 5bb9c2a..0816b87 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -28,7 +28,14 @@ public cpuminer(int id, int threads, ulong affinity) private bool InitializeMinerPaths() { // this is the order we check and initialize if automatic - CPUExtensionType[] detectOrder = new CPUExtensionType[] { CPUExtensionType.AVX2, CPUExtensionType.AVX, CPUExtensionType.AES, CPUExtensionType.SSE2 }; + CPUExtensionType[] detectOrder = new CPUExtensionType[] { + CPUExtensionType.AVX2_AES, + CPUExtensionType.AVX2, + CPUExtensionType.AVX_AES, + CPUExtensionType.AVX, + CPUExtensionType.AES, + CPUExtensionType.SSE2, + }; // #1 try to initialize with Configured extension bool isInitialized = InitializeMinerPaths(ConfigManager.Instance.GeneralConfig.ForceCPUExtension); @@ -70,18 +77,24 @@ private bool InitializeMinerPaths(CPUExtensionType type) { if (HasExtensionSupport(type)) { isInitialized = true; switch (type) { - case CPUExtensionType.SSE2: - CPUMinerPath = MinerPaths.cpuminer_opt_SSE2; - break; - case CPUExtensionType.AVX: - CPUMinerPath = MinerPaths.cpuminer_opt_AVX; + case CPUExtensionType.AVX2_AES: + CPUMinerPath = MinerPaths.cpuminer_opt_AVX2_AES; break; case CPUExtensionType.AVX2: CPUMinerPath = MinerPaths.cpuminer_opt_AVX2; break; + case CPUExtensionType.AVX_AES: + CPUMinerPath = MinerPaths.cpuminer_opt_AVX_AES; + break; + case CPUExtensionType.AVX: + CPUMinerPath = MinerPaths.cpuminer_opt_AVX; + break; case CPUExtensionType.AES: CPUMinerPath = MinerPaths.cpuminer_opt_AES; break; + case CPUExtensionType.SSE2: + CPUMinerPath = MinerPaths.cpuminer_opt_SSE2; + break; default: // CPUExtensionType.Automatic break; } @@ -100,14 +113,12 @@ public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string /// False if type Automatic otherwise True if supported private bool HasExtensionSupport(CPUExtensionType type) { switch (type) { - case CPUExtensionType.SSE2: - return CPUID.SupportsSSE2() == 1; - case CPUExtensionType.AVX: - return CPUID.SupportsAVX() == 1; - case CPUExtensionType.AVX2: - return CPUID.SupportsAVX2() == 1; - case CPUExtensionType.AES: - return CPUID.SupportsAES() == 1; + case CPUExtensionType.AVX2_AES: return (CPUID.SupportsAVX2() == 1) && (CPUID.SupportsAES() == 1); + case CPUExtensionType.AVX2: return CPUID.SupportsAVX2() == 1; + case CPUExtensionType.AVX_AES: return (CPUID.SupportsAVX() == 1) && (CPUID.SupportsAES() == 1); + case CPUExtensionType.AVX: return CPUID.SupportsAVX() == 1; + case CPUExtensionType.AES: return CPUID.SupportsAES() == 1; + case CPUExtensionType.SSE2: return CPUID.SupportsSSE2() == 1; default: // CPUExtensionType.Automatic break; } diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 610d888..3a74553 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.1.4")] -[assembly: AssemblyFileVersion("1.7.1.4")] +[assembly: AssemblyVersion("1.7.1.3")] +[assembly: AssemblyFileVersion("1.7.1.3")] diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index a56ebbc..7cadbc4 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -8,10 +8,11 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Wed, 21 Sep 2016 11:46:24 +0200 Subject: [PATCH 033/366] return AMD temp control in GUI --- NiceHashMiner/Forms/Form_Settings.Designer.cs | 204 ++++++++++-------- NiceHashMiner/Forms/Form_Settings.cs | 8 + .../Miners/ExtraLaunchParametersParser.cs | 2 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- 4 files changed, 127 insertions(+), 91 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 9ac504e..9c5f236 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -29,6 +29,7 @@ private void InitializeComponent() { this.tabControlGeneral = new System.Windows.Forms.TabControl(); this.tabPageGeneral = new System.Windows.Forms.TabPage(); this.groupBox_Misc = new System.Windows.Forms.GroupBox(); + this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); this.checkBox_HideMiningWindows = new System.Windows.Forms.CheckBox(); this.checkBox_MinimizeToTray = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDetectionNVidia6X = new System.Windows.Forms.CheckBox(); @@ -43,6 +44,7 @@ private void InitializeComponent() { this.pictureBox_DisableDetectionNVidia3X = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableDetectionNVidia5X = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableDetectionNVidia6X = new System.Windows.Forms.PictureBox(); + this.pictureBox_AutoStartMining = new System.Windows.Forms.PictureBox(); this.pictureBox_MinimizeToTray = new System.Windows.Forms.PictureBox(); this.pictureBox_HideMiningWindows = new System.Windows.Forms.PictureBox(); this.checkBox_DisableDetectionNVidia3X = new System.Windows.Forms.CheckBox(); @@ -115,21 +117,21 @@ private void InitializeComponent() { this.textBox_MinerRestartDelayMS = new System.Windows.Forms.TextBox(); this.textBox_MinerAPIQueryInterval = new System.Windows.Forms.TextBox(); this.groupBoxBenchmarkTimeLimits = new System.Windows.Forms.GroupBox(); - this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.tabPageDevicesAlgos = new System.Windows.Forms.TabPage(); - this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); - this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); this.groupBoxAlgorithmSettings = new System.Windows.Forms.GroupBox(); - this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.buttonAllProfit = new System.Windows.Forms.Button(); this.buttonSelectedProfit = new System.Windows.Forms.Button(); this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.pictureBox_AutoStartMining = new System.Windows.Forms.PictureBox(); - this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); + this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); + this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); + this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); + this.checkBox_AMD_DisableAMDTempControl = new System.Windows.Forms.CheckBox(); + this.pictureBox_AMD_DisableAMDTempControl = new System.Windows.Forms.PictureBox(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); @@ -143,6 +145,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia3X)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia5X)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia6X)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinimizeToTray)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_HideMiningWindows)).BeginInit(); this.groupBox_Logging.SuspendLayout(); @@ -173,7 +176,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -208,6 +211,8 @@ private void InitializeComponent() { // // groupBox_Misc // + this.groupBox_Misc.Controls.Add(this.checkBox_AMD_DisableAMDTempControl); + this.groupBox_Misc.Controls.Add(this.pictureBox_AMD_DisableAMDTempControl); this.groupBox_Misc.Controls.Add(this.checkBox_AutoStartMining); this.groupBox_Misc.Controls.Add(this.checkBox_HideMiningWindows); this.groupBox_Misc.Controls.Add(this.checkBox_MinimizeToTray); @@ -236,11 +241,21 @@ private void InitializeComponent() { this.groupBox_Misc.Controls.Add(this.checkBox_ShowDriverVersionWarning); this.groupBox_Misc.Location = new System.Drawing.Point(357, 6); this.groupBox_Misc.Name = "groupBox_Misc"; - this.groupBox_Misc.Size = new System.Drawing.Size(229, 304); + this.groupBox_Misc.Size = new System.Drawing.Size(229, 330); this.groupBox_Misc.TabIndex = 391; this.groupBox_Misc.TabStop = false; this.groupBox_Misc.Text = "Misc:"; // + // checkBox_AutoStartMining + // + this.checkBox_AutoStartMining.AutoSize = true; + this.checkBox_AutoStartMining.Location = new System.Drawing.Point(6, 19); + this.checkBox_AutoStartMining.Name = "checkBox_AutoStartMining"; + this.checkBox_AutoStartMining.Size = new System.Drawing.Size(102, 17); + this.checkBox_AutoStartMining.TabIndex = 315; + this.checkBox_AutoStartMining.Text = "Autostart Mining"; + this.checkBox_AutoStartMining.UseVisualStyleBackColor = true; + // // checkBox_HideMiningWindows // this.checkBox_HideMiningWindows.AutoSize = true; @@ -381,6 +396,16 @@ private void InitializeComponent() { this.pictureBox_DisableDetectionNVidia6X.TabIndex = 364; this.pictureBox_DisableDetectionNVidia6X.TabStop = false; // + // pictureBox_AutoStartMining + // + this.pictureBox_AutoStartMining.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(205, 19); + this.pictureBox_AutoStartMining.Name = "pictureBox_AutoStartMining"; + this.pictureBox_AutoStartMining.Size = new System.Drawing.Size(18, 18); + this.pictureBox_AutoStartMining.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_AutoStartMining.TabIndex = 364; + this.pictureBox_AutoStartMining.TabStop = false; + // // pictureBox_MinimizeToTray // this.pictureBox_MinimizeToTray.Image = global::NiceHashMiner.Properties.Resources.info_black_18; @@ -1151,36 +1176,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.TabStop = false; this.groupBoxBenchmarkTimeLimits.Text = "Benchmark Time Limits:"; // - // benchmarkLimitControlNVIDIA - // - this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; - this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); - this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; - this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlNVIDIA.TabIndex = 4; - this.benchmarkLimitControlNVIDIA.TimeLimits = null; - // - // benchmarkLimitControlCPU - // - this.benchmarkLimitControlCPU.GroupName = "CPU"; - this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); - this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; - this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlCPU.TabIndex = 3; - this.benchmarkLimitControlCPU.TimeLimits = null; - // - // benchmarkLimitControlAMD - // - this.benchmarkLimitControlAMD.GroupName = "AMD"; - this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); - this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; - this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlAMD.TabIndex = 5; - this.benchmarkLimitControlAMD.TimeLimits = null; - // // tabPageDevicesAlgos // this.tabPageDevicesAlgos.Controls.Add(this.devicesListViewEnableControl1); @@ -1196,27 +1191,6 @@ private void InitializeComponent() { this.tabPageDevicesAlgos.Text = "Devices/Algorithms"; this.tabPageDevicesAlgos.UseVisualStyleBackColor = true; // - // devicesListViewEnableControl1 - // - this.devicesListViewEnableControl1.AutoSaveChange = true; - this.devicesListViewEnableControl1.BenchmarkCalculation = null; - this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; - this.devicesListViewEnableControl1.IsInBenchmark = false; - this.devicesListViewEnableControl1.IsMining = false; - this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); - this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; - this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.SetAllEnabled = false; - this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); - this.devicesListViewEnableControl1.TabIndex = 397; - // - // algorithmSettingsControl1 - // - this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); - this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; - this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); - this.algorithmSettingsControl1.TabIndex = 396; - // // groupBoxAlgorithmSettings // this.groupBoxAlgorithmSettings.Controls.Add(this.algorithmsListView1); @@ -1227,16 +1201,6 @@ private void InitializeComponent() { this.groupBoxAlgorithmSettings.TabStop = false; this.groupBoxAlgorithmSettings.Text = "Algorithm settings for selected device:"; // - // algorithmsListView1 - // - this.algorithmsListView1.BenchmarkCalculation = null; - this.algorithmsListView1.ComunicationInterface = null; - this.algorithmsListView1.IsInBenchmark = false; - this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); - this.algorithmsListView1.Name = "algorithmsListView1"; - this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); - this.algorithmsListView1.TabIndex = 2; - // // buttonAllProfit // this.buttonAllProfit.Location = new System.Drawing.Point(364, 6); @@ -1290,25 +1254,86 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // pictureBox_AutoStartMining + // benchmarkLimitControlNVIDIA // - this.pictureBox_AutoStartMining.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(205, 19); - this.pictureBox_AutoStartMining.Name = "pictureBox_AutoStartMining"; - this.pictureBox_AutoStartMining.Size = new System.Drawing.Size(18, 18); - this.pictureBox_AutoStartMining.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_AutoStartMining.TabIndex = 364; - this.pictureBox_AutoStartMining.TabStop = false; + this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; + this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); + this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; + this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlNVIDIA.TabIndex = 4; + this.benchmarkLimitControlNVIDIA.TimeLimits = null; // - // checkBox_AutoStartMining + // benchmarkLimitControlCPU // - this.checkBox_AutoStartMining.AutoSize = true; - this.checkBox_AutoStartMining.Location = new System.Drawing.Point(6, 19); - this.checkBox_AutoStartMining.Name = "checkBox_AutoStartMining"; - this.checkBox_AutoStartMining.Size = new System.Drawing.Size(102, 17); - this.checkBox_AutoStartMining.TabIndex = 315; - this.checkBox_AutoStartMining.Text = "Autostart Mining"; - this.checkBox_AutoStartMining.UseVisualStyleBackColor = true; + this.benchmarkLimitControlCPU.GroupName = "CPU"; + this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); + this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; + this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlCPU.TabIndex = 3; + this.benchmarkLimitControlCPU.TimeLimits = null; + // + // benchmarkLimitControlAMD + // + this.benchmarkLimitControlAMD.GroupName = "AMD"; + this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); + this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; + this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlAMD.TabIndex = 5; + this.benchmarkLimitControlAMD.TimeLimits = null; + // + // devicesListViewEnableControl1 + // + this.devicesListViewEnableControl1.AutoSaveChange = true; + this.devicesListViewEnableControl1.BenchmarkCalculation = null; + this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; + this.devicesListViewEnableControl1.IsInBenchmark = false; + this.devicesListViewEnableControl1.IsMining = false; + this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); + this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; + this.devicesListViewEnableControl1.SaveToGeneralConfig = false; + this.devicesListViewEnableControl1.SetAllEnabled = false; + this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); + this.devicesListViewEnableControl1.TabIndex = 397; + // + // algorithmSettingsControl1 + // + this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); + this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; + this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); + this.algorithmSettingsControl1.TabIndex = 396; + // + // algorithmsListView1 + // + this.algorithmsListView1.BenchmarkCalculation = null; + this.algorithmsListView1.ComunicationInterface = null; + this.algorithmsListView1.IsInBenchmark = false; + this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); + this.algorithmsListView1.Name = "algorithmsListView1"; + this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); + this.algorithmsListView1.TabIndex = 2; + // + // checkBox_AMD_DisableAMDTempControl + // + this.checkBox_AMD_DisableAMDTempControl.AutoSize = true; + this.checkBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(6, 303); + this.checkBox_AMD_DisableAMDTempControl.Name = "checkBox_AMD_DisableAMDTempControl"; + this.checkBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(145, 17); + this.checkBox_AMD_DisableAMDTempControl.TabIndex = 388; + this.checkBox_AMD_DisableAMDTempControl.Text = "DisableAMDTempControl"; + this.checkBox_AMD_DisableAMDTempControl.UseVisualStyleBackColor = true; + // + // pictureBox_AMD_DisableAMDTempControl + // + this.pictureBox_AMD_DisableAMDTempControl.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(205, 303); + this.pictureBox_AMD_DisableAMDTempControl.Name = "pictureBox_AMD_DisableAMDTempControl"; + this.pictureBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(18, 18); + this.pictureBox_AMD_DisableAMDTempControl.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_AMD_DisableAMDTempControl.TabIndex = 387; + this.pictureBox_AMD_DisableAMDTempControl.TabStop = false; // // Form_Settings // @@ -1341,6 +1366,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia3X)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia5X)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia6X)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinimizeToTray)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_HideMiningWindows)).EndInit(); this.groupBox_Logging.ResumeLayout(false); @@ -1375,7 +1401,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).EndInit(); this.ResumeLayout(false); } @@ -1487,6 +1513,8 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_DagGeneration; private System.Windows.Forms.CheckBox checkBox_AutoStartMining; private System.Windows.Forms.PictureBox pictureBox_AutoStartMining; + private System.Windows.Forms.CheckBox checkBox_AMD_DisableAMDTempControl; + private System.Windows.Forms.PictureBox pictureBox_AMD_DisableAMDTempControl; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 75a8a38..97b7b18 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -191,6 +191,10 @@ private void InitializeToolTip() { toolTip1.SetToolTip(label_CPU0_ForceCPUExtension, International.GetText("Form_Settings_ToolTip_CPU_ForceCPUExtension")); toolTip1.SetToolTip(pictureBox_CPU0_ForceCPUExtension, International.GetText("Form_Settings_ToolTip_CPU_ForceCPUExtension")); + // amd disable temp control + toolTip1.SetToolTip(checkBox_AMD_DisableAMDTempControl, International.GetText("Form_Settings_ToolTip_DisableAMDTempControl")); + toolTip1.SetToolTip(pictureBox_AMD_DisableAMDTempControl, International.GetText("Form_Settings_ToolTip_DisableAMDTempControl")); + this.Text = International.GetText("Form_Settings_Title"); algorithmSettingsControl1.InitLocale(toolTip1); @@ -223,6 +227,7 @@ private void InitializeGeneralTabTranslations() { //checkBox_UseNewSettingsPage.Text = International.GetText("Form_Settings_General_UseNewSettingsPage"); checkBox_NVIDIAP0State.Text = International.GetText("Form_Settings_General_NVIDIAP0State"); checkBox_LogToFile.Text = International.GetText("Form_Settings_General_LogToFile"); + checkBox_AMD_DisableAMDTempControl.Text = International.GetText("Form_Settings_General_DisableAMDTempControl"); label_Language.Text = International.GetText("Form_Settings_General_Language") + ":"; label_BitcoinAddress.Text = International.GetText("BitcoinAddress") + ":"; @@ -296,6 +301,7 @@ private void InitializeGeneralTabCallbacks() { this.checkBox_NVIDIAP0State.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_LogToFile.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_AutoStartMining.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); + this.checkBox_AMD_DisableAMDTempControl.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); } // Add EventHandler for all the general tab's textboxes { @@ -362,6 +368,7 @@ private void InitializeGeneralTabFieldValuesReferences() { checkBox_DisableWindowsErrorReporting.Checked = ConfigManager.Instance.GeneralConfig.DisableWindowsErrorReporting; checkBox_NVIDIAP0State.Checked = ConfigManager.Instance.GeneralConfig.NVIDIAP0State; checkBox_LogToFile.Checked = ConfigManager.Instance.GeneralConfig.LogToFile; + checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl; } // Textboxes @@ -492,6 +499,7 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { ConfigManager.Instance.GeneralConfig.DisableWindowsErrorReporting = checkBox_DisableWindowsErrorReporting.Checked; ConfigManager.Instance.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; ConfigManager.Instance.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; + ConfigManager.Instance.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; } private void GeneralTextBoxes_Leave(object sender, EventArgs e) { diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index 643ebee..9444265 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -212,7 +212,7 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo // check intensity and xintensity, the latter overrides so change accordingly foreach (var cDev in CDevs) { foreach (var intensityOption in sgminer_intensities) { - if (cDev.CurrentExtraLaunchParameters.Contains(intensityOption.ShortName)) { + if (!string.IsNullOrEmpty(intensityOption.ShortName) && cDev.CurrentExtraLaunchParameters.Contains(intensityOption.ShortName)) { cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace(intensityOption.ShortName, intensityOption.LongName); contains_intensity[intensityOption.Type] = true; } diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 3a74553..610d888 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.1.3")] -[assembly: AssemblyFileVersion("1.7.1.3")] +[assembly: AssemblyVersion("1.7.1.4")] +[assembly: AssemblyFileVersion("1.7.1.4")] From ca04f0efcaed6e34bebb836c45a9664dea6871d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 12:50:54 +0200 Subject: [PATCH 034/366] fixed parser, added logging to sgminer parsing --- .../Miners/ExtraLaunchParametersParser.cs | 57 ++++++++++++++++--- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index 9444265..16f33b0 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -61,12 +61,13 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.CpuPriority, "", "--cpu-priority", "-1"), // default none }; - private static string Parse(List CDevs, List options, bool useIfDefaults = false) { + private static string Parse(List CDevs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); Dictionary paramsFlags = new Dictionary(); Dictionary> cdevOptions = new Dictionary>(); Dictionary isOptionDefaults = new Dictionary(); + Dictionary isOptionExist = new Dictionary(); // init devs options, and defaults foreach (var cDev in CDevs) { var defaults = new Dictionary(); @@ -81,12 +82,39 @@ private static string Parse(List CDevs, List options optionsOrder.Add(optionType); paramsFlags.Add(optionType, option.LongName); isOptionDefaults.Add(option.Type, true); + isOptionExist.Add(option.Type, false); } // parse foreach (var cDev in CDevs) { Helpers.ConsolePrint(TAG, String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", cDev.CurrentExtraLaunchParameters, cDev.UUID)); var parameters = cDev.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' '); - + + bool prevHasIgnoreParam = false; + int logCount = 0; + Func ignorePrintLog = (string param) => { + // AMD temp controll is separated and logs stuff that is ignored + bool printIgnore = true; + if (ignoreLogOpions != null) { + foreach (var ignoreOption in ignoreLogOpions) { + if (param.Equals(ignoreOption.ShortName) || param.Equals(ignoreOption.LongName)) { + printIgnore = false; + prevHasIgnoreParam = true; + logCount = 0; + break; + } + } + } + if (printIgnore && !prevHasIgnoreParam) { + Helpers.ConsolePrint(TAG, String.Format(IGNORE_PARAM, param)); + } + if (logCount == 1) { + prevHasIgnoreParam = false; + logCount = 0; + } + ++logCount; + return ""; // fake crappy C# crap + }; + MinerOptionType currentFlag = MinerOptionType.NONE; foreach (var param in parameters) { if (param.Equals("")) { // skip @@ -97,6 +125,7 @@ private static string Parse(List CDevs, List options if (param.Equals(option.ShortName) || param.Equals(option.LongName)) { isIngored = false; if (option.FlagType == MinerOptionFlagType.Uni) { + isOptionExist[option.Type] = true; cdevOptions[cDev.UUID][option.Type] = "notNull"; // if Uni param is null it is not present } else { // Sinlge and Multi param currentFlag = option.Type; @@ -104,13 +133,14 @@ private static string Parse(List CDevs, List options } } if (isIngored) { // ignored - Helpers.ConsolePrint(TAG, String.Format(IGNORE_PARAM, param)); + ignorePrintLog(param); } } else if (currentFlag != MinerOptionType.NONE) { + isOptionExist[currentFlag] = true; cdevOptions[cDev.UUID][currentFlag] = param; currentFlag = MinerOptionType.NONE; } else { // problem - Helpers.ConsolePrint(TAG, String.Format(IGNORE_PARAM, param)); + ignorePrintLog(param); } } } @@ -130,7 +160,7 @@ private static string Parse(List CDevs, List options if (!isAllDefault || useIfDefaults) { foreach (var option in options) { - if (!isOptionDefaults[option.Type] || useIfDefaults) { // if options all default ignore + if (!isOptionDefaults[option.Type] || isOptionExist[option.Type] || useIfDefaults) { // if options all default ignore if(option.FlagType == MinerOptionFlagType.Uni) { // uni params if one exist use or all must exist? bool isOptionInUse = false; @@ -224,20 +254,31 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo // replace if(contains_intensity[MinerOptionType.Intensity] && contains_intensity[MinerOptionType.Xintensity]) { + Helpers.ConsolePrint(TAG, "Sgminer replacing --intensity with --xintensity"); foreach (var cDev in CDevs) { cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--intensity", "--xintensity"); } } if (contains_intensity[MinerOptionType.Xintensity] && contains_intensity[MinerOptionType.Rawintensity]) { + Helpers.ConsolePrint(TAG, "Sgminer replacing --xintensity with --rawintensity"); foreach (var cDev in CDevs) { cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--xintensity", "--rawintensity"); } } - + List sgminerOptionsNew = new List(); + string temperatureControl = ""; // temp control and parse - string temperatureControl = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl ? "" : Parse(CDevs, _sgminerTemperatureOptions, true); - return String.Format("{0} {1}", Parse(CDevs, _sgminerOptions), temperatureControl); + if (ConfigManager.Instance.GeneralConfig.DisableAMDTempControl) { + Helpers.ConsolePrint(TAG, "DisableAMDTempControl is TRUE, temp control parameters will be ignored"); + } else { + Helpers.ConsolePrint(TAG, "Sgminer parsing temperature control parameters"); + temperatureControl = Parse(CDevs, _sgminerTemperatureOptions, true, _sgminerOptions); + } + Helpers.ConsolePrint(TAG, "Sgminer parsing default parameters"); + string returnStr = String.Format("{0} {1}", Parse(CDevs, _sgminerOptions, false, _sgminerTemperatureOptions), temperatureControl); + Helpers.ConsolePrint(TAG, "Sgminer extra launch parameters merged: " + returnStr); + return returnStr; } else { // ethminer dagger Helpers.ConsolePrint(TAG, "ExtraLaunch params ethminer AMD not implemented"); if (CDevs.Count > 0) { From adf0ad3a4bde6ed7e9a83ea8a2dd9bcd1784abb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 15:30:02 +0200 Subject: [PATCH 035/366] replace form timers for system timers, with miners and minermanager (same api more stable) --- NiceHashMiner/Miners/Miner.cs | 32 +++++++++++---------------- NiceHashMiner/Miners/MinersManager.cs | 10 +++++---- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 571cf0f..a78b872 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -14,7 +14,8 @@ using NiceHashMiner.Miners; using NiceHashMiner.Interfaces; -using Timer = System.Windows.Forms.Timer; +using Timer = System.Timers.Timer; +using System.Timers; namespace NiceHashMiner { @@ -116,7 +117,6 @@ protected Algorithm BenchmarkAlgorithm { protected MinerAPIReadStatus _currentMinerReadStatus { get; set; } private int _currentCooldownTimeInSeconds = _MIN_CooldownTimeInMilliseconds; private int _currentCooldownTimeInSecondsLeft = _MIN_CooldownTimeInMilliseconds; - private int _isCooldownCheckTimerAliveCount = 0; private const int IS_COOLDOWN_CHECK_TIMER_ALIVE_CAP = 15; public Miner(DeviceType deviceType, string minerDeviceName) @@ -141,11 +141,6 @@ public Miner(DeviceType deviceType, string minerDeviceName) APIPort = MinersApiPortsManager.Instance.GetAvaliablePort(); IsAPIReadException = false; _MAX_CooldownTimeInMilliseconds = GET_MAX_CooldownTimeInMilliseconds(); - // cool down init - _cooldownCheckTimer = new Timer() { - Interval = _MIN_CooldownTimeInMilliseconds - }; - _cooldownCheckTimer.Tick += MinerCoolingCheck_Tick; // Helpers.ConsolePrint(MinerTAG(), "NEW MINER CREATED"); } @@ -566,11 +561,16 @@ virtual protected NiceHashProcess _Start() protected void StartCoolDownTimerChecker() { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Starting cooldown checker"); + if (_cooldownCheckTimer != null && _cooldownCheckTimer.Enabled) _cooldownCheckTimer.Stop(); + // cool down init + _cooldownCheckTimer = new Timer() { + Interval = _MIN_CooldownTimeInMilliseconds + }; + _cooldownCheckTimer.Elapsed += MinerCoolingCheck_Tick; _cooldownCheckTimer.Start(); _currentCooldownTimeInSeconds = _MIN_CooldownTimeInMilliseconds; _currentCooldownTimeInSecondsLeft = _currentCooldownTimeInSeconds; _currentMinerReadStatus = MinerAPIReadStatus.NONE; - _isCooldownCheckTimerAliveCount = 0; } @@ -705,16 +705,10 @@ protected APIData GetSummaryCPU_CCMINER() { /// decrement time for half current half time, if less then min ammend /// private void CoolDown() { - _currentCooldownTimeInSeconds /= 2; - if (_currentCooldownTimeInSeconds < _MIN_CooldownTimeInMilliseconds) { + if (_currentCooldownTimeInSeconds > _MIN_CooldownTimeInMilliseconds) { _currentCooldownTimeInSeconds = _MIN_CooldownTimeInMilliseconds; - if (_isCooldownCheckTimerAliveCount == 0) { - _isCooldownCheckTimerAliveCount = IS_COOLDOWN_CHECK_TIMER_ALIVE_CAP; - Helpers.ConsolePrint(MinerTAG(), String.Format("{0} Cooling DOWN, cool time is {1} ms", ProcessTag(), _currentCooldownTimeInSeconds.ToString())); - } - --_isCooldownCheckTimerAliveCount; - } else { - Helpers.ConsolePrint(MinerTAG(), String.Format("{0} Cooling DOWN, cool time is {1} ms", ProcessTag(), _currentCooldownTimeInSeconds.ToString())); + Helpers.ConsolePrint(MinerTAG(), String.Format("{0} Reseting cool time = {1} ms", ProcessTag(), _MIN_CooldownTimeInMilliseconds.ToString())); + _currentMinerReadStatus = MinerAPIReadStatus.NONE; } } /// @@ -730,8 +724,8 @@ private void CoolUp() { } } - private void MinerCoolingCheck_Tick(object sender, EventArgs e) { - _currentCooldownTimeInSecondsLeft -= _cooldownCheckTimer.Interval; + private void MinerCoolingCheck_Tick(object sender, ElapsedEventArgs e) { + _currentCooldownTimeInSecondsLeft -= (int)_cooldownCheckTimer.Interval; // if times up if (_currentCooldownTimeInSecondsLeft <= 0) { if (_currentMinerReadStatus == MinerAPIReadStatus.GOT_READ) { diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 868b916..435e5bf 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -9,6 +9,9 @@ using System.Threading.Tasks; using System.Diagnostics; +using Timer = System.Timers.Timer; +using System.Timers; + namespace NiceHashMiner.Miners { // typedefs using DeviceSubsetList = List>; @@ -18,7 +21,6 @@ namespace NiceHashMiner.Miners { using GroupedDevices = SortedSet; using AllGroupedDevices = List>; using NiceHashMiner.Interfaces; - using System.Windows.Forms; @@ -86,13 +88,13 @@ public partial class MinersManager : BaseLazySingleton { protected MinersManager() { TAG = this.GetType().Name; _preventSleepTimer = new Timer(); - _preventSleepTimer.Tick += PreventSleepTimer_Tick; + _preventSleepTimer.Elapsed += PreventSleepTimer_Tick; // sleep time is minimal 1 minute _preventSleepTimer.Interval = 20 * 1000; // leave this interval, it works // set internet checking _internetCheckTimer = new Timer(); - _internetCheckTimer.Tick += InternetCheckTimer_Tick; + _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; _internetCheckTimer.Interval = 1000 * 60 * 5; // path checker @@ -111,7 +113,7 @@ private void InternetCheckTimer_Tick(object sender, EventArgs e) { //} } - private void PreventSleepTimer_Tick(object sender, EventArgs e) { + private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { // when mining keep system awake, prevent sleep Helpers.PreventSleep(); } From c0dd9752b204474b069731299f77c75502936e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 18:21:47 +0200 Subject: [PATCH 036/366] disable enable default optimizations --- NiceHashMiner/Configs/GeneralConfig.cs | 3 + NiceHashMiner/Devices/ComputeDevice.cs | 10 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 252 ++++++++++-------- NiceHashMiner/Forms/Form_Settings.cs | 65 ++++- .../Miners/ExtraLaunchParametersParser.cs | 33 ++- NiceHashMiner/Miners/Miner.cs | 1 + NiceHashMiner/langs/en.lang | 4 +- 7 files changed, 237 insertions(+), 131 deletions(-) diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index d23365a..2212d6e 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -67,6 +67,7 @@ public int MinerRestartDelayMS { public DeviceDetectionConfig DeviceDetection { get; set; } public bool DisableAMDTempControl { get; set; } + public bool DisableDefaultOptimizations { get; set; } public bool AutoScaleBTCValues { get; set; } public bool StartMiningWhenIdle { get; set; } @@ -149,6 +150,7 @@ public void SetDefaults() { BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); DeviceDetection = new DeviceDetectionConfig(); DisableAMDTempControl = false; + DisableDefaultOptimizations = false; AutoScaleBTCValues = true; StartMiningWhenIdle = false; LogToFile = true; @@ -242,6 +244,7 @@ protected override void InitializeObject() { MinimumProfit = _file.MinimumProfit; DisableAMDTempControl = _file.DisableAMDTempControl; + DisableDefaultOptimizations = _file.DisableDefaultOptimizations; DownloadInit = _file.DownloadInit; diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 2a540aa..f601e87 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -176,11 +176,11 @@ public string GetFullName() { } // TODO add file check and stuff like that - public void SetDeviceBenchmarkConfig(DeviceBenchmarkConfig deviceBenchmarkConfig) { + public void SetDeviceBenchmarkConfig(DeviceBenchmarkConfig deviceBenchmarkConfig, bool forceSet = false) { DeviceBenchmarkConfig = deviceBenchmarkConfig; // check initialization - if (!DeviceBenchmarkConfig.IsAlgorithmSettingsInit) { + if (!DeviceBenchmarkConfig.IsAlgorithmSettingsInit || forceSet) { DeviceBenchmarkConfig.IsAlgorithmSettingsInit = true; // only AMD has extra initialization if (_amdDevice != null) { @@ -204,10 +204,8 @@ public void SetDeviceBenchmarkConfig(DeviceBenchmarkConfig deviceBenchmarkConfig if (_cudaDevice != null) { if (DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(AlgorithmType.CryptoNight)) { var CryptoNightAlgo = DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.CryptoNight]; - if (CryptoNightAlgo.ExtraLaunchParameters == "") { - if (_cudaDevice.SM_major >= 5) { - CryptoNightAlgo.ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x" + _cudaDevice.SMX.ToString(); - } + if (_cudaDevice.SM_major >= 5) { + CryptoNightAlgo.ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x" + _cudaDevice.SMX.ToString(); } } } diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 3958301..630d27a 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -29,11 +29,13 @@ private void InitializeComponent() { this.tabControlGeneral = new System.Windows.Forms.TabControl(); this.tabPageGeneral = new System.Windows.Forms.TabPage(); this.groupBox_Misc = new System.Windows.Forms.GroupBox(); + this.checkBox_AMD_DisableAMDTempControl = new System.Windows.Forms.CheckBox(); this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); this.checkBox_HideMiningWindows = new System.Windows.Forms.CheckBox(); this.checkBox_MinimizeToTray = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDetectionNVidia6X = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDetectionNVidia5X = new System.Windows.Forms.CheckBox(); + this.pictureBox_AMD_DisableAMDTempControl = new System.Windows.Forms.PictureBox(); this.pictureBox_NVIDIAP0State = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableWindowsErrorReporting = new System.Windows.Forms.PictureBox(); this.pictureBox_ShowDriverVersionWarning = new System.Windows.Forms.PictureBox(); @@ -117,24 +119,25 @@ private void InitializeComponent() { this.textBox_MinerRestartDelayMS = new System.Windows.Forms.TextBox(); this.textBox_MinerAPIQueryInterval = new System.Windows.Forms.TextBox(); this.groupBoxBenchmarkTimeLimits = new System.Windows.Forms.GroupBox(); - this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.tabPageDevicesAlgos = new System.Windows.Forms.TabPage(); - this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); - this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); this.groupBoxAlgorithmSettings = new System.Windows.Forms.GroupBox(); - this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.buttonAllProfit = new System.Windows.Forms.Button(); this.buttonSelectedProfit = new System.Windows.Forms.Button(); this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.pictureBox_AMD_DisableAMDTempControl = new System.Windows.Forms.PictureBox(); - this.checkBox_AMD_DisableAMDTempControl = new System.Windows.Forms.CheckBox(); + this.pictureBox_DisableDefaultOptimizations = new System.Windows.Forms.PictureBox(); + this.checkBox_DisableDefaultOptimizations = new System.Windows.Forms.CheckBox(); + this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); + this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); + this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_NVIDIAP0State)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableWindowsErrorReporting)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ShowDriverVersionWarning)).BeginInit(); @@ -176,7 +179,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDefaultOptimizations)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -211,11 +214,13 @@ private void InitializeComponent() { // // groupBox_Misc // + this.groupBox_Misc.Controls.Add(this.checkBox_DisableDefaultOptimizations); this.groupBox_Misc.Controls.Add(this.checkBox_AMD_DisableAMDTempControl); this.groupBox_Misc.Controls.Add(this.checkBox_AutoStartMining); this.groupBox_Misc.Controls.Add(this.checkBox_HideMiningWindows); this.groupBox_Misc.Controls.Add(this.checkBox_MinimizeToTray); this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVidia6X); + this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDefaultOptimizations); this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVidia5X); this.groupBox_Misc.Controls.Add(this.pictureBox_AMD_DisableAMDTempControl); this.groupBox_Misc.Controls.Add(this.pictureBox_NVIDIAP0State); @@ -241,11 +246,22 @@ private void InitializeComponent() { this.groupBox_Misc.Controls.Add(this.checkBox_ShowDriverVersionWarning); this.groupBox_Misc.Location = new System.Drawing.Point(357, 6); this.groupBox_Misc.Name = "groupBox_Misc"; - this.groupBox_Misc.Size = new System.Drawing.Size(229, 342); + this.groupBox_Misc.Size = new System.Drawing.Size(229, 345); this.groupBox_Misc.TabIndex = 391; this.groupBox_Misc.TabStop = false; this.groupBox_Misc.Text = "Misc:"; // + // checkBox_AMD_DisableAMDTempControl + // + this.checkBox_AMD_DisableAMDTempControl.AutoSize = true; + this.checkBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(6, 292); + this.checkBox_AMD_DisableAMDTempControl.Name = "checkBox_AMD_DisableAMDTempControl"; + this.checkBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(145, 17); + this.checkBox_AMD_DisableAMDTempControl.TabIndex = 365; + this.checkBox_AMD_DisableAMDTempControl.Text = "DisableAMDTempControl"; + this.checkBox_AMD_DisableAMDTempControl.UseVisualStyleBackColor = true; + this.checkBox_AMD_DisableAMDTempControl.CheckedChanged += new System.EventHandler(this.checkBox_AMD_DisableAMDTempControl_CheckedChanged); + // // checkBox_AutoStartMining // this.checkBox_AutoStartMining.AutoSize = true; @@ -259,7 +275,7 @@ private void InitializeComponent() { // checkBox_HideMiningWindows // this.checkBox_HideMiningWindows.AutoSize = true; - this.checkBox_HideMiningWindows.Location = new System.Drawing.Point(6, 39); + this.checkBox_HideMiningWindows.Location = new System.Drawing.Point(6, 40); this.checkBox_HideMiningWindows.Name = "checkBox_HideMiningWindows"; this.checkBox_HideMiningWindows.Size = new System.Drawing.Size(123, 17); this.checkBox_HideMiningWindows.TabIndex = 315; @@ -279,7 +295,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionNVidia6X // this.checkBox_DisableDetectionNVidia6X.AutoSize = true; - this.checkBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(6, 83); + this.checkBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(6, 82); this.checkBox_DisableDetectionNVidia6X.Name = "checkBox_DisableDetectionNVidia6X"; this.checkBox_DisableDetectionNVidia6X.Size = new System.Drawing.Size(151, 17); this.checkBox_DisableDetectionNVidia6X.TabIndex = 317; @@ -289,17 +305,27 @@ private void InitializeComponent() { // checkBox_DisableDetectionNVidia5X // this.checkBox_DisableDetectionNVidia5X.AutoSize = true; - this.checkBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(6, 105); + this.checkBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(6, 103); this.checkBox_DisableDetectionNVidia5X.Name = "checkBox_DisableDetectionNVidia5X"; this.checkBox_DisableDetectionNVidia5X.Size = new System.Drawing.Size(151, 17); this.checkBox_DisableDetectionNVidia5X.TabIndex = 317; this.checkBox_DisableDetectionNVidia5X.Text = "DisableDetectionNVidia5X"; this.checkBox_DisableDetectionNVidia5X.UseVisualStyleBackColor = true; // + // pictureBox_AMD_DisableAMDTempControl + // + this.pictureBox_AMD_DisableAMDTempControl.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(205, 291); + this.pictureBox_AMD_DisableAMDTempControl.Name = "pictureBox_AMD_DisableAMDTempControl"; + this.pictureBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(18, 18); + this.pictureBox_AMD_DisableAMDTempControl.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_AMD_DisableAMDTempControl.TabIndex = 364; + this.pictureBox_AMD_DisableAMDTempControl.TabStop = false; + // // pictureBox_NVIDIAP0State // this.pictureBox_NVIDIAP0State.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_NVIDIAP0State.Location = new System.Drawing.Point(205, 281); + this.pictureBox_NVIDIAP0State.Location = new System.Drawing.Point(205, 270); this.pictureBox_NVIDIAP0State.Name = "pictureBox_NVIDIAP0State"; this.pictureBox_NVIDIAP0State.Size = new System.Drawing.Size(18, 18); this.pictureBox_NVIDIAP0State.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -309,7 +335,7 @@ private void InitializeComponent() { // pictureBox_DisableWindowsErrorReporting // this.pictureBox_DisableWindowsErrorReporting.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(205, 259); + this.pictureBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(205, 249); this.pictureBox_DisableWindowsErrorReporting.Name = "pictureBox_DisableWindowsErrorReporting"; this.pictureBox_DisableWindowsErrorReporting.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableWindowsErrorReporting.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -319,7 +345,7 @@ private void InitializeComponent() { // pictureBox_ShowDriverVersionWarning // this.pictureBox_ShowDriverVersionWarning.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(205, 237); + this.pictureBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(205, 228); this.pictureBox_ShowDriverVersionWarning.Name = "pictureBox_ShowDriverVersionWarning"; this.pictureBox_ShowDriverVersionWarning.Size = new System.Drawing.Size(18, 18); this.pictureBox_ShowDriverVersionWarning.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -329,7 +355,7 @@ private void InitializeComponent() { // pictureBox_StartMiningWhenIdle // this.pictureBox_StartMiningWhenIdle.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_StartMiningWhenIdle.Location = new System.Drawing.Point(205, 215); + this.pictureBox_StartMiningWhenIdle.Location = new System.Drawing.Point(205, 207); this.pictureBox_StartMiningWhenIdle.Name = "pictureBox_StartMiningWhenIdle"; this.pictureBox_StartMiningWhenIdle.Size = new System.Drawing.Size(18, 18); this.pictureBox_StartMiningWhenIdle.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -339,7 +365,7 @@ private void InitializeComponent() { // pictureBox_AutoScaleBTCValues // this.pictureBox_AutoScaleBTCValues.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AutoScaleBTCValues.Location = new System.Drawing.Point(205, 193); + this.pictureBox_AutoScaleBTCValues.Location = new System.Drawing.Point(205, 186); this.pictureBox_AutoScaleBTCValues.Name = "pictureBox_AutoScaleBTCValues"; this.pictureBox_AutoScaleBTCValues.Size = new System.Drawing.Size(18, 18); this.pictureBox_AutoScaleBTCValues.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -349,7 +375,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionAMD // this.pictureBox_DisableDetectionAMD.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionAMD.Location = new System.Drawing.Point(205, 171); + this.pictureBox_DisableDetectionAMD.Location = new System.Drawing.Point(205, 165); this.pictureBox_DisableDetectionAMD.Name = "pictureBox_DisableDetectionAMD"; this.pictureBox_DisableDetectionAMD.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionAMD.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -359,7 +385,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVidia2X // this.pictureBox_DisableDetectionNVidia2X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(205, 149); + this.pictureBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(205, 144); this.pictureBox_DisableDetectionNVidia2X.Name = "pictureBox_DisableDetectionNVidia2X"; this.pictureBox_DisableDetectionNVidia2X.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVidia2X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -369,7 +395,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVidia3X // this.pictureBox_DisableDetectionNVidia3X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(205, 127); + this.pictureBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(205, 123); this.pictureBox_DisableDetectionNVidia3X.Name = "pictureBox_DisableDetectionNVidia3X"; this.pictureBox_DisableDetectionNVidia3X.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVidia3X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -379,7 +405,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVidia5X // this.pictureBox_DisableDetectionNVidia5X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(205, 105); + this.pictureBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(205, 102); this.pictureBox_DisableDetectionNVidia5X.Name = "pictureBox_DisableDetectionNVidia5X"; this.pictureBox_DisableDetectionNVidia5X.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVidia5X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -389,7 +415,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVidia6X // this.pictureBox_DisableDetectionNVidia6X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(205, 83); + this.pictureBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(205, 81); this.pictureBox_DisableDetectionNVidia6X.Name = "pictureBox_DisableDetectionNVidia6X"; this.pictureBox_DisableDetectionNVidia6X.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVidia6X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -399,7 +425,7 @@ private void InitializeComponent() { // pictureBox_AutoStartMining // this.pictureBox_AutoStartMining.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(205, 19); + this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(205, 18); this.pictureBox_AutoStartMining.Name = "pictureBox_AutoStartMining"; this.pictureBox_AutoStartMining.Size = new System.Drawing.Size(18, 18); this.pictureBox_AutoStartMining.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -409,7 +435,7 @@ private void InitializeComponent() { // pictureBox_MinimizeToTray // this.pictureBox_MinimizeToTray.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_MinimizeToTray.Location = new System.Drawing.Point(205, 61); + this.pictureBox_MinimizeToTray.Location = new System.Drawing.Point(205, 60); this.pictureBox_MinimizeToTray.Name = "pictureBox_MinimizeToTray"; this.pictureBox_MinimizeToTray.Size = new System.Drawing.Size(18, 18); this.pictureBox_MinimizeToTray.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -429,7 +455,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionNVidia3X // this.checkBox_DisableDetectionNVidia3X.AutoSize = true; - this.checkBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(6, 127); + this.checkBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(6, 124); this.checkBox_DisableDetectionNVidia3X.Name = "checkBox_DisableDetectionNVidia3X"; this.checkBox_DisableDetectionNVidia3X.Size = new System.Drawing.Size(151, 17); this.checkBox_DisableDetectionNVidia3X.TabIndex = 318; @@ -439,7 +465,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionNVidia2X // this.checkBox_DisableDetectionNVidia2X.AutoSize = true; - this.checkBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(6, 149); + this.checkBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(6, 145); this.checkBox_DisableDetectionNVidia2X.Name = "checkBox_DisableDetectionNVidia2X"; this.checkBox_DisableDetectionNVidia2X.Size = new System.Drawing.Size(151, 17); this.checkBox_DisableDetectionNVidia2X.TabIndex = 319; @@ -449,7 +475,7 @@ private void InitializeComponent() { // checkBox_DisableDetectionAMD // this.checkBox_DisableDetectionAMD.AutoSize = true; - this.checkBox_DisableDetectionAMD.Location = new System.Drawing.Point(6, 171); + this.checkBox_DisableDetectionAMD.Location = new System.Drawing.Point(6, 166); this.checkBox_DisableDetectionAMD.Name = "checkBox_DisableDetectionAMD"; this.checkBox_DisableDetectionAMD.Size = new System.Drawing.Size(131, 17); this.checkBox_DisableDetectionAMD.TabIndex = 320; @@ -459,7 +485,7 @@ private void InitializeComponent() { // checkBox_NVIDIAP0State // this.checkBox_NVIDIAP0State.AutoSize = true; - this.checkBox_NVIDIAP0State.Location = new System.Drawing.Point(6, 281); + this.checkBox_NVIDIAP0State.Location = new System.Drawing.Point(6, 271); this.checkBox_NVIDIAP0State.Name = "checkBox_NVIDIAP0State"; this.checkBox_NVIDIAP0State.Size = new System.Drawing.Size(100, 17); this.checkBox_NVIDIAP0State.TabIndex = 326; @@ -469,7 +495,7 @@ private void InitializeComponent() { // checkBox_AutoScaleBTCValues // this.checkBox_AutoScaleBTCValues.AutoSize = true; - this.checkBox_AutoScaleBTCValues.Location = new System.Drawing.Point(6, 193); + this.checkBox_AutoScaleBTCValues.Location = new System.Drawing.Point(6, 187); this.checkBox_AutoScaleBTCValues.Name = "checkBox_AutoScaleBTCValues"; this.checkBox_AutoScaleBTCValues.Size = new System.Drawing.Size(128, 17); this.checkBox_AutoScaleBTCValues.TabIndex = 321; @@ -479,7 +505,7 @@ private void InitializeComponent() { // checkBox_DisableWindowsErrorReporting // this.checkBox_DisableWindowsErrorReporting.AutoSize = true; - this.checkBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(6, 259); + this.checkBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(6, 250); this.checkBox_DisableWindowsErrorReporting.Name = "checkBox_DisableWindowsErrorReporting"; this.checkBox_DisableWindowsErrorReporting.Size = new System.Drawing.Size(173, 17); this.checkBox_DisableWindowsErrorReporting.TabIndex = 324; @@ -489,7 +515,7 @@ private void InitializeComponent() { // checkBox_StartMiningWhenIdle // this.checkBox_StartMiningWhenIdle.AutoSize = true; - this.checkBox_StartMiningWhenIdle.Location = new System.Drawing.Point(6, 215); + this.checkBox_StartMiningWhenIdle.Location = new System.Drawing.Point(6, 208); this.checkBox_StartMiningWhenIdle.Name = "checkBox_StartMiningWhenIdle"; this.checkBox_StartMiningWhenIdle.Size = new System.Drawing.Size(125, 17); this.checkBox_StartMiningWhenIdle.TabIndex = 322; @@ -499,7 +525,7 @@ private void InitializeComponent() { // checkBox_ShowDriverVersionWarning // this.checkBox_ShowDriverVersionWarning.AutoSize = true; - this.checkBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(6, 237); + this.checkBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(6, 229); this.checkBox_ShowDriverVersionWarning.Name = "checkBox_ShowDriverVersionWarning"; this.checkBox_ShowDriverVersionWarning.Size = new System.Drawing.Size(156, 17); this.checkBox_ShowDriverVersionWarning.TabIndex = 323; @@ -1178,36 +1204,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.TabStop = false; this.groupBoxBenchmarkTimeLimits.Text = "Benchmark Time Limits:"; // - // benchmarkLimitControlNVIDIA - // - this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; - this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); - this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; - this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlNVIDIA.TabIndex = 4; - this.benchmarkLimitControlNVIDIA.TimeLimits = null; - // - // benchmarkLimitControlCPU - // - this.benchmarkLimitControlCPU.GroupName = "CPU"; - this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); - this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; - this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlCPU.TabIndex = 3; - this.benchmarkLimitControlCPU.TimeLimits = null; - // - // benchmarkLimitControlAMD - // - this.benchmarkLimitControlAMD.GroupName = "AMD"; - this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); - this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; - this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlAMD.TabIndex = 5; - this.benchmarkLimitControlAMD.TimeLimits = null; - // // tabPageDevicesAlgos // this.tabPageDevicesAlgos.Controls.Add(this.devicesListViewEnableControl1); @@ -1223,27 +1219,6 @@ private void InitializeComponent() { this.tabPageDevicesAlgos.Text = "Devices/Algorithms"; this.tabPageDevicesAlgos.UseVisualStyleBackColor = true; // - // devicesListViewEnableControl1 - // - this.devicesListViewEnableControl1.AutoSaveChange = true; - this.devicesListViewEnableControl1.BenchmarkCalculation = null; - this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; - this.devicesListViewEnableControl1.IsInBenchmark = false; - this.devicesListViewEnableControl1.IsMining = false; - this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); - this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; - this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.SetAllEnabled = false; - this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); - this.devicesListViewEnableControl1.TabIndex = 397; - // - // algorithmSettingsControl1 - // - this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); - this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; - this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); - this.algorithmSettingsControl1.TabIndex = 396; - // // groupBoxAlgorithmSettings // this.groupBoxAlgorithmSettings.Controls.Add(this.algorithmsListView1); @@ -1254,16 +1229,6 @@ private void InitializeComponent() { this.groupBoxAlgorithmSettings.TabStop = false; this.groupBoxAlgorithmSettings.Text = "Algorithm settings for selected device:"; // - // algorithmsListView1 - // - this.algorithmsListView1.BenchmarkCalculation = null; - this.algorithmsListView1.ComunicationInterface = null; - this.algorithmsListView1.IsInBenchmark = false; - this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); - this.algorithmsListView1.Name = "algorithmsListView1"; - this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); - this.algorithmsListView1.TabIndex = 2; - // // buttonAllProfit // this.buttonAllProfit.Location = new System.Drawing.Point(364, 6); @@ -1317,25 +1282,87 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // pictureBox_AMD_DisableAMDTempControl + // pictureBox_DisableDefaultOptimizations // - this.pictureBox_AMD_DisableAMDTempControl.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(205, 305); - this.pictureBox_AMD_DisableAMDTempControl.Name = "pictureBox_AMD_DisableAMDTempControl"; - this.pictureBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(18, 18); - this.pictureBox_AMD_DisableAMDTempControl.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_AMD_DisableAMDTempControl.TabIndex = 364; - this.pictureBox_AMD_DisableAMDTempControl.TabStop = false; + this.pictureBox_DisableDefaultOptimizations.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(205, 312); + this.pictureBox_DisableDefaultOptimizations.Name = "pictureBox_DisableDefaultOptimizations"; + this.pictureBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(18, 18); + this.pictureBox_DisableDefaultOptimizations.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_DisableDefaultOptimizations.TabIndex = 364; + this.pictureBox_DisableDefaultOptimizations.TabStop = false; // - // checkBox_AMD_DisableAMDTempControl + // checkBox_DisableDefaultOptimizations // - this.checkBox_AMD_DisableAMDTempControl.AutoSize = true; - this.checkBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(7, 305); - this.checkBox_AMD_DisableAMDTempControl.Name = "checkBox_AMD_DisableAMDTempControl"; - this.checkBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(145, 17); - this.checkBox_AMD_DisableAMDTempControl.TabIndex = 365; - this.checkBox_AMD_DisableAMDTempControl.Text = "DisableAMDTempControl"; - this.checkBox_AMD_DisableAMDTempControl.UseVisualStyleBackColor = true; + this.checkBox_DisableDefaultOptimizations.AutoSize = true; + this.checkBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(6, 313); + this.checkBox_DisableDefaultOptimizations.Name = "checkBox_DisableDefaultOptimizations"; + this.checkBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(163, 17); + this.checkBox_DisableDefaultOptimizations.TabIndex = 365; + this.checkBox_DisableDefaultOptimizations.Text = "Disable Default Optimizations"; + this.checkBox_DisableDefaultOptimizations.UseVisualStyleBackColor = true; + this.checkBox_DisableDefaultOptimizations.CheckedChanged += new System.EventHandler(this.checkBox_DisableDefaultOptimizations_CheckedChanged); + // + // benchmarkLimitControlNVIDIA + // + this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; + this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); + this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; + this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlNVIDIA.TabIndex = 4; + this.benchmarkLimitControlNVIDIA.TimeLimits = null; + // + // benchmarkLimitControlCPU + // + this.benchmarkLimitControlCPU.GroupName = "CPU"; + this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); + this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; + this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlCPU.TabIndex = 3; + this.benchmarkLimitControlCPU.TimeLimits = null; + // + // benchmarkLimitControlAMD + // + this.benchmarkLimitControlAMD.GroupName = "AMD"; + this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); + this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; + this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlAMD.TabIndex = 5; + this.benchmarkLimitControlAMD.TimeLimits = null; + // + // devicesListViewEnableControl1 + // + this.devicesListViewEnableControl1.AutoSaveChange = true; + this.devicesListViewEnableControl1.BenchmarkCalculation = null; + this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; + this.devicesListViewEnableControl1.IsInBenchmark = false; + this.devicesListViewEnableControl1.IsMining = false; + this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); + this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; + this.devicesListViewEnableControl1.SaveToGeneralConfig = false; + this.devicesListViewEnableControl1.SetAllEnabled = false; + this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); + this.devicesListViewEnableControl1.TabIndex = 397; + // + // algorithmSettingsControl1 + // + this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); + this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; + this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); + this.algorithmSettingsControl1.TabIndex = 396; + // + // algorithmsListView1 + // + this.algorithmsListView1.BenchmarkCalculation = null; + this.algorithmsListView1.ComunicationInterface = null; + this.algorithmsListView1.IsInBenchmark = false; + this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); + this.algorithmsListView1.Name = "algorithmsListView1"; + this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); + this.algorithmsListView1.TabIndex = 2; // // Form_Settings // @@ -1358,6 +1385,7 @@ private void InitializeComponent() { this.tabPageGeneral.ResumeLayout(false); this.groupBox_Misc.ResumeLayout(false); this.groupBox_Misc.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_NVIDIAP0State)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableWindowsErrorReporting)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ShowDriverVersionWarning)).EndInit(); @@ -1403,7 +1431,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDefaultOptimizations)).EndInit(); this.ResumeLayout(false); } @@ -1517,6 +1545,8 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_AutoStartMining; private System.Windows.Forms.CheckBox checkBox_AMD_DisableAMDTempControl; private System.Windows.Forms.PictureBox pictureBox_AMD_DisableAMDTempControl; + private System.Windows.Forms.CheckBox checkBox_DisableDefaultOptimizations; + private System.Windows.Forms.PictureBox pictureBox_DisableDefaultOptimizations; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index c39358a..afedc8c 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -201,6 +201,10 @@ private void InitializeToolTip() { toolTip1.SetToolTip(checkBox_AMD_DisableAMDTempControl, International.GetText("Form_Settings_ToolTip_DisableAMDTempControl")); toolTip1.SetToolTip(pictureBox_AMD_DisableAMDTempControl, International.GetText("Form_Settings_ToolTip_DisableAMDTempControl")); + // disable default optimizations + toolTip1.SetToolTip(checkBox_DisableDefaultOptimizations, International.GetText("Form_Settings_ToolTip_DisableDefaultOptimizations")); + toolTip1.SetToolTip(pictureBox_DisableDefaultOptimizations, International.GetText("Form_Settings_ToolTip_DisableDefaultOptimizations")); + this.Text = International.GetText("Form_Settings_Title"); algorithmSettingsControl1.InitLocale(toolTip1); @@ -287,6 +291,8 @@ private void InitializeGeneralTabTranslations() { buttonAllProfit.Text = International.GetText("FormSettings_Tab_Devices_Algorithms_Check_ALLProfitability"); buttonSelectedProfit.Text = International.GetText("FormSettings_Tab_Devices_Algorithms_Check_SingleProfitability"); + + checkBox_DisableDefaultOptimizations.Text = International.GetText("Form_Settings_Text_DisableDefaultOptimizations"); } private void InitializeGeneralTabCallbacks() { @@ -307,7 +313,6 @@ private void InitializeGeneralTabCallbacks() { this.checkBox_NVIDIAP0State.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_LogToFile.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_AutoStartMining.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); - this.checkBox_AMD_DisableAMDTempControl.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); } // Add EventHandler for all the general tab's textboxes { @@ -375,6 +380,7 @@ private void InitializeGeneralTabFieldValuesReferences() { checkBox_NVIDIAP0State.Checked = ConfigManager.Instance.GeneralConfig.NVIDIAP0State; checkBox_LogToFile.Checked = ConfigManager.Instance.GeneralConfig.LogToFile; checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl; + checkBox_DisableDefaultOptimizations.Checked = ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations; } // Textboxes @@ -505,7 +511,64 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { ConfigManager.Instance.GeneralConfig.DisableWindowsErrorReporting = checkBox_DisableWindowsErrorReporting.Checked; ConfigManager.Instance.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; ConfigManager.Instance.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; + } + + private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, EventArgs e) { + if (!_isInitFinished) return; ConfigManager.Instance.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; + foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + var thisListDev = new List() { cDev }; + if (cDev.DeviceType == DeviceType.AMD) { + foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { + if (algorithm.Key != AlgorithmType.DaggerHashimoto) { + algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; + cDev.MostProfitableAlgorithm = algorithm.Value; + algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( + thisListDev, algorithm.Key, DeviceType.AMD, false + ); + } + } + } + } + } + + private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, EventArgs e) { + if (!_isInitFinished) return; + ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; + if (ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations) { + foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + var thisListDev = new List() { cDev }; + foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { + algorithm.Value.ExtraLaunchParameters = ""; + if (cDev.DeviceType == DeviceType.AMD && algorithm.Key != AlgorithmType.DaggerHashimoto) { + algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; + cDev.MostProfitableAlgorithm = algorithm.Value; + algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( + thisListDev, algorithm.Key, cDev.DeviceType, false + ); + } + } + } + } else { + foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults + var thisListDev = new List() { cDev }; + var deviceDefaults = GroupAlgorithms.CreateDefaultsForGroup(cDev.DeviceGroupType); + foreach (var defaultAlgoSettings in deviceDefaults) { + if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(defaultAlgoSettings.Key)) { + var algorithmKey = defaultAlgoSettings.Key; + var algorithm = cDev.DeviceBenchmarkConfig.AlgorithmSettings[algorithmKey]; + algorithm.ExtraLaunchParameters = defaultAlgoSettings.Value.ExtraLaunchParameters; + cDev.MostProfitableAlgorithm = algorithm; + algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( + thisListDev, algorithmKey, cDev.DeviceType, false + ); + } + } + // set extra optimizations based on device + cDev.SetDeviceBenchmarkConfig(cDev.DeviceBenchmarkConfig, true); + } + } } private void GeneralTextBoxes_Leave(object sender, EventArgs e) { diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index 16f33b0..ee4b587 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -61,6 +61,14 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.CpuPriority, "", "--cpu-priority", "-1"), // default none }; + private static bool _showLog = true; + + private static void LogParser(string msg) { + if (_showLog) { + Helpers.ConsolePrint(TAG, msg); + } + } + private static string Parse(List CDevs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); @@ -86,7 +94,7 @@ private static string Parse(List CDevs, List options } // parse foreach (var cDev in CDevs) { - Helpers.ConsolePrint(TAG, String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", cDev.CurrentExtraLaunchParameters, cDev.UUID)); + LogParser(String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", cDev.CurrentExtraLaunchParameters, cDev.UUID)); var parameters = cDev.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' '); bool prevHasIgnoreParam = false; @@ -105,7 +113,7 @@ private static string Parse(List CDevs, List options } } if (printIgnore && !prevHasIgnoreParam) { - Helpers.ConsolePrint(TAG, String.Format(IGNORE_PARAM, param)); + LogParser(String.Format(IGNORE_PARAM, param)); } if (logCount == 1) { prevHasIgnoreParam = false; @@ -202,13 +210,14 @@ private static string Parse(List CDevs, List options } } - Helpers.ConsolePrint(TAG, String.Format("Final extra launch params parse \"{0}\"", retVal)); + LogParser(String.Format("Final extra launch params parse \"{0}\"", retVal)); return retVal; } - public static string ParseForCDevs(List CDevs, AlgorithmType algorithmType, DeviceType deviceType) { + public static string ParseForCDevs(List CDevs, AlgorithmType algorithmType, DeviceType deviceType, bool showLog = true) { + _showLog = showLog; // init cdevs extra launch parameters foreach (var cDev in CDevs) { cDev.CurrentExtraLaunchParameters = cDev.MostProfitableAlgorithm.ExtraLaunchParameters; @@ -220,7 +229,7 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo } else if (algorithmType == AlgorithmType.CryptoNight) { return Parse(CDevs, _ccimerCryptoNightOptions, true); } else { // ethminer dagger - Helpers.ConsolePrint(TAG, "ExtraLaunch params ethminer CUDA not implemented"); + LogParser("ExtraLaunch params ethminer CUDA not implemented"); if (CDevs.Count > 0) { return CDevs.First().MostProfitableAlgorithm.ExtraLaunchParameters; } @@ -254,13 +263,13 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo // replace if(contains_intensity[MinerOptionType.Intensity] && contains_intensity[MinerOptionType.Xintensity]) { - Helpers.ConsolePrint(TAG, "Sgminer replacing --intensity with --xintensity"); + LogParser("Sgminer replacing --intensity with --xintensity"); foreach (var cDev in CDevs) { cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--intensity", "--xintensity"); } } if (contains_intensity[MinerOptionType.Xintensity] && contains_intensity[MinerOptionType.Rawintensity]) { - Helpers.ConsolePrint(TAG, "Sgminer replacing --xintensity with --rawintensity"); + LogParser("Sgminer replacing --xintensity with --rawintensity"); foreach (var cDev in CDevs) { cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--xintensity", "--rawintensity"); } @@ -270,17 +279,17 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo string temperatureControl = ""; // temp control and parse if (ConfigManager.Instance.GeneralConfig.DisableAMDTempControl) { - Helpers.ConsolePrint(TAG, "DisableAMDTempControl is TRUE, temp control parameters will be ignored"); + LogParser("DisableAMDTempControl is TRUE, temp control parameters will be ignored"); } else { - Helpers.ConsolePrint(TAG, "Sgminer parsing temperature control parameters"); + LogParser("Sgminer parsing temperature control parameters"); temperatureControl = Parse(CDevs, _sgminerTemperatureOptions, true, _sgminerOptions); } - Helpers.ConsolePrint(TAG, "Sgminer parsing default parameters"); + LogParser("Sgminer parsing default parameters"); string returnStr = String.Format("{0} {1}", Parse(CDevs, _sgminerOptions, false, _sgminerTemperatureOptions), temperatureControl); - Helpers.ConsolePrint(TAG, "Sgminer extra launch parameters merged: " + returnStr); + LogParser("Sgminer extra launch parameters merged: " + returnStr); return returnStr; } else { // ethminer dagger - Helpers.ConsolePrint(TAG, "ExtraLaunch params ethminer AMD not implemented"); + LogParser("ExtraLaunch params ethminer AMD not implemented"); if (CDevs.Count > 0) { return CDevs.First().MostProfitableAlgorithm.ExtraLaunchParameters; } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index a78b872..5c7894b 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -711,6 +711,7 @@ private void CoolDown() { _currentMinerReadStatus = MinerAPIReadStatus.NONE; } } + /// /// increment time for half current half time, if more then max set restart /// diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index c56c0cb..353e12a 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -315,6 +315,8 @@ "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "We have detected that your system has Nvidia GPUs, but your driver is older than {0}. In order for NiceHash Miner to work correctly you should upgrade your drivers to recomended {1} or newer.", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART" : " (current {0})", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended": "We have detected that your Nvidia Driver is older than {0}{1}. We recommend you to update to {2} or newer.", - "NET45_Not_Intsalled_msg" : "NiceHash Miner requires .NET Framework 4.5 or higher to work properly. Please install Microsoft .NET Framework 4.5" + "NET45_Not_Intsalled_msg": "NiceHash Miner requires .NET Framework 4.5 or higher to work properly. Please install Microsoft .NET Framework 4.5", + "Form_Settings_ToolTip_DisableDefaultOptimizations": "When checked it disables all default optimization settings, making mining potentially more stable but significantly slower (especially for AMD cards).", + "Form_Settings_Text_DisableDefaultOptimizations": "Disable Default Optimizations", } } \ No newline at end of file From ff349952d6098190965d396f1ecf686b8da96cec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 18:49:31 +0200 Subject: [PATCH 037/366] ccminer_cryptonight parsing stability check --- NiceHashMiner/Miners/ExtraLaunchParametersParser.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index ee4b587..02c0303 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -18,7 +18,7 @@ static class ExtraLaunchParametersParser { }; // ccminer CryptoNight private static List _ccimerCryptoNightOptions = new List() { - new MinerOption(MinerOptionType.Ccminer_CryptoNightLaunch, "-l", "--launch=", "0"), // default is 8x40 + new MinerOption(MinerOptionType.Ccminer_CryptoNightLaunch, "-l", "--launch=", "8x40"), // default is 8x40 new MinerOption(MinerOptionType.Ccminer_CryptoNightBfactor, "", "--bfactor=", "0"), new MinerOption(MinerOptionType.Ccminer_CryptoNightBsleep, "", "--bsleep=", "0") // TODO check default }; @@ -227,6 +227,13 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo if (algorithmType != AlgorithmType.DaggerHashimoto && algorithmType != AlgorithmType.CryptoNight) { return Parse(CDevs, _ccimerOptions); } else if (algorithmType == AlgorithmType.CryptoNight) { + // check if any device is SM21 or SM3.x if yes return empty for stability reasons + foreach (var cDev in CDevs) { + if (cDev.DeviceGroupType == DeviceGroupType.NVIDIA_2_1 + || cDev.DeviceGroupType == DeviceGroupType.NVIDIA_3_x) { + return ""; + } + } return Parse(CDevs, _ccimerCryptoNightOptions, true); } else { // ethminer dagger LogParser("ExtraLaunch params ethminer CUDA not implemented"); From 29cfd994f23219ed8541e973715e36806e0dc4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 19:02:29 +0200 Subject: [PATCH 038/366] updated russian translations --- NiceHashMiner/langs/ru.lang | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 7785e2e..e149cd8 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -316,5 +316,7 @@ "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART" : " (текущий {0})", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended": "Мы обнаружили, что ваш драйвер старее {0}{1}. Мы рекомендуем вам обновиться до {2} или новее.", "NET45_Not_Intsalled_msg" : "Для корректной работы NiceHash Miner требуется .NET Framework 4.5 или выше. Установите, пожалуйста, Microsoft .NET Framework 4.5", + "Form_Settings_ToolTip_DisableDefaultOptimizations": "Если отмечено, отключает все настройки оптимизации по умолчанию, делая майнинг потенциально более стабильным, но значительно медленнее (особенно для карт AMD).", + "Form_Settings_Text_DisableDefaultOptimizations": "Отключить оптимизацию", } } \ No newline at end of file From e4796676ee2df98bc66b2ee018336950820fe790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 19:27:02 +0200 Subject: [PATCH 039/366] enable/disable all algorithms right click --- .../Components/AlgorithmsListView.Designer.cs | 9 +++++ .../Forms/Components/AlgorithmsListView.cs | 35 +++++++++++++++++++ .../Forms/Components/AlgorithmsListView.resx | 3 ++ NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/langs/en.lang | 2 ++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.Designer.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.Designer.cs index 75c631a..b9b86d5 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.Designer.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.Designer.cs @@ -23,12 +23,14 @@ protected override void Dispose(bool disposing) { /// the contents of this method with the code editor. /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); this.listViewAlgorithms = new System.Windows.Forms.ListView(); this.columnHeader0 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.SuspendLayout(); // // listViewAlgorithms @@ -50,6 +52,7 @@ private void InitializeComponent() { this.listViewAlgorithms.TabIndex = 11; this.listViewAlgorithms.UseCompatibleStateImageBehavior = false; this.listViewAlgorithms.View = System.Windows.Forms.View.Details; + this.listViewAlgorithms.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listViewAlgorithms_MouseClick); // // columnHeader0 // @@ -77,6 +80,11 @@ private void InitializeComponent() { this.columnHeader4.Text = "BTC/Day"; this.columnHeader4.Width = 134; // + // contextMenuStrip1 + // + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(61, 4); + // // AlgorithmsListView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -96,5 +104,6 @@ private void InitializeComponent() { private System.Windows.Forms.ColumnHeader columnHeader2; private System.Windows.Forms.ColumnHeader columnHeader3; private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; } } diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 5900a31..158ad66 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -173,5 +173,40 @@ public void SetSpeedStatus(ComputeDevice computeDevice, AlgorithmType algorithmT } } } + + private void listViewAlgorithms_MouseClick(object sender, MouseEventArgs e) { + if (IsInBenchmark) return; + if (e.Button == MouseButtons.Right) { + contextMenuStrip1.Items.Clear(); + // disable all + { + var disableAllItems = new ToolStripMenuItem(); + disableAllItems.Text = International.GetText("AlgorithmsListView_ContextMenu_DisableAll"); + disableAllItems.Click += toolStripMenuItemDisableAll_Click; + contextMenuStrip1.Items.Add(disableAllItems); + } + // enable all + { + var enableAllItems = new ToolStripMenuItem(); + enableAllItems.Text = International.GetText("AlgorithmsListView_ContextMenu_EnableAll"); + enableAllItems.Click += toolStripMenuItemEnableAll_Click; + contextMenuStrip1.Items.Add(enableAllItems); + } + contextMenuStrip1.Show(Cursor.Position); + } + } + + private void toolStripMenuItemEnableAll_Click(object sender, EventArgs e) { + foreach (ListViewItem lvi in listViewAlgorithms.Items) { + lvi.Checked = true; + } + } + + private void toolStripMenuItemDisableAll_Click(object sender, EventArgs e) { + foreach (ListViewItem lvi in listViewAlgorithms.Items) { + lvi.Checked = false; + } + } + } } diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.resx b/NiceHashMiner/Forms/Components/AlgorithmsListView.resx index 1af7de1..ad53752 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.resx +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.resx @@ -117,4 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 5c7894b..1028897 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -232,7 +232,7 @@ public void KillAllUsedMinerProcesses() { abstract protected void _Stop(MinerStopType willswitch); virtual public void Stop(MinerStopType willswitch = MinerStopType.SWITCH, bool needsRestart = false) { - _cooldownCheckTimer.Stop(); + if (_cooldownCheckTimer != null) _cooldownCheckTimer.Stop(); if (!needsRestart) { _Stop(willswitch); PreviousTotalMH = 0.0; diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 353e12a..a4e3cf8 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -318,5 +318,7 @@ "NET45_Not_Intsalled_msg": "NiceHash Miner requires .NET Framework 4.5 or higher to work properly. Please install Microsoft .NET Framework 4.5", "Form_Settings_ToolTip_DisableDefaultOptimizations": "When checked it disables all default optimization settings, making mining potentially more stable but significantly slower (especially for AMD cards).", "Form_Settings_Text_DisableDefaultOptimizations": "Disable Default Optimizations", + "AlgorithmsListView_ContextMenu_DisableAll": "Disable All Algorithms", + "AlgorithmsListView_ContextMenu_EnableAll" : "Enable All Algorithms", } } \ No newline at end of file From c01607677207a41e1ae0da096940c42d75c5d427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 19:29:15 +0200 Subject: [PATCH 040/366] update russian translations --- NiceHashMiner/langs/ru.lang | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index e149cd8..c1c6f85 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -250,6 +250,8 @@ "AlgorithmSettingsControl_ToolTip_Intensity": "Устанавливает интенсивность для выбранного алгоритма (значения между 8.0 - 25.0 или 31.0, в зависимости от алгоритма). Интенсивность 0 использует интенсивность по умолчанию. ФУНКЦИЯ ДЛЯ ПРОДВИНУТЫХ ПОЛЬЗОВАТЕЛЕЙ.", "AlgorithmsListView_GroupBox": "Выбранный алгоритм: {0}", "AlgorithmsListView_GroupBox_NONE": "NONE", + "AlgorithmsListView_ContextMenu_DisableAll": "Отключить все алгоритмы", + "AlgorithmsListView_ContextMenu_EnableAll" : "Включить все алгоритмы", "BenchmarkOptions_Benchmark_Type": "Тип бенчмарка:", "Form_Main_MiningDevices": "Устройства {0}:", "Form_Main_bins_folder_files_missing": "Отсутствуют файлы с последней инициализации майнеров. Убедитесь, что ваш антивирус не блокирует приложение. NiceHash Miner может не работать правильно без недостающих файлов. Нажмите Да для переустановки NiceHash Miner, чтобы попробовать исправить ошибку.", From 56aaaf07a8f4c07354942a58262f0505ef4a2280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 23:11:14 +0200 Subject: [PATCH 041/366] ethminer parsing options added --- NiceHashMiner/Enums/MinerOptionType.cs | 2 + .../Components/AlgorithmSettingsControl.cs | 20 +++++----- .../Miners/ExtraLaunchParametersParser.cs | 40 ++++++++++++++----- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 051d439..b950257 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -35,6 +35,8 @@ public enum MinerOptionType { Ethminer_OCL_LocalWork, Ethminer_OCL_GlobalWork, // CUDA ethminer + CudaBlockSize, + CudaGridSize, // TODO // cpuminer Threads, diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index 6d1f25e..51dbbd1 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -187,16 +187,16 @@ private void textChangedExtraLaunchParameters(object sender, EventArgs e) { var ExtraLaunchParams = richTextBoxExtraLaunchParameters.Text.Replace("\r\n", " "); ExtraLaunchParams = ExtraLaunchParams.Replace("\n", " "); _currentlySelectedAlgorithm.ExtraLaunchParameters = ExtraLaunchParams; - // if dagger copy for all devices group CUDA or AMD - if (_currentlySelectedAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto) { - foreach (var cDev in ComputeDevice.AllAvaliableDevices) { - if (_computeDevice.DeviceType == cDev.DeviceType) { - if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(AlgorithmType.DaggerHashimoto)) { - cDev.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.DaggerHashimoto].ExtraLaunchParameters = ExtraLaunchParams; - } - } - } - } + //// if dagger copy for all devices group CUDA or AMD + //if (_currentlySelectedAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto) { + // foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + // if (_computeDevice.DeviceType == cDev.DeviceType) { + // if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(AlgorithmType.DaggerHashimoto)) { + // cDev.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.DaggerHashimoto].ExtraLaunchParameters = ExtraLaunchParams; + // } + // } + // } + //} } #endregion diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index 02c0303..f0458ad 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -24,8 +24,14 @@ static class ExtraLaunchParametersParser { }; // OCL ethminer private static List _oclEthminerOptions = new List() { - new MinerOption(MinerOptionType.Ethminer_OCL_LocalWork, "", "--cl-local-work", "64"), - new MinerOption(MinerOptionType.Ethminer_OCL_GlobalWork, "", "--cl-global-work", "262144"), + new MinerOption(MinerOptionType.Ethminer_OCL_LocalWork, "", "--cl-local-work", "0"), + new MinerOption(MinerOptionType.Ethminer_OCL_GlobalWork, "", "--cl-global-work", "0"), + }; + + // CUDA ethminer + private static List _cudaEthminerOptions = new List() { + new MinerOption(MinerOptionType.CudaBlockSize, "", "--cuda-block-size", "0"), + new MinerOption(MinerOptionType.CudaGridSize, "", "--cuda-grid-size", "0"), }; // sgminer @@ -236,11 +242,18 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo } return Parse(CDevs, _ccimerCryptoNightOptions, true); } else { // ethminer dagger - LogParser("ExtraLaunch params ethminer CUDA not implemented"); - if (CDevs.Count > 0) { - return CDevs.First().MostProfitableAlgorithm.ExtraLaunchParameters; + // use if missing compute device for correct mapping + int id = -1; + var cdevs_mappings = new List(); + foreach (var cDev in CDevs) { + while(++id != cDev.ID) { + var fakeCdev = new ComputeDevice(id, "", "", ""); + fakeCdev.CurrentExtraLaunchParameters = ""; // empty + cdevs_mappings.Add(fakeCdev); + } + cdevs_mappings.Add(cDev); } - return ""; // TODO + return Parse(cdevs_mappings, _cudaEthminerOptions); } } else if (deviceType == DeviceType.AMD) { if (algorithmType != AlgorithmType.DaggerHashimoto) { @@ -296,11 +309,18 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo LogParser("Sgminer extra launch parameters merged: " + returnStr); return returnStr; } else { // ethminer dagger - LogParser("ExtraLaunch params ethminer AMD not implemented"); - if (CDevs.Count > 0) { - return CDevs.First().MostProfitableAlgorithm.ExtraLaunchParameters; + // use if missing compute device for correct mapping + int id = -1; + var cdevs_mappings = new List(); + foreach (var cDev in CDevs) { + while (++id != cDev.ID) { + var fakeCdev = new ComputeDevice(id, "", "", ""); + fakeCdev.CurrentExtraLaunchParameters = ""; // empty + cdevs_mappings.Add(fakeCdev); + } + cdevs_mappings.Add(cDev); } - return ""; // TODO + return Parse(cdevs_mappings, _oclEthminerOptions); } } else if (deviceType == DeviceType.CPU) { foreach (var cDev in CDevs) { From 0c3a6c7f940f2351e749fd4b9bcec0f679d5ba71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 21 Sep 2016 23:31:44 +0200 Subject: [PATCH 042/366] settings form change detection handling --- NiceHashMiner/Forms/Form_Settings.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index afedc8c..19dcd2e 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -515,6 +515,9 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, EventArgs e) { if (!_isInitFinished) return; + + // indicate there has been a change + IsChange = true; ConfigManager.Instance.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; foreach (var cDev in ComputeDevice.AllAvaliableDevices) { var thisListDev = new List() { cDev }; @@ -534,6 +537,9 @@ private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, Ev private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, EventArgs e) { if (!_isInitFinished) return; + + // indicate there has been a change + IsChange = true; ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; if (ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations) { foreach (var cDev in ComputeDevice.AllAvaliableDevices) { From 94436a7fa2f61ebcde54fef561d42002aacdcf36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 22 Sep 2016 10:25:34 +0200 Subject: [PATCH 043/366] fixes --- NiceHashMiner/3rdParty/ADL.cs | 2 +- .../Devices/ComputeDeviceQueryManager.cs | 2 +- .../DevicesListViewEnableControl.cs | 8 +++ NiceHashMiner/Forms/Form_Settings.Designer.cs | 51 ++++++++++--------- NiceHashMiner/Forms/Form_Settings.cs | 16 +++++- 5 files changed, 50 insertions(+), 29 deletions(-) diff --git a/NiceHashMiner/3rdParty/ADL.cs b/NiceHashMiner/3rdParty/ADL.cs index 28ac0cb..df31492 100644 --- a/NiceHashMiner/3rdParty/ADL.cs +++ b/NiceHashMiner/3rdParty/ADL.cs @@ -214,7 +214,7 @@ private static class ADLImport { #endregion Internal Constant #region DLLImport - [DllImport(Kernel32_FileName, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Kernel32_FileName, CallingConvention = CallingConvention.StdCall)] internal static extern HMODULE GetModuleHandle(string moduleName); [DllImport(Atiadlxx_FileName, CallingConvention = CallingConvention.Cdecl)] diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index 612af57..9bfcdbd 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -181,7 +181,7 @@ public void QueryDevices(IMessageNotifier messageNotifier) MessageBoxButtons.OK, MessageBoxIcon.Error); } // recomended driver - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && HasNvidiaVideoController() && _currentNvidiaOpenCLDriver < NVIDIA_RECOMENDED_DRIVER && !isNvidiaErrorShown) { + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && HasNvidiaVideoController() && _currentNvidiaOpenCLDriver < NVIDIA_RECOMENDED_DRIVER && !isNvidiaErrorShown && _currentNvidiaOpenCLDriver > -1) { var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); var nvdriverString = _currentNvidiaOpenCLDriver > -1 ? String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART"), _currentNvidiaOpenCLDriver.ToString()) : ""; diff --git a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs index 2d92d34..5a98cad 100644 --- a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs +++ b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs @@ -274,5 +274,13 @@ private void DevicesListViewEnableControl_Resize(object sender, EventArgs e) { ch.Width = this.Width - 10; } } + + public void SetFirstSelected() { + if (listViewDevices.Items.Count > 0) { + this.listViewDevices.Items[0].Selected = true; + this.listViewDevices.Select(); + } + } + } } diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 630d27a..ec98b1f 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -29,11 +29,13 @@ private void InitializeComponent() { this.tabControlGeneral = new System.Windows.Forms.TabControl(); this.tabPageGeneral = new System.Windows.Forms.TabPage(); this.groupBox_Misc = new System.Windows.Forms.GroupBox(); + this.checkBox_DisableDefaultOptimizations = new System.Windows.Forms.CheckBox(); this.checkBox_AMD_DisableAMDTempControl = new System.Windows.Forms.CheckBox(); this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); this.checkBox_HideMiningWindows = new System.Windows.Forms.CheckBox(); this.checkBox_MinimizeToTray = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDetectionNVidia6X = new System.Windows.Forms.CheckBox(); + this.pictureBox_DisableDefaultOptimizations = new System.Windows.Forms.PictureBox(); this.checkBox_DisableDetectionNVidia5X = new System.Windows.Forms.CheckBox(); this.pictureBox_AMD_DisableAMDTempControl = new System.Windows.Forms.PictureBox(); this.pictureBox_NVIDIAP0State = new System.Windows.Forms.PictureBox(); @@ -126,8 +128,6 @@ private void InitializeComponent() { this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.pictureBox_DisableDefaultOptimizations = new System.Windows.Forms.PictureBox(); - this.checkBox_DisableDefaultOptimizations = new System.Windows.Forms.CheckBox(); this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); @@ -137,6 +137,7 @@ private void InitializeComponent() { this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDefaultOptimizations)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_NVIDIAP0State)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableWindowsErrorReporting)).BeginInit(); @@ -179,7 +180,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDefaultOptimizations)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -197,6 +197,7 @@ private void InitializeComponent() { this.tabControlGeneral.SelectedIndex = 0; this.tabControlGeneral.Size = new System.Drawing.Size(612, 380); this.tabControlGeneral.TabIndex = 0; + this.tabControlGeneral.Selected += new System.Windows.Forms.TabControlEventHandler(this.tabControlGeneral_Selected); // // tabPageGeneral // @@ -251,6 +252,17 @@ private void InitializeComponent() { this.groupBox_Misc.TabStop = false; this.groupBox_Misc.Text = "Misc:"; // + // checkBox_DisableDefaultOptimizations + // + this.checkBox_DisableDefaultOptimizations.AutoSize = true; + this.checkBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(6, 313); + this.checkBox_DisableDefaultOptimizations.Name = "checkBox_DisableDefaultOptimizations"; + this.checkBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(163, 17); + this.checkBox_DisableDefaultOptimizations.TabIndex = 365; + this.checkBox_DisableDefaultOptimizations.Text = "Disable Default Optimizations"; + this.checkBox_DisableDefaultOptimizations.UseVisualStyleBackColor = true; + this.checkBox_DisableDefaultOptimizations.CheckedChanged += new System.EventHandler(this.checkBox_DisableDefaultOptimizations_CheckedChanged); + // // checkBox_AMD_DisableAMDTempControl // this.checkBox_AMD_DisableAMDTempControl.AutoSize = true; @@ -302,6 +314,16 @@ private void InitializeComponent() { this.checkBox_DisableDetectionNVidia6X.Text = "DisableDetectionNVidia6X"; this.checkBox_DisableDetectionNVidia6X.UseVisualStyleBackColor = true; // + // pictureBox_DisableDefaultOptimizations + // + this.pictureBox_DisableDefaultOptimizations.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(205, 312); + this.pictureBox_DisableDefaultOptimizations.Name = "pictureBox_DisableDefaultOptimizations"; + this.pictureBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(18, 18); + this.pictureBox_DisableDefaultOptimizations.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_DisableDefaultOptimizations.TabIndex = 364; + this.pictureBox_DisableDefaultOptimizations.TabStop = false; + // // checkBox_DisableDetectionNVidia5X // this.checkBox_DisableDetectionNVidia5X.AutoSize = true; @@ -1282,27 +1304,6 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // pictureBox_DisableDefaultOptimizations - // - this.pictureBox_DisableDefaultOptimizations.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(205, 312); - this.pictureBox_DisableDefaultOptimizations.Name = "pictureBox_DisableDefaultOptimizations"; - this.pictureBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(18, 18); - this.pictureBox_DisableDefaultOptimizations.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_DisableDefaultOptimizations.TabIndex = 364; - this.pictureBox_DisableDefaultOptimizations.TabStop = false; - // - // checkBox_DisableDefaultOptimizations - // - this.checkBox_DisableDefaultOptimizations.AutoSize = true; - this.checkBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(6, 313); - this.checkBox_DisableDefaultOptimizations.Name = "checkBox_DisableDefaultOptimizations"; - this.checkBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(163, 17); - this.checkBox_DisableDefaultOptimizations.TabIndex = 365; - this.checkBox_DisableDefaultOptimizations.Text = "Disable Default Optimizations"; - this.checkBox_DisableDefaultOptimizations.UseVisualStyleBackColor = true; - this.checkBox_DisableDefaultOptimizations.CheckedChanged += new System.EventHandler(this.checkBox_DisableDefaultOptimizations_CheckedChanged); - // // benchmarkLimitControlNVIDIA // this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; @@ -1385,6 +1386,7 @@ private void InitializeComponent() { this.tabPageGeneral.ResumeLayout(false); this.groupBox_Misc.ResumeLayout(false); this.groupBox_Misc.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDefaultOptimizations)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_NVIDIAP0State)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableWindowsErrorReporting)).EndInit(); @@ -1431,7 +1433,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDefaultOptimizations)).EndInit(); this.ResumeLayout(false); } diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 19dcd2e..34febf0 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -67,8 +67,9 @@ public Form_Settings() { // set first device selected { if (ComputeDevice.AllAvaliableDevices.Count > 0) { - var firstComputedevice = ComputeDevice.AllAvaliableDevices[0]; - algorithmsListView1.SetAlgorithms(firstComputedevice, firstComputedevice.ComputeDeviceEnabledOption.IsEnabled); + _selectedComputeDevice = ComputeDevice.AllAvaliableDevices[0]; + algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); + groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); } // At the very end set to true @@ -776,5 +777,16 @@ private void Form_Settings_Resize(object sender, EventArgs e) { pictureBox_MinProfit.Location = new Point(label_MinProfit.Location.X + label_MinProfit.Size.Width, pictureBox_MinProfit.Location.Y); } + private void tabControlGeneral_Selected(object sender, TabControlEventArgs e) { + // set first device selected { + if (ComputeDevice.AllAvaliableDevices.Count > 0) { + algorithmSettingsControl1.Deselect(); + _selectedComputeDevice = ComputeDevice.AllAvaliableDevices[0]; + algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); + groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); + //devicesListViewEnableControl1.SetFirstSelected(); + } + } + } } From f967b8b07f11c13eb7b51eb4b91499bff57498cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 22 Sep 2016 10:57:20 +0200 Subject: [PATCH 044/366] UI algo change fix --- NiceHashMiner/Forms/Form_Settings.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 34febf0..c0f2d51 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -781,9 +781,9 @@ private void tabControlGeneral_Selected(object sender, TabControlEventArgs e) { // set first device selected { if (ComputeDevice.AllAvaliableDevices.Count > 0) { algorithmSettingsControl1.Deselect(); - _selectedComputeDevice = ComputeDevice.AllAvaliableDevices[0]; - algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); - groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); + //_selectedComputeDevice = ComputeDevice.AllAvaliableDevices[0]; + //algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); + //groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); //devicesListViewEnableControl1.SetFirstSelected(); } } From bfb10198f067e091da95cf711656dfe00441ecc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 22 Sep 2016 12:15:27 +0200 Subject: [PATCH 045/366] don't assume download is initialized when new version --- NiceHashMiner/Configs/GeneralConfig.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index 2212d6e..9ba415c 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -246,7 +246,9 @@ protected override void InitializeObject() { DisableAMDTempControl = _file.DisableAMDTempControl; DisableDefaultOptimizations = _file.DisableDefaultOptimizations; - DownloadInit = _file.DownloadInit; + if (!IsNewVersion) { + DownloadInit = _file.DownloadInit; + } hwidLoadFromFile = true; hwidOK = this.hwid == _file.hwid; From 4f119d60c954b7b52ab60cb03af41eb4ace92bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 22 Sep 2016 12:59:01 +0200 Subject: [PATCH 046/366] ExtraLaunchParameters mini wiki --- .../README_ExtraLaunchParameters .md | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 NiceHashMiner/README_ExtraLaunchParameters .md diff --git a/NiceHashMiner/README_ExtraLaunchParameters .md b/NiceHashMiner/README_ExtraLaunchParameters .md new file mode 100644 index 0000000..4505aef --- /dev/null +++ b/NiceHashMiner/README_ExtraLaunchParameters .md @@ -0,0 +1,60 @@ +# Algorithm ExtraLaunchParameters +## How does it work: +If you are an advanced user that wants to tweak the performance of your GPUs or CPUs you can set **supported** options in the **ExtraLaunchParameters** for selected Device and Algorithm. + +If you have 3 AMD devices with the following **ExtraLaunchParameters** settings for algorithm A and B: + - **device1** --xintensity 1024 --worksize 64 --gputhreads 2 + - **device2** --xintensity 512 --worksize 128 --gputhreads 2 + - **device3** --xintensity 512 --worksize 64 --gputhreads 4 + +If **algorithm A** is most profitable for device1 and device2 and **algorithm B** for device3, NiceHashMiner will run two sgminers for A and B like so: + - sgminer .. --xintensity 1024,512 --worksize 64,128 --gputhreads 2,2 .. (device1 and device2) + - sgminer .. --xintensity 512 --worksize 64 --gputhreads 4 .. (device3) + +If **algorithm A** is most profitable for all three devices, NiceHashMiner will run two sgminers for A like so: + - sgminer .. --xintensity 1024,512,512 --worksize 64,128,64 --gputhreads 2,2,4 .. (device1, device2, device3) + +So when setting **ExtraLaunchParameters** set them **per device and algorithm** NiceHashMiner will group them accordingly. +If you leave **ExtraLaunchParameters** empty the defaults will be used or ignored if no parameters have been set. + +## Supported options +### NVIDIA ccminers + - **--intensity=** or **-i** (if not set default 0 or ignored if unused) + +### NVIDIA ccminer CryptoNight + - **--launch=** or **-l** (if not set default 8x40 or ignored if unused) + - **--bfactor=** (if not set default 0 or ignored if unused) + - **--bsleep=** (if not set default 0 or ignored if unused) + +### NVIDIA ethminer DaggerHashimoto + - **--cuda-block-size** (if not set default 128 or ignored if unused) + - **--cuda-grid-size** (if not set default 8192 or ignored if unused) + +### AMD sgminer + - **--keccak-unroll** (if not set default 0 or ignored if unused) + - **--hamsi-expand-big** (if not set default 4 or ignored if unused) + - **--nfactor** (if not set default 10 or ignored if unused) + - **--intensity** (if not set default d or ignored if unused) + - **--xintensity** (if not set default -1 or ignored if unused, overrides --intensity) + - **--rawintensity** (if not set default -1 or ignored if unused, overrides --xintensity) + - **--thread-concurrency** (if not set default -1 or ignored if unused) + - **--worksize** (if not set default -1 or ignored if unused) + - **--gpu-threads** (if not set default -1 or ignored if unused) + - **--lookup-gap** (if not set default -1 or ignored if unused) + +#### AMD sgminer Temperature Control (if Temperature Control disabled all options will be ignored) + - **--gpu-fan** (if not set default 30-60) + - **--temp-cutoff** (if not set default 95) + - **--temp-overheat** (if not set default 85) + - **--temp-target** (if not set default 75) + - **--auto-fan** (if not set default it means it will not be used) + - **--auto-gpu** (if not set default it means it will not be used) + +### AMD ethminer DaggerHashimoto + - **--cl-local-work** (if not set default 64 or ignored if unused) + - **--cl-global-work** (if not set default 4096 * 64 or ignored if unused) + +### CPU cpuminer + - **--threads=** (if not set default it will use all avaliable virtual threads) + - **--cpu-affinity** (if not set option will be ignored) + - **--cpu-priority** (if not set option will be ignored) \ No newline at end of file From 33a2c5e6584a321eeafdab21627c8ce7822676b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 22 Sep 2016 14:02:18 +0200 Subject: [PATCH 047/366] ethminer refactor --- NiceHashMiner/Miners/MinerEtherum.cs | 10 +++++++++- NiceHashMiner/Miners/MinerEtherumCUDA.cs | 11 ++--------- NiceHashMiner/Miners/MinerEtherumOCL.cs | 11 ++--------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/NiceHashMiner/Miners/MinerEtherum.cs b/NiceHashMiner/Miners/MinerEtherum.cs index a997c87..22ce737 100644 --- a/NiceHashMiner/Miners/MinerEtherum.cs +++ b/NiceHashMiner/Miners/MinerEtherum.cs @@ -75,7 +75,15 @@ public static string GetDagGenerationString(DagGenerationType type) { return "singlekeep"; } - public override void Start(Algorithm miningAlgorithm, string url, string username) { + public void Start(Algorithm miningAlgorithm, string url, string username, List usedMiners) { + foreach (var ethminer in usedMiners) { + if (ethminer.MINER_ID != MINER_ID /*&& (ethminer.IsRunning || ethminer.IsPaused)*/) { + Helpers.ConsolePrint(MinerTAG(), String.Format("Will end {0} {1}", ethminer.MinerTAG(), ethminer.ProcessTag())); + ethminer.End(); + System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + } + } + IsPaused = false; if (ProcessHandle == null) { CurrentMiningAlgorithm = miningAlgorithm; diff --git a/NiceHashMiner/Miners/MinerEtherumCUDA.cs b/NiceHashMiner/Miners/MinerEtherumCUDA.cs index 7c07de1..084f0a1 100644 --- a/NiceHashMiner/Miners/MinerEtherumCUDA.cs +++ b/NiceHashMiner/Miners/MinerEtherumCUDA.cs @@ -12,7 +12,7 @@ public class MinerEtherumCUDA : MinerEtherum { // reference to all MinerEtherumCUDA make sure to clear this after miner Stop // we make sure only ONE instance of MinerEtherumCUDA is running - private static List MinerEtherumCUDAList = new List(); + private static List MinerEtherumCUDAList = new List(); public MinerEtherumCUDA() : base(DeviceType.NVIDIA, "MinerEtherumCUDA", "NVIDIA") { @@ -26,14 +26,7 @@ public MinerEtherumCUDA() public override void Start(Algorithm miningAlgorithm, string url, string username) { Helpers.ConsolePrint(MinerTAG(), "Starting MinerEtherumCUDA, checking existing MinerEtherumCUDA to stop"); - foreach (var ethminer in MinerEtherumCUDAList) { - if (ethminer.MINER_ID != MINER_ID && (ethminer.IsRunning || ethminer.IsPaused)) { - Helpers.ConsolePrint(MinerTAG(), String.Format("Will end {0} {1}",ethminer.MinerTAG(), ethminer.ProcessTag())); - ethminer.End(); - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - } - } - base.Start(miningAlgorithm, url, username); + base.Start(miningAlgorithm, url, username, MinerEtherumCUDAList); } protected override string GetStartCommandStringPart(Algorithm miningAlgorithm, string url, string username) { diff --git a/NiceHashMiner/Miners/MinerEtherumOCL.cs b/NiceHashMiner/Miners/MinerEtherumOCL.cs index 420035b..01c89ab 100644 --- a/NiceHashMiner/Miners/MinerEtherumOCL.cs +++ b/NiceHashMiner/Miners/MinerEtherumOCL.cs @@ -15,7 +15,7 @@ public class MinerEtherumOCL : MinerEtherum { // reference to all MinerEtherumOCL make sure to clear this after miner Stop // we make sure only ONE instance of MinerEtherumOCL is running - private static List MinerEtherumOCLList = new List(); + private static List MinerEtherumOCLList = new List(); private readonly int GPUPlatformNumber; @@ -31,14 +31,7 @@ public MinerEtherumOCL() public override void Start(Algorithm miningAlgorithm, string url, string username) { Helpers.ConsolePrint(MinerTAG(), "Starting MinerEtherumOCL, checking existing MinerEtherumOCL to stop"); - foreach (var ethminer in MinerEtherumOCLList) { - if (ethminer.MINER_ID != MINER_ID && (ethminer.IsRunning || ethminer.IsPaused)) { - Helpers.ConsolePrint(MinerTAG(), String.Format("Will end {0} {1}", ethminer.MinerTAG(), ethminer.ProcessTag())); - ethminer.End(); - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - } - } - base.Start(miningAlgorithm, url, username); + base.Start(miningAlgorithm, url, username, MinerEtherumOCLList); } protected override string GetStartCommandStringPart(Algorithm miningAlgorithm, string url, string username) { From 53faf50d845b4e1f84f1bf718aa1af03eff6b486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 22 Sep 2016 14:27:10 +0200 Subject: [PATCH 048/366] AMD Ethminer globaly ony one miner fixgit add . -A! --- NiceHashMiner/Miners/MinerEtherum.cs | 2 +- NiceHashMiner/Miners/MinerEtherumOCL.cs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/MinerEtherum.cs b/NiceHashMiner/Miners/MinerEtherum.cs index 22ce737..fabbf2f 100644 --- a/NiceHashMiner/Miners/MinerEtherum.cs +++ b/NiceHashMiner/Miners/MinerEtherum.cs @@ -77,7 +77,7 @@ public static string GetDagGenerationString(DagGenerationType type) { public void Start(Algorithm miningAlgorithm, string url, string username, List usedMiners) { foreach (var ethminer in usedMiners) { - if (ethminer.MINER_ID != MINER_ID /*&& (ethminer.IsRunning || ethminer.IsPaused)*/) { + if (ethminer.MINER_ID != MINER_ID && (ethminer.IsRunning || ethminer.IsPaused)) { Helpers.ConsolePrint(MinerTAG(), String.Format("Will end {0} {1}", ethminer.MinerTAG(), ethminer.ProcessTag())); ethminer.End(); System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); diff --git a/NiceHashMiner/Miners/MinerEtherumOCL.cs b/NiceHashMiner/Miners/MinerEtherumOCL.cs index 01c89ab..5195487 100644 --- a/NiceHashMiner/Miners/MinerEtherumOCL.cs +++ b/NiceHashMiner/Miners/MinerEtherumOCL.cs @@ -22,6 +22,7 @@ public class MinerEtherumOCL : MinerEtherum { public MinerEtherumOCL() : base(DeviceType.AMD, "MinerEtherumOCL", "AMD OpenCL") { GPUPlatformNumber = ComputeDeviceQueryManager.Instance.AMDOpenCLPlatformNum; + MinerEtherumOCLList.Add(this); } ~MinerEtherumOCL() { From 870580173f9239a3dfc4acb882b8e6bce104adc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 26 Sep 2016 12:14:03 +0200 Subject: [PATCH 049/366] fixes --- .../Devices/ComputeDeviceQueryManager.cs | 8 ++++++ NiceHashMiner/Forms/Form_Main.cs | 28 +++++++++---------- NiceHashMiner/Forms/Form_Settings.cs | 4 +-- NiceHashMiner/Links.cs | 27 ++++++++++++++++++ NiceHashMiner/Miners/sgminer.cs | 7 ++--- NiceHashMiner/NiceHashMiner.csproj | 2 ++ NiceHashMiner/NiceHashStats.cs | 8 +++--- 7 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 NiceHashMiner/Links.cs diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index 9bfcdbd..828a843 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -282,6 +282,7 @@ private bool HasNvidiaVideoController() { #endregion // Video controllers, driver versions private void QueryCPUs() { + Helpers.ConsolePrint(TAG, "QueryCPUs START"); // get all CPUs CPUs = CPUID.GetPhysicalProcessorCount(); @@ -317,10 +318,12 @@ private void QueryCPUs() { i, CPUID.GetCPUName().Trim()); } } + Helpers.ConsolePrint(TAG, "QueryCPUs END"); } List amdGpus = new List(); private void QueryAMD() { + Helpers.ConsolePrint(TAG, "QueryAMD START"); //showMessageAndStep(International.GetText("Form_Main_loadtext_AMD")); //var dump = new sgminer(true); @@ -545,6 +548,7 @@ private void QueryAMD() { } } } + Helpers.ConsolePrint(TAG, "QueryAMD END"); } private void UncheckedCPU() { @@ -582,6 +586,7 @@ private bool IsSMGroupSkip(int sm_major) { } private void QueryCudaDevices() { + Helpers.ConsolePrint(TAG, "QueryCudaDevices START"); Process CudaDevicesDetection = new Process(); CudaDevicesDetection.StartInfo.FileName = "CudaDeviceDetection.exe"; CudaDevicesDetection.StartInfo.UseShellExecute = false; @@ -666,6 +671,7 @@ private void QueryCudaDevices() { } else { Helpers.ConsolePrint(TAG, "CudaDevicesDetection found no devices. CudaDevicesDetection returned: " + QueryCudaDevicesString); } + Helpers.ConsolePrint(TAG, "QueryCudaDevices END"); } #endregion // CUDA, NVIDIA Query @@ -709,6 +715,7 @@ private void QueryOpenCLDevicesOutputErrorDataReceived(object sender, DataReceiv } private void QueryOpenCLDevices() { + Helpers.ConsolePrint(TAG, "QueryOpenCLDevices START"); Process OpenCLDevicesDetection = new Process(); OpenCLDevicesDetection.StartInfo.FileName = "AMDOpenCLDeviceDetection.exe"; OpenCLDevicesDetection.StartInfo.UseShellExecute = false; @@ -758,6 +765,7 @@ private void QueryOpenCLDevices() { } Helpers.ConsolePrint(TAG, stringBuilder.ToString()); } + Helpers.ConsolePrint(TAG, "QueryOpenCLDevices END"); } #endregion OpenCL Query diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 11834d4..c34889b 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -18,15 +18,19 @@ using NiceHashMiner.Utils; using NiceHashMiner.PInvoke; +using SystemTimer = System.Timers.Timer; +using Timer = System.Windows.Forms.Timer; +using System.Timers; + namespace NiceHashMiner { public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, IMainFormRatesComunication { - private static string VisitURL = "http://www.nicehash.com"; + private static string VisitURL = Links.VisitURL; private Timer MinerStatsCheck; private Timer UpdateCheck; - private Timer SMACheck; + private SystemTimer SMACheck; private Timer BalanceCheck; private Timer SMAMinerCheck; private Timer BitcoinExchangeCheck; @@ -230,8 +234,8 @@ private void StartupTimer_Tick(object sender, EventArgs e) LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_GetNiceHashSMA")); - SMACheck = new Timer(); - SMACheck.Tick += SMACheck_Tick; + SMACheck = new SystemTimer(); + SMACheck.Elapsed += SMACheck_Tick; SMACheck.Interval = 60 * 1000; // every 60 seconds SMACheck.Start(); @@ -539,7 +543,7 @@ void UpdateCheck_Tick(object sender, EventArgs e) if (ret < 0) { linkLabelVisitUs.Text = String.Format(International.GetText("Form_Main_new_version_released"), ver); - VisitURL = "https://github.com/nicehash/NiceHashMiner/releases/tag/" + ver; + VisitURL = Links.VisitURLNew + ver; } } @@ -580,7 +584,7 @@ private bool VerifyMiningAddress(bool ShowError) MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (result == System.Windows.Forms.DialogResult.Yes) - System.Diagnostics.Process.Start("https://www.nicehash.com/index.jsp?p=faq#faqs15"); + System.Diagnostics.Process.Start(Links.NHM_BTC_Wallet_Faq); textBoxBTCAddress.Focus(); return false; @@ -609,13 +613,13 @@ private void linkLabelCheckStats_LinkClicked(object sender, LinkLabelLinkClicked { if (!VerifyMiningAddress(true)) return; - System.Diagnostics.Process.Start("http://www.nicehash.com/index.jsp?p=miners&addr=" + textBoxBTCAddress.Text.Trim()); + System.Diagnostics.Process.Start(Links.CheckStats + textBoxBTCAddress.Text.Trim()); } private void linkLabelChooseBTCWallet_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - System.Diagnostics.Process.Start("https://www.nicehash.com/index.jsp?p=faq#faqs15"); + System.Diagnostics.Process.Start(Links.NHM_BTC_Wallet_Faq); } @@ -630,12 +634,10 @@ private void buttonBenchmark_Click(object sender, EventArgs e) { ConfigManager.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; - SMACheck.Stop(); BenchmarkForm = new Form_Benchmark(); SetChildFormCenter(BenchmarkForm); BenchmarkForm.ShowDialog(); BenchmarkForm = null; - SMACheck.Start(); InitMainConfigGUIData(); } @@ -703,7 +705,6 @@ private void buttonStartMining_Click(object sender, EventArgs e) International.GetText("Warning_with_Exclamation"), MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); if (result == System.Windows.Forms.DialogResult.Yes) { - SMACheck.Stop(); List enabledDevices = new List(); HashSet deviceNames = new HashSet(); foreach (var cdev in ComputeDevice.AllAvaliableDevices) { @@ -719,7 +720,6 @@ private void buttonStartMining_Click(object sender, EventArgs e) BenchmarkForm.ShowDialog(); BenchmarkForm = null; InitMainConfigGUIData(); - SMACheck.Start(); } else if (result == System.Windows.Forms.DialogResult.No) { // check devices without benchmarks foreach (var cdev in ComputeDevice.AllAvaliableDevices) { @@ -808,12 +808,12 @@ private string FormatPayingOutput(double paying) private void buttonHelp_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("https://github.com/nicehash/NiceHashMiner"); + System.Diagnostics.Process.Start(Links.NHM_Help); } private void toolStripStatusLabel10_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("https://www.nicehash.com/index.jsp?p=faq#faqs6"); + System.Diagnostics.Process.Start(Links.NHM_Paying_Faq); } private void toolStripStatusLabel10_MouseHover(object sender, EventArgs e) diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index c0f2d51..91155d6 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -660,7 +660,7 @@ private void buttonSelectedProfit_Click(object sender, EventArgs e) { MessageBoxButtons.OK); return; } - var url = "https://www.nicehash.com/?p=calc&name=" + _selectedComputeDevice.Name; + var url = Links.NHM_Profit_Check + _selectedComputeDevice.Name; foreach (var algorithm in _selectedComputeDevice.DeviceBenchmarkConfig.AlgorithmSettings.Values) { var id = (int)algorithm.NiceHashID; url += "&speed" + id + "=" + ProfitabilityCalculator.GetFormatedSpeed(algorithm.BenchmarkSpeed, algorithm.NiceHashID).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); @@ -671,7 +671,7 @@ private void buttonSelectedProfit_Click(object sender, EventArgs e) { } private void buttonAllProfit_Click(object sender, EventArgs e) { - var url = "https://www.nicehash.com/?p=calc&name=CUSTOM"; + var url = Links.NHM_Profit_Check + "CUSTOM"; Dictionary total = new Dictionary(); foreach (var curCDev in ComputeDevice.AllAvaliableDevices) { diff --git a/NiceHashMiner/Links.cs b/NiceHashMiner/Links.cs new file mode 100644 index 0000000..2ec201b --- /dev/null +++ b/NiceHashMiner/Links.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner { + public static class Links { + public static string VisitURL = "http://www.nicehash.com?utm_source=NHM"; + // add version + public static string VisitURLNew = "https://github.com/nicehash/NiceHashMiner/releases/tag/"; + // add btc adress as parameter + public static string CheckStats = "http://www.nicehash.com/index.jsp?utm_source=NHM&p=miners&addr="; + // help and faq + public static string NHM_Help = "https://github.com/nicehash/NiceHashMiner"; + // faq + public static string NHM_BTC_Wallet_Faq = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs15"; + public static string NHM_Paying_Faq = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs6"; + // API + // btc adress as parameter + public static string NHM_API_stats = "https://www.nicehash.com/api?method=stats.provider&addr="; + public static string NHM_API_info = "https://www.nicehash.com/api?method=simplemultialgo.info"; + public static string NHM_API_version = "https://www.nicehash.com/nicehashminer?method=version"; + // device profits + public static string NHM_Profit_Check = "https://www.nicehash.com/?utm_source=NHM&p=calc&name="; + } +} diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index ca53f30..fffffc3 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -145,10 +145,9 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti Globals.MiningLocation[ConfigManager.Instance.GeneralConfig.ServiceLocation] + ".nicehash.com:" + nhAlgorithmData.port; - string username = ConfigManager.Instance.GeneralConfig.BitcoinAddress.Trim(); - if (String.IsNullOrEmpty(username) || String.IsNullOrWhiteSpace(username)) { - username = Globals.DemoUser; - } + // demo for benchmark + string username = Globals.DemoUser; + if (ConfigManager.Instance.GeneralConfig.WorkerName.Length > 0) username += "." + ConfigManager.Instance.GeneralConfig.WorkerName.Trim(); diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 0224301..4a8bc86 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -177,6 +177,7 @@ + @@ -243,6 +244,7 @@ AlgorithmsListView.cs + Designer AlgorithmSettingsControl.cs diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index d49fb9a..329be8f 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -80,7 +80,7 @@ class nicehashminer_version public static Dictionary GetAlgorithmRates(string worker) { - string r1 = GetNiceHashAPIData("https://www.nicehash.com/api?method=simplemultialgo.info", worker); + string r1 = GetNiceHashAPIData(Links.NHM_API_info, worker); if (r1 == null) return null; nicehash_json_2 nhjson_current; @@ -106,7 +106,7 @@ public static Dictionary GetAlgorithmRates(string wo public static nicehash_stats GetStats(string btc, int algo, string worker) { - string r1 = GetNiceHashAPIData("https://www.nicehash.com/api?method=stats.provider&addr=" + btc, worker); + string r1 = GetNiceHashAPIData(Links.NHM_API_stats + btc, worker); if (r1 == null) return null; nicehash_json nhjson_current; @@ -132,7 +132,7 @@ public static double GetBalance(string btc, string worker) { double balance = 0; - string r1 = GetNiceHashAPIData("https://www.nicehash.com/api?method=stats.provider&addr=" + btc, worker); + string r1 = GetNiceHashAPIData(Links.NHM_API_stats + btc, worker); if (r1 != null) { nicehash_json nhjson_current; @@ -160,7 +160,7 @@ public static double GetBalance(string btc, string worker) public static string GetVersion(string worker) { - string r1 = GetNiceHashAPIData("https://www.nicehash.com/nicehashminer?method=version", worker); + string r1 = GetNiceHashAPIData(Links.NHM_API_version, worker); if (r1 == null) return null; nicehashminer_version nhjson; From df526b20f5317ca827e1b873bd26f0b5d35ca412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 26 Sep 2016 20:57:41 +0200 Subject: [PATCH 050/366] log, fixes, double key add fix (parameters parse) --- .../AMDOpenCLDeviceDetection.vcxproj | 83 +++++++++++++++++++ NiceHashMiner.sln | 2 +- NiceHashMiner/Forms/Form_Main.Designer.cs | 1 + .../Miners/ExtraLaunchParametersParser.cs | 16 ++-- NiceHashMiner/Miners/Miner.cs | 6 +- NiceHashMiner/Miners/sgminer.cs | 13 ++- 6 files changed, 109 insertions(+), 12 deletions(-) diff --git a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.vcxproj b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.vcxproj index 6aca6fc..1554203 100644 --- a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.vcxproj +++ b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.vcxproj @@ -1,10 +1,18 @@  + + Debug + Win32 + Debug x64 + + Release + Win32 + Release x64 @@ -22,6 +30,12 @@ v120 Unicode + + Application + true + v120 + Unicode + Application false @@ -29,24 +43,43 @@ true Unicode + + Application + false + v120 + true + Unicode + + + + + + + true $(SolutionDir)$(Configuration)\ + + true + false $(SolutionDir)$(Configuration)\ + + false + @@ -67,6 +100,29 @@ copy /Y "$(AMDAPPSDKROOT)\bin\x86_64\OpenCL.dll" "$(SolutionDir)$(Configuration)\OpenCL.dll" REM the path is absolute maybe fix copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT\msvcp120.dll" "$(SolutionDir)$(Configuration)\msvcp120.dll" +copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT\msvcr120.dll" "$(SolutionDir)$(Configuration)\msvcr120.dll" + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + .;$(AMDAPPSDKROOT)\include\;%(AdditionalIncludeDirectories) + + + Console + true + OpenCL.lib;%(AdditionalDependencies) + $(AMDAPPSDKROOT)\lib\x86\ + + + copy /Y "$(AMDAPPSDKROOT)\bin\x86_64\OpenCL.dll" "$(SolutionDir)$(Configuration)\OpenCL.dll" +REM the path is absolute maybe fix +copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT\msvcp120.dll" "$(SolutionDir)$(Configuration)\msvcp120.dll" copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT\msvcr120.dll" "$(SolutionDir)$(Configuration)\msvcr120.dll" @@ -94,6 +150,33 @@ copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Micro copy /Y "$(AMDAPPSDKROOT)\bin\x86_64\OpenCL.dll" "$(SolutionDir)$(Configuration)\OpenCL.dll" REM the path is absolute maybe fix copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT\msvcp120.dll" "$(SolutionDir)$(Configuration)\msvcp120.dll" +copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT\msvcr120.dll" "$(SolutionDir)$(Configuration)\msvcr120.dll" + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + .;$(AMDAPPSDKROOT)\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(AMDAPPSDKROOT)\lib\x86\ + OpenCL.lib;%(AdditionalDependencies) + + + copy /Y "$(AMDAPPSDKROOT)\bin\x86_64\OpenCL.dll" "$(SolutionDir)$(Configuration)\OpenCL.dll" +REM the path is absolute maybe fix +copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT\msvcp120.dll" "$(SolutionDir)$(Configuration)\msvcp120.dll" copy /Y "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT\msvcr120.dll" "$(SolutionDir)$(Configuration)\msvcr120.dll" diff --git a/NiceHashMiner.sln b/NiceHashMiner.sln index d9526ef..abe500e 100644 --- a/NiceHashMiner.sln +++ b/NiceHashMiner.sln @@ -116,7 +116,7 @@ Global {36DC07F9-A4A6-4877-A146-1B960083CF6F}.Release|Win32.Build.0 = Release|x64 {36DC07F9-A4A6-4877-A146-1B960083CF6F}.Release|x64.ActiveCfg = Release|x64 {36DC07F9-A4A6-4877-A146-1B960083CF6F}.Release|x64.Build.0 = Release|x64 - {F4D88D6A-2321-4431-AFD1-8B6A1760358B}.Debug|Any CPU.ActiveCfg = Debug|x64 + {F4D88D6A-2321-4431-AFD1-8B6A1760358B}.Debug|Any CPU.ActiveCfg = Debug|Win32 {F4D88D6A-2321-4431-AFD1-8B6A1760358B}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 {F4D88D6A-2321-4431-AFD1-8B6A1760358B}.Debug|Mixed Platforms.Build.0 = Debug|x64 {F4D88D6A-2321-4431-AFD1-8B6A1760358B}.Debug|Win32.ActiveCfg = Debug|x64 diff --git a/NiceHashMiner/Forms/Form_Main.Designer.cs b/NiceHashMiner/Forms/Form_Main.Designer.cs index 0ff3af5..f26aca2 100644 --- a/NiceHashMiner/Forms/Form_Main.Designer.cs +++ b/NiceHashMiner/Forms/Form_Main.Designer.cs @@ -390,6 +390,7 @@ private void InitializeComponent() this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; + this.MinimumSize = new System.Drawing.Size(581, 330); this.Name = "Form_Main"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "NiceHash Miner"; diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index f0458ad..8192657 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -78,7 +78,7 @@ private static void LogParser(string msg) { private static string Parse(List CDevs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); - Dictionary paramsFlags = new Dictionary(); + //Dictionary paramsFlags = new Dictionary(); Dictionary> cdevOptions = new Dictionary>(); Dictionary isOptionDefaults = new Dictionary(); Dictionary isOptionExist = new Dictionary(); @@ -86,17 +86,21 @@ private static string Parse(List CDevs, List options foreach (var cDev in CDevs) { var defaults = new Dictionary(); foreach (var option in options) { - defaults.Add(option.Type, option.Default); + //defaults.Add(option.Type, option.Default); + defaults[option.Type] = option.Default; } - cdevOptions.Add(cDev.UUID, defaults); + //cdevOptions.Add(cDev.UUID, defaults); + cdevOptions[cDev.UUID] = defaults; } // init order and params flags, and params list foreach (var option in options) { MinerOptionType optionType = option.Type; optionsOrder.Add(optionType); - paramsFlags.Add(optionType, option.LongName); - isOptionDefaults.Add(option.Type, true); - isOptionExist.Add(option.Type, false); + + //isOptionDefaults.Add(optionType, true); + //isOptionExist.Add(optionType, false); + isOptionDefaults[optionType] = true; + isOptionExist[optionType] = false; } // parse foreach (var cDev in CDevs) { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 1028897..7c983e6 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -95,8 +95,8 @@ protected Algorithm BenchmarkAlgorithm { _benchmarkAlgorithm = value; } } - public BenchmarkProcessStatus BenchmarkProcessStatus { get; private set; } - private string BenchmarkProcessPath; + public BenchmarkProcessStatus BenchmarkProcessStatus { get; protected set; } + protected string BenchmarkProcessPath { get; private set; } private Process BenchmarkHandle = null; protected Exception BenchmarkException = null; protected int BenchmarkTimeInSeconds; @@ -435,7 +435,7 @@ protected double BenchmarkParseLine_cpu_ccminer_extra(string outdata) { // killing proccesses can take time virtual public void EndBenchmarkProcces() { - if (BenchmarkHandle != null && BenchmarkProcessStatus != BenchmarkProcessStatus.Killing) { + if (BenchmarkHandle != null && BenchmarkProcessStatus != BenchmarkProcessStatus.Killing && BenchmarkProcessStatus != BenchmarkProcessStatus.DoneKilling) { BenchmarkProcessStatus = BenchmarkProcessStatus.Killing; try { Helpers.ConsolePrint("BENCHMARK", String.Format("Trying to kill benchmark process {0} algorithm {1}", BenchmarkProcessPath, BenchmarkAlgorithm.NiceHashName)); diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index fffffc3..8076731 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -44,8 +44,17 @@ public void KillSGMiner() { } public override void EndBenchmarkProcces() { - base.EndBenchmarkProcces(); - KillSGMiner(); + if (BenchmarkProcessStatus != BenchmarkProcessStatus.Killing && BenchmarkProcessStatus != BenchmarkProcessStatus.DoneKilling) { + BenchmarkProcessStatus = BenchmarkProcessStatus.Killing; + try { + Helpers.ConsolePrint("BENCHMARK", String.Format("Trying to kill benchmark process {0} algorithm {1}", BenchmarkProcessPath, BenchmarkAlgorithm.NiceHashName)); + KillSGMiner(); + } catch { } finally { + BenchmarkProcessStatus = BenchmarkProcessStatus.DoneKilling; + Helpers.ConsolePrint("BENCHMARK", String.Format("Benchmark process {0} algorithm {1} KILLED", BenchmarkProcessPath, BenchmarkAlgorithm.NiceHashName)); + //BenchmarkHandle = null; + } + } } protected override int GET_MAX_CooldownTimeInMilliseconds() { From d62e7bca2dcfd8a07a9df195a37e4458b74532c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 27 Sep 2016 19:01:12 +0200 Subject: [PATCH 051/366] resizing fix, CultureInfo invoke after .NET45 check, code cleanup --- NiceHashMiner/Configs/BaseConfigFile.cs | 6 ------ NiceHashMiner/Configs/ConfigManager.cs | 1 + .../Configs/DeviceBenchmarkConfig.cs | 19 ------------------- .../Configs/DeviceBenchmarkConfigManager.cs | 1 + NiceHashMiner/Configs/GeneralConfig.cs | 7 ------- NiceHashMiner/Forms/Form_Main.cs | 15 ++++++++------- NiceHashMiner/Program.cs | 3 --- 7 files changed, 10 insertions(+), 42 deletions(-) diff --git a/NiceHashMiner/Configs/BaseConfigFile.cs b/NiceHashMiner/Configs/BaseConfigFile.cs index 2677019..682dae6 100644 --- a/NiceHashMiner/Configs/BaseConfigFile.cs +++ b/NiceHashMiner/Configs/BaseConfigFile.cs @@ -87,11 +87,5 @@ public void Commit() { Helpers.ConsolePrint("BaseConfigFile", String.Format("Commit {0}: exception {1}", FilePath, ex.ToString())); } } - - public bool ConfigFileExist() { - return File.Exists(FilePath); - } - - } } diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index 6b84c20..af5bff6 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -12,6 +12,7 @@ public partial class ConfigManager : BaseLazySingleton { private readonly string TAG; + // constructor has references don't delete it protected ConfigManager() { TAG = this.GetType().Name; GeneralConfig = new GeneralConfig(true); diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs index 8bacc65..12eca8e 100644 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs +++ b/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs @@ -43,25 +43,6 @@ public DeviceBenchmarkConfig(DeviceGroupType deviceGroupType, } IsAlgorithmSettingsInit = false; - - // calculate ID - //ID = GetId(); - } - - public static string GetId(DeviceGroupType deviceGroupType, - string deviceGroupName) { - var SHA256 = new SHA256Managed(); - var hash = new StringBuilder(); - string mixedAttr = ((int)deviceGroupType).ToString() + deviceGroupName; - byte[] hashedBytes = SHA256.ComputeHash(Encoding.UTF8.GetBytes(mixedAttr), 0, Encoding.UTF8.GetByteCount(mixedAttr)); - foreach (var b in hashedBytes) { - hash.Append(b.ToString("x2")); - } - return hash.ToString(); - } - - private string GetId() { - return GetId(DeviceGroupType, DeviceName); } protected override void InitializePaths() { diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs index 470848d..a753c9a 100644 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs +++ b/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs @@ -18,6 +18,7 @@ public Dictionary BenchmarkConfigs { } } + // constructor has references don't delete it protected DeviceBenchmarkConfigManager() { _benchmarkConfigs = new Dictionary(); } diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index 9ba415c..7250ab5 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -269,12 +269,5 @@ public void AfterDeviceQueryInitialization() { LastDevicesSettup = ComputeDevice.AllAvaliableDevices; } - - public void Delete() { - try { - File.Delete(FilePath); - } catch { - } - } } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index c34889b..bfa63b3 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -48,11 +48,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - - const int MINIMUM_HEIGHT = 330 - 50; - const int MINIMUM_WIDTH = 581; - - + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; @@ -80,6 +76,7 @@ public Form_Main() label_NotProfitable.Visible = false; InitMainConfigGUIData(); + // for resizing InitFlowPanelStart(); ClearRatesALL(); @@ -187,7 +184,11 @@ private void StartupTimer_Tick(object sender, EventArgs e) this.Close(); return; - } + } + + // + CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; if (!Helpers.InternalCheckIsWow64()) { MessageBox.Show(International.GetText("Form_Main_x64_Support_Only"), @@ -413,7 +414,7 @@ public void ClearRates(int groupCount) { var oldHeight = groupBox1.Size.Height; groupBox1.Size = new Size(groupBox1.Size.Width, (visibleGroupCount) * 40); // set new height - this.Size = new Size(MINIMUM_WIDTH, MINIMUM_HEIGHT + groupBox1.Size.Height); + this.Size = new Size(this.Size.Width, this.Size.Height + groupBox1.Size.Height - oldHeight); } public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPIData, double paying, bool isApiGetException) { diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index 814af4e..6781a4c 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -22,9 +22,6 @@ static void Main(string[] argv) Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - - CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture; - CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; //Console.OutputEncoding = System.Text.Encoding.Unicode; // #0 set this first so data parsing will work correctly From 16b38619e6f551dae176e034d3caebd030afa51d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 28 Sep 2016 13:26:32 +0200 Subject: [PATCH 052/366] auto resize fixes, removed unused code --- NiceHashMiner/Devices/GroupAlgorithms.cs | 3 - .../Forms/Form_ChooseLanguage.Designer.cs | 3 +- NiceHashMiner/Forms/Form_ChooseLanguage.resx | 4 +- .../Forms/Form_ChooseLanguage_r.Designer.cs | 84 ++++++++++++ NiceHashMiner/Forms/Form_ChooseLanguage_r.cs | 38 ++++++ .../Forms/Form_ChooseLanguage_r.resx | 120 ++++++++++++++++++ NiceHashMiner/Forms/Form_Main.cs | 11 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 1 - NiceHashMiner/Forms/Form_Settings.cs | 6 +- NiceHashMiner/NiceHashMiner.csproj | 9 ++ NiceHashMiner/Program.cs | 3 +- 11 files changed, 267 insertions(+), 15 deletions(-) create mode 100644 NiceHashMiner/Forms/Form_ChooseLanguage_r.Designer.cs create mode 100644 NiceHashMiner/Forms/Form_ChooseLanguage_r.cs create mode 100644 NiceHashMiner/Forms/Form_ChooseLanguage_r.resx diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 75fb928..14a566f 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -10,9 +10,6 @@ namespace NiceHashMiner.Devices { /// public static class GroupAlgorithms { - private static Dictionary> _keys = new Dictionary>(); - - public static Dictionary CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { if (DeviceGroupType.CPU == deviceGroupType) { return new Dictionary() { diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs index 562afa9..50dd44b 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs @@ -63,8 +63,7 @@ private void InitializeComponent() // // Form_ChooseLanguage // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(334, 91); this.ControlBox = false; this.Controls.Add(this.button_OK); diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.resx b/NiceHashMiner/Forms/Form_ChooseLanguage.resx index 7080a7d..1af7de1 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.resx +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.resx @@ -112,9 +112,9 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.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/NiceHashMiner/Forms/Form_ChooseLanguage_r.Designer.cs b/NiceHashMiner/Forms/Form_ChooseLanguage_r.Designer.cs new file mode 100644 index 0000000..413f263 --- /dev/null +++ b/NiceHashMiner/Forms/Form_ChooseLanguage_r.Designer.cs @@ -0,0 +1,84 @@ +namespace NiceHashMiner.Forms { + partial class Form_ChooseLanguage_r { + /// + /// 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.label_Instruction = new System.Windows.Forms.Label(); + this.comboBox_Languages = new System.Windows.Forms.ComboBox(); + this.button_OK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label_Instruction + // + this.label_Instruction.AutoSize = true; + this.label_Instruction.Location = new System.Drawing.Point(52, 9); + this.label_Instruction.Name = "label_Instruction"; + this.label_Instruction.Size = new System.Drawing.Size(231, 13); + this.label_Instruction.TabIndex = 0; + this.label_Instruction.Text = "Choose a default language for NiceHash Miner:"; + // + // comboBox_Languages + // + this.comboBox_Languages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox_Languages.FormattingEnabled = true; + this.comboBox_Languages.Location = new System.Drawing.Point(66, 29); + this.comboBox_Languages.Name = "comboBox_Languages"; + this.comboBox_Languages.Size = new System.Drawing.Size(195, 21); + this.comboBox_Languages.TabIndex = 1; + // + // button_OK + // + this.button_OK.Location = new System.Drawing.Point(110, 56); + this.button_OK.Name = "button_OK"; + this.button_OK.Size = new System.Drawing.Size(106, 23); + this.button_OK.TabIndex = 2; + this.button_OK.Text = "OK"; + this.button_OK.UseVisualStyleBackColor = true; + this.button_OK.Click += new System.EventHandler(this.button_OK_Click); + // + // Form_ChooseLanguage_r + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(334, 91); + this.Controls.Add(this.button_OK); + this.Controls.Add(this.comboBox_Languages); + this.Controls.Add(this.label_Instruction); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Form_ChooseLanguage_r"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Choose Language"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label_Instruction; + private System.Windows.Forms.ComboBox comboBox_Languages; + private System.Windows.Forms.Button button_OK; + } +} \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs b/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs new file mode 100644 index 0000000..e72830f --- /dev/null +++ b/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs @@ -0,0 +1,38 @@ +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; +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 NiceHashMiner.Forms { + public partial class Form_ChooseLanguage_r : Form { + public Form_ChooseLanguage_r() { + InitializeComponent(); + + // Add language selections list + Dictionary lang = International.GetAvailableLanguages(); + + comboBox_Languages.Items.Clear(); + for (int i = 0; i < lang.Count; i++) { + comboBox_Languages.Items.Add(lang[(LanguageType)i]); + } + + comboBox_Languages.SelectedIndex = 0; + + label_Instruction.Location = new Point((this.Width - label_Instruction.Size.Width) / 2, label_Instruction.Location.Y); + button_OK.Location = new Point((this.Width - button_OK.Size.Width) / 2, button_OK.Location.Y); + comboBox_Languages.Location = new Point((this.Width - comboBox_Languages.Size.Width) / 2, comboBox_Languages.Location.Y); + } + + private void button_OK_Click(object sender, EventArgs e) { + ConfigManager.Instance.GeneralConfig.Language = (LanguageType)comboBox_Languages.SelectedIndex; + this.Close(); + } + } +} diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage_r.resx b/NiceHashMiner/Forms/Form_ChooseLanguage_r.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/NiceHashMiner/Forms/Form_ChooseLanguage_r.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/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index bfa63b3..43fc051 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -398,6 +398,7 @@ public void ClearRatesALL() { } public void ClearRates(int groupCount) { + float panelHeight = -1; if (flowLayoutPanelVisibleCount != groupCount) { flowLayoutPanelVisibleCount = groupCount; // hide some Controls @@ -410,9 +411,17 @@ public void ClearRates(int groupCount) { flowLayoutPanelRatesIndex = 0; int visibleGroupCount = groupCount + 1; if (visibleGroupCount <= 0) visibleGroupCount = 1; + if (panelHeight <= 0) { + if (flowLayoutPanelRates.Controls != null && flowLayoutPanelRates.Controls.Count > 0) { + var control = flowLayoutPanelRates.Controls[0]; + panelHeight = ((GroupProfitControl)control).Size.Height; + } else { + panelHeight = 40; + } + } var oldHeight = groupBox1.Size.Height; - groupBox1.Size = new Size(groupBox1.Size.Width, (visibleGroupCount) * 40); + groupBox1.Size = new Size(groupBox1.Size.Width, (int)( (visibleGroupCount) * panelHeight )); // set new height this.Size = new Size(this.Size.Width, this.Size.Height + groupBox1.Size.Height - oldHeight); } diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index ec98b1f..14127ff 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -1381,7 +1381,6 @@ private void InitializeComponent() { this.Name = "Form_Settings"; this.Text = "Settings"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormSettings_FormClosing); - this.Resize += new System.EventHandler(this.Form_Settings_Resize); this.tabControlGeneral.ResumeLayout(false); this.tabPageGeneral.ResumeLayout(false); this.groupBox_Misc.ResumeLayout(false); diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 91155d6..4281427 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -771,11 +771,7 @@ private void currencyConverterCombobox_SelectedIndexChanged(object sender, Event ConfigManager.Instance.GeneralConfig.DisplayCurrency = Selected; } - #endregion Form Callbacks - - private void Form_Settings_Resize(object sender, EventArgs e) { - pictureBox_MinProfit.Location = new Point(label_MinProfit.Location.X + label_MinProfit.Size.Width, pictureBox_MinProfit.Location.Y); - } + #endregion Form Callbacks private void tabControlGeneral_Selected(object sender, TabControlEventArgs e) { // set first device selected { diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 4a8bc86..31cdd7c 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -155,6 +155,12 @@ Form_Benchmark.cs + + Form + + + Form_ChooseLanguage_r.cs + Form @@ -268,6 +274,9 @@ Form_Benchmark.cs + + Form_ChooseLanguage_r.cs + Form_Settings.cs diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index 6781a4c..adebe72 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -51,7 +51,8 @@ static void Main(string[] argv) if (!ConfigManager.Instance.GeneralConfig.IsFileExist() && !commandLineArgs.IsLang) { Helpers.ConsolePrint("NICEHASH", "No config file found. Running NiceHash Miner for the first time. Choosing a default language."); - Application.Run(new Form_ChooseLanguage()); + //Application.Run(new Form_ChooseLanguage()); + Application.Run(new Form_ChooseLanguage_r()); } // Init languages From ebdbc3d8b252e2eee03757d3cfef9534ed464584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 28 Sep 2016 17:31:33 +0200 Subject: [PATCH 053/366] check if all devices disabled when start mining warning, removed unused code --- .../Forms/Form_ChooseLanguage.Designer.cs | 88 ------------- NiceHashMiner/Forms/Form_ChooseLanguage.cs | 41 ------ NiceHashMiner/Forms/Form_ChooseLanguage.resx | 120 ------------------ NiceHashMiner/Forms/Form_Main.cs | 16 +++ NiceHashMiner/NiceHashMiner.csproj | 9 -- NiceHashMiner/langs/en.lang | 3 +- 6 files changed, 18 insertions(+), 259 deletions(-) delete mode 100644 NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs delete mode 100644 NiceHashMiner/Forms/Form_ChooseLanguage.cs delete mode 100644 NiceHashMiner/Forms/Form_ChooseLanguage.resx diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs deleted file mode 100644 index 50dd44b..0000000 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs +++ /dev/null @@ -1,88 +0,0 @@ -namespace NiceHashMiner -{ - partial class Form_ChooseLanguage - { - /// - /// 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.label_Instruction = new System.Windows.Forms.Label(); - this.comboBox_Languages = new System.Windows.Forms.ComboBox(); - this.button_OK = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // label_Instruction - // - this.label_Instruction.AutoSize = true; - this.label_Instruction.Location = new System.Drawing.Point(59, 9); - this.label_Instruction.Name = "label_Instruction"; - this.label_Instruction.Size = new System.Drawing.Size(231, 13); - this.label_Instruction.TabIndex = 0; - this.label_Instruction.Text = "Choose a default language for NiceHash Miner:"; - // - // comboBox_Languages - // - this.comboBox_Languages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBox_Languages.FormattingEnabled = true; - this.comboBox_Languages.Location = new System.Drawing.Point(84, 29); - this.comboBox_Languages.Name = "comboBox_Languages"; - this.comboBox_Languages.Size = new System.Drawing.Size(180, 21); - this.comboBox_Languages.TabIndex = 1; - // - // button_OK - // - this.button_OK.Location = new System.Drawing.Point(119, 56); - this.button_OK.Name = "button_OK"; - this.button_OK.Size = new System.Drawing.Size(110, 23); - this.button_OK.TabIndex = 2; - this.button_OK.Text = "&OK"; - this.button_OK.UseVisualStyleBackColor = true; - this.button_OK.Click += new System.EventHandler(this.button_OK_Click); - // - // Form_ChooseLanguage - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.ClientSize = new System.Drawing.Size(334, 91); - this.ControlBox = false; - this.Controls.Add(this.button_OK); - this.Controls.Add(this.comboBox_Languages); - this.Controls.Add(this.label_Instruction); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.Name = "Form_ChooseLanguage"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Choose Language"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label_Instruction; - private System.Windows.Forms.ComboBox comboBox_Languages; - private System.Windows.Forms.Button button_OK; - } -} \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.cs deleted file mode 100644 index 970f4b8..0000000 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using NiceHashMiner.Configs; -using NiceHashMiner.Enums; - -namespace NiceHashMiner -{ - public partial class Form_ChooseLanguage : Form - { - public Form_ChooseLanguage() - { - InitializeComponent(); - - // Add language selections list - Dictionary lang = International.GetAvailableLanguages(); - - comboBox_Languages.Items.Clear(); - for (int i = 0; i < lang.Count; i++) - { - comboBox_Languages.Items.Add(lang[(LanguageType)i]); - } - - comboBox_Languages.SelectedIndex = 0; - - label_Instruction.Location = new Point((this.Width - label_Instruction.Size.Width) / 2, label_Instruction.Location.Y); - button_OK.Location = new Point((this.Width - button_OK.Size.Width) / 2, button_OK.Location.Y); - comboBox_Languages.Location = new Point((this.Width - comboBox_Languages.Size.Width) / 2, comboBox_Languages.Location.Y); - } - - private void button_OK_Click(object sender, EventArgs e) - { - ConfigManager.Instance.GeneralConfig.Language = (LanguageType)comboBox_Languages.SelectedIndex; - this.Close(); - } - } -} diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.resx b/NiceHashMiner/Forms/Form_ChooseLanguage.resx deleted file mode 100644 index 1af7de1..0000000 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 43fc051..b258f56 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -747,6 +747,22 @@ private void buttonStartMining_Click(object sender, EventArgs e) } } + // check if any device enabled + // check devices without benchmarks + bool noDeviceEnabled = true; + foreach (var cdev in ComputeDevice.AllAvaliableDevices) { + if (cdev.ComputeDeviceEnabledOption.IsEnabled) { + noDeviceEnabled = false; + break; + } + } + if (noDeviceEnabled) { + DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_For_Mining"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + textBoxBTCAddress.Enabled = false; textBoxWorkerName.Enabled = false; comboBoxLocation.Enabled = false; diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 31cdd7c..c68b867 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -167,12 +167,6 @@ Form_Settings.cs - - Form - - - Form_ChooseLanguage.cs - @@ -280,9 +274,6 @@ Form_Settings.cs - - Form_ChooseLanguage.cs - DriverVersionConfirmationDialog.cs diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index a4e3cf8..c121dc6 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -319,6 +319,7 @@ "Form_Settings_ToolTip_DisableDefaultOptimizations": "When checked it disables all default optimization settings, making mining potentially more stable but significantly slower (especially for AMD cards).", "Form_Settings_Text_DisableDefaultOptimizations": "Disable Default Optimizations", "AlgorithmsListView_ContextMenu_DisableAll": "Disable All Algorithms", - "AlgorithmsListView_ContextMenu_EnableAll" : "Enable All Algorithms", + "AlgorithmsListView_ContextMenu_EnableAll": "Enable All Algorithms", + "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable all or some devices to proceed mining.", } } \ No newline at end of file From 9edff21be69576a4641d9fdff299ae1b27fcad38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 28 Sep 2016 17:45:53 +0200 Subject: [PATCH 054/366] version bump, new download link --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- NiceHashMiner/Utils/MinersDownloadManager.cs | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 610d888..c6c5599 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.1.4")] -[assembly: AssemblyFileVersion("1.7.1.4")] +[assembly: AssemblyVersion("1.7.2.0")] +[assembly: AssemblyFileVersion("1.7.2.0")] diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index b1a0c72..3233bfd 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -26,7 +26,8 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Wed, 28 Sep 2016 18:01:56 +0200 Subject: [PATCH 055/366] langauge msg fix, scale fix --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/langs/en.lang | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index b258f56..02bc03c 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -414,7 +414,7 @@ public void ClearRates(int groupCount) { if (panelHeight <= 0) { if (flowLayoutPanelRates.Controls != null && flowLayoutPanelRates.Controls.Count > 0) { var control = flowLayoutPanelRates.Controls[0]; - panelHeight = ((GroupProfitControl)control).Size.Height; + panelHeight = ((GroupProfitControl)control).Size.Height * 1.2f; } else { panelHeight = 40; } diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index c121dc6..b1c8071 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -320,6 +320,6 @@ "Form_Settings_Text_DisableDefaultOptimizations": "Disable Default Optimizations", "AlgorithmsListView_ContextMenu_DisableAll": "Disable All Algorithms", "AlgorithmsListView_ContextMenu_EnableAll": "Enable All Algorithms", - "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable all or some devices to proceed mining.", + "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable at least 1 device to proceed mining.", } } \ No newline at end of file From d94b8bfb62f989d7862649779ed1f3540914a664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 28 Sep 2016 18:08:04 +0200 Subject: [PATCH 056/366] russian translation update --- NiceHashMiner/langs/ru.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index c1c6f85..6da3527 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -64,6 +64,7 @@ "Form_Main_msgbox_buttonBenchmarkRestartWarningTitle":"Перезагрузка {0}", "Form_Main_msgbox_buttonBenchmarkRestartWarningMsg":"Работа {0} завершится. Этот новое диалоговое окно еще тестируется и {0} нужен перезапуск для результата.", "Form_Main_msgbox_anti_botnet_msgbox": "NiceHash Miner обнаружил изменение ID оборудования. Если вы не загружали и не устанавливали NiceHash Miner, ваш компьютер может быть взломан. В этом случае, мы советуем вам установить антивирус или переустановить ваш Windows.\r\n\r\nПродолжить работу с NiceHash Miner?", + "Form_Main_No_Device_Enabled_For_Mining": "Предупреждение: устройства для майнинга не были включены. Включите, пожалуйста, хотя-бы одно устройство для запуска майнинга.", "Form_Benchmark_title":"Бенчмарк", From 39452c27497de8b6fa5af22cd0467eda16e4abd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 29 Sep 2016 08:34:41 +0200 Subject: [PATCH 057/366] prevent restarting when stopped --- NiceHashMiner/Miners/Miner.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 7c983e6..251a3cd 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -119,6 +119,8 @@ protected Algorithm BenchmarkAlgorithm { private int _currentCooldownTimeInSecondsLeft = _MIN_CooldownTimeInMilliseconds; private const int IS_COOLDOWN_CHECK_TIMER_ALIVE_CAP = 15; + private bool isEnded = false; + public Miner(DeviceType deviceType, string minerDeviceName) { MINER_ID = MINER_ID_COUNT++; @@ -245,6 +247,7 @@ virtual public void Stop(MinerStopType willswitch = MinerStopType.SWITCH, bool n } public void End() { + isEnded = true; Stop(MinerStopType.FORCE_END); CurrentAlgorithmType = AlgorithmType.NONE; CurrentRate = 0; @@ -545,6 +548,7 @@ virtual protected NiceHashProcess _Start() Helpers.ConsolePrint(MinerTAG(), "Starting miner " + ProcessTag() + " " + LastCommandLine); StartCoolDownTimerChecker(); + isEnded = false; return P; } else { @@ -600,10 +604,12 @@ protected bool UpdateBindPortCommand_ccminer_cpuminer(int oldPort, int newPort) } private void Restart() { - Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Restarting miner.."); - Stop(MinerStopType.END); // stop miner first - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - ProcessHandle = _Start(); // start with old command line + if (!isEnded) { + Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Restarting miner.."); + Stop(MinerStopType.END); // stop miner first + System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + ProcessHandle = _Start(); // start with old command line + } } protected void FillAlgorithm(string aname, ref APIData AD) { From 264854024362ae99fea2b985446a76637c7ed373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 29 Sep 2016 08:42:50 +0200 Subject: [PATCH 058/366] benchmark device setting logic change --- NiceHashMiner/Forms/Form_Benchmark.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 46bbe7c..299c678 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -92,7 +92,7 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm // benchmark only unique devices devicesListViewEnableControl1.SetIListItemCheckColorSetter(this); - devicesListViewEnableControl1.SetAllEnabled = true; + //devicesListViewEnableControl1.SetAllEnabled = true; //devicesListViewEnableControl1.SaveToGeneralConfig = true; devicesListViewEnableControl1.SetComputeDevices(ComputeDevice.AllAvaliableDevices); @@ -526,14 +526,16 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e ConfigManager.Instance.CommitBenchmarks(); // check devices without benchmarks foreach (var cdev in ComputeDevice.AllAvaliableDevices) { - bool Enabled = false; - foreach (var algo in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { - if (algo.Value.BenchmarkSpeed > 0) { - Enabled = true; - break; + if (cdev.ComputeDeviceEnabledOption.IsEnabled) { + bool Enabled = false; + foreach (var algo in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { + if (algo.Value.BenchmarkSpeed > 0) { + Enabled = true; + break; + } } + cdev.ComputeDeviceEnabledOption.IsEnabled = Enabled; } - cdev.ComputeDeviceEnabledOption.IsEnabled = Enabled; } devicesListViewEnableControl1.SaveOptions(); } From acf4ace7596ec90cb0121912c32e42b8d5ac2ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 29 Sep 2016 09:59:51 +0200 Subject: [PATCH 059/366] icon update --- .../Forms/Form_Benchmark.Designer.cs | 52 +- NiceHashMiner/Forms/Form_Benchmark.resx | 5958 +++++++++++++---- NiceHashMiner/Forms/Form_Main.resx | 5958 +++++++++++++---- NiceHashMiner/Forms/Form_Settings.Designer.cs | 134 +- NiceHashMiner/Forms/Form_Settings.resx | 5958 +++++++++++++---- NiceHashMiner/Resources/logo.ico | Bin 71959 -> 285478 bytes 6 files changed, 14367 insertions(+), 3693 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.Designer.cs b/NiceHashMiner/Forms/Form_Benchmark.Designer.cs index 09e84d3..f3b7e78 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.Designer.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.Designer.cs @@ -29,11 +29,11 @@ private void InitializeComponent() { this.groupBoxBenchmarkProgress = new System.Windows.Forms.GroupBox(); this.labelBenchmarkSteps = new System.Windows.Forms.Label(); this.progressBarBenchmarkSteps = new System.Windows.Forms.ProgressBar(); + this.radioButton_SelectedUnbenchmarked = new System.Windows.Forms.RadioButton(); + this.radioButton_RE_SelectedUnbenchmarked = new System.Windows.Forms.RadioButton(); this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.benchmarkOptions1 = new NiceHashMiner.Forms.Components.BenchmarkOptions(); this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); - this.radioButton_SelectedUnbenchmarked = new System.Windows.Forms.RadioButton(); - this.radioButton_RE_SelectedUnbenchmarked = new System.Windows.Forms.RadioButton(); this.groupBoxBenchmarkProgress.SuspendLayout(); this.SuspendLayout(); // @@ -84,6 +84,30 @@ private void InitializeComponent() { this.progressBarBenchmarkSteps.Size = new System.Drawing.Size(161, 23); this.progressBarBenchmarkSteps.TabIndex = 108; // + // radioButton_SelectedUnbenchmarked + // + this.radioButton_SelectedUnbenchmarked.AutoSize = true; + this.radioButton_SelectedUnbenchmarked.Checked = true; + this.radioButton_SelectedUnbenchmarked.Location = new System.Drawing.Point(21, 295); + this.radioButton_SelectedUnbenchmarked.Name = "radioButton_SelectedUnbenchmarked"; + this.radioButton_SelectedUnbenchmarked.Size = new System.Drawing.Size(260, 17); + this.radioButton_SelectedUnbenchmarked.TabIndex = 110; + this.radioButton_SelectedUnbenchmarked.TabStop = true; + this.radioButton_SelectedUnbenchmarked.Text = "Benchmark Selected Unbenchmarked Algorithms "; + this.radioButton_SelectedUnbenchmarked.UseVisualStyleBackColor = true; + this.radioButton_SelectedUnbenchmarked.CheckedChanged += new System.EventHandler(this.radioButton_SelectedUnbenchmarked_CheckedChanged_1); + // + // radioButton_RE_SelectedUnbenchmarked + // + this.radioButton_RE_SelectedUnbenchmarked.AutoSize = true; + this.radioButton_RE_SelectedUnbenchmarked.Location = new System.Drawing.Point(21, 318); + this.radioButton_RE_SelectedUnbenchmarked.Name = "radioButton_RE_SelectedUnbenchmarked"; + this.radioButton_RE_SelectedUnbenchmarked.Size = new System.Drawing.Size(192, 17); + this.radioButton_RE_SelectedUnbenchmarked.TabIndex = 110; + this.radioButton_RE_SelectedUnbenchmarked.Text = "Benchmark All Selected Algorithms "; + this.radioButton_RE_SelectedUnbenchmarked.UseVisualStyleBackColor = true; + this.radioButton_RE_SelectedUnbenchmarked.CheckedChanged += new System.EventHandler(this.radioButton_RE_SelectedUnbenchmarked_CheckedChanged); + // // algorithmsListView1 // this.algorithmsListView1.BenchmarkCalculation = null; @@ -115,30 +139,6 @@ private void InitializeComponent() { this.devicesListViewEnableControl1.Size = new System.Drawing.Size(376, 112); this.devicesListViewEnableControl1.TabIndex = 0; // - // radioButton_SelectedUnbenchmarked - // - this.radioButton_SelectedUnbenchmarked.AutoSize = true; - this.radioButton_SelectedUnbenchmarked.Checked = true; - this.radioButton_SelectedUnbenchmarked.Location = new System.Drawing.Point(21, 295); - this.radioButton_SelectedUnbenchmarked.Name = "radioButton_SelectedUnbenchmarked"; - this.radioButton_SelectedUnbenchmarked.Size = new System.Drawing.Size(260, 17); - this.radioButton_SelectedUnbenchmarked.TabIndex = 110; - this.radioButton_SelectedUnbenchmarked.TabStop = true; - this.radioButton_SelectedUnbenchmarked.Text = "Benchmark Selected Unbenchmarked Algorithms "; - this.radioButton_SelectedUnbenchmarked.UseVisualStyleBackColor = true; - this.radioButton_SelectedUnbenchmarked.CheckedChanged += new System.EventHandler(this.radioButton_SelectedUnbenchmarked_CheckedChanged_1); - // - // radioButton_RE_SelectedUnbenchmarked - // - this.radioButton_RE_SelectedUnbenchmarked.AutoSize = true; - this.radioButton_RE_SelectedUnbenchmarked.Location = new System.Drawing.Point(21, 318); - this.radioButton_RE_SelectedUnbenchmarked.Name = "radioButton_RE_SelectedUnbenchmarked"; - this.radioButton_RE_SelectedUnbenchmarked.Size = new System.Drawing.Size(192, 17); - this.radioButton_RE_SelectedUnbenchmarked.TabIndex = 110; - this.radioButton_RE_SelectedUnbenchmarked.Text = "Benchmark All Selected Algorithms "; - this.radioButton_RE_SelectedUnbenchmarked.UseVisualStyleBackColor = true; - this.radioButton_RE_SelectedUnbenchmarked.CheckedChanged += new System.EventHandler(this.radioButton_RE_SelectedUnbenchmarked_CheckedChanged); - // // Form_Benchmark // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/NiceHashMiner/Forms/Form_Benchmark.resx b/NiceHashMiner/Forms/Form_Benchmark.resx index 31d6164..6302e34 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.resx +++ b/NiceHashMiner/Forms/Form_Benchmark.resx @@ -120,1206 +120,4764 @@ - AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAGd4AAK4EAAAgIAAAAQAgAKgQAADH4gAAMDAAAAEA - IACoJQAAb/MAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAQQFGhdFVoMogKHNMZvE8DGawu4ofZ3JFD9PfAECAxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACFkRWhz6/6/xCyv7/QMr+/0HK/v9Dyv7/RMv+/0XL/v8/uOb6FDpIeAAAAAAAAAAAAAAAAAAA - AAAAAAACImqFtEHK/f9Gz/7/Qcr+/0HF9/85p9D/O6nS/0fI+P9KzP7/S8z+/0vM/f8iW3CjAAAAAAAA - AAAAAAAAGk1gi0XO/f9Gz/7/RMXw/yFec/8mZn7/NpCx/ziQsf8uaYD/MGqB/0/H9P9Tzv7/Us79/xk/ - TXgAAAAAAwoMJDu87PxByv7/Pr3s/0Z4gf9Pzfb/Tc/+/1DO/v9Tz/7/V8/+/1bI9P88c4r/Wcn0/1zR - /v9QueL3AgQFFhpSZ4tAyv7/NqjR/yt8mf9Jzfz/TtT+/1PU/v9X0P7/XNH+/2DS/v9j0/7/ZdH6/1GR - rf9dud3/ZdP+/yFGVHgrh6rNQsr+/0XL/f85n8T/Ts7+/1TS/v9e1f7/X9L+/2XT/v9r1f7/b9b+/3LW - /v9ntNP/c9f9/3HW/v9CgJi6NKHK7EPL/v9HzP7/TM39/2XT/P9x0vX/bM/1/2jU/v9w1v7/fNPz/4PY - 9/+C2fz/gtr9/4Ha/v9/2v7/WJ242TWhyutFy/7/T8z7/3DP9P9sxe3/WbXm/0iq4/9Zuuv/VLPm/0yr - 4/9fuef/csjv/4LV9f+R3v3/jt7+/2Oft9gth6nJSMz+/1bE9P9FpeD/Io3Z/y+X3P87qeX/edb6/3/U - 9v8zpOX/KpLa/yiQ2f9HqOP/l9v5/57i/v9ahZe3G1BkhEnM/v9Qyfr/Nqfm/zqx6/9CvPH/V8z3/4Xb - /v+S3/7/Tcn3/0G47v84sOv/UK/m/7Xn/v+x5///N0pTcwMJCx5Gvev6Vs/7/0zK+f8qpej/W8Ty/4nb - +P+M3f7/nOH+/5De+P9IuO7/M6ro/07N/P/J7P3/rNDg9AMEBBIAAAAAHElaflnQ/f+D2ff/l932/6fm - +f+v6/v/lt/7/6Tj+/+77/z/nuH3/5rf9/+k4vj/5fX+/z5GSm0AAAAAAAAAAAAAAAErZ36lXtH9/5rh - 9v+Z4vX/i9z5/5bf+/+l4vv/r+L1/8Tx+//I7fb//Pz+/2tsbZUAAAAAAAAAAAAAAAAAAAAAAAAAAB5C - UHRjw+b4etf6/4Xb/v+V3/7/qOT+/7zq/v/M7Pv/z9vi9URERWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAQMDDyVDT3BQhZm6baa93XmovNxsipa2OkRJagICAgwAAAAAAAAAAAAAAAAAAAAA8A8AAMAH - AACAAwAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAIADAADgBwAA8A8AAIlQ - TkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAgABJREFUeNrs/Xe8JclZH4x/n6rqcM655+Z7 - Z+7ktDnvaneVtVoFFJAEQhmEkFEAgYQkMGCDkCWCia+x8euf4XUgv4CFAWNjvxhMlpCE8mp3tWk2TL5z - 80kdqp7fH9Xdp7pPnzt3Zne1Arbmc+b26e5TXV1Vz/eJ9RTh6fI1Wz783T+A1Y01/M+//N/Y2NoEiNAM - Q7z7m96KL9x/D+49/gDWNtex1e2gEYTUbDRBRPA8hVajRZOtCTJsRLfXxyAaUJzElKYptDHQxgAAiABP - eZBSIvB8boQNtJpNnm5PsZKCNzsdXt1YY2YGs0EUR0jShCdbEzi8bz++641vxfPe9gY88/qbsN7ZQjMM - cdn+Q/jAD/8zPPN5zwERPdXd+HTZpqinugFPl2E5sv8QjDHo9jpItMY3vviV+OXf+3/zyzkl0X/4/d9C - oHzZjwZeFMcyTbXs80ClxngESCmENxhEXhxHbQZPp6lup2naSNIk0Mb4bAxpZgIgCDAAWGtt2JjYsIkS - nQwGg8GWFGJ9s7vV2ex0IiLSANJUpynYJJKEPnNuWf+73/r15EO/8HM6axsTASDiRqMBALjy8FFMNFt4 - zo3PQCMI8ZP/6d891d38dHHK0/D8FJZDe/fDGINOr4soSXBgaS8GUUSd7hYSrakZNmluelYtr54P+1E/ - YEYQ+H5LStkkYJcxfDTRyVIUx/NE2AfQHrCZNWzaBHgGhpQQRARIIYgEAduPOTMDqdbMDBhjWArFIBEr - IbeEECsATkkpTraC5nKz0TjtKXl/kqYrWpted9DvNMMgWpxdiGYX5gdnz5zR65sb3G5N8HNvvJWP7j+I - f/fbv4pGGOAVz70DE80mfuDnf/qpHoZ/1OVpCeCrWL7p616NtY11fOHeu9Dr99EMQ3T7fYIlSjqzfF6Q - QFOn6VSqdatP/dnHzpzczUZflWp9TGt9KEnjo0LwtKeECHwpJppKzE43KPCU8D1JQcOjZujT4uwEwsDD - 3MwElJKYajfg+wpgWLkfZP8MBQswgCTWWFnvItUGK+sd9PoJVtc76PeTmf4g3h8n6fVxojmOe3xufdPE - SWrAZATJNSK6Xxv9iDbnHjy3ev7LgsRybzBYBWjr7oce2PrLz/xtDwRDAEsh+MYrruKrjxzD0sIu/PjP - /TRuf86zn1YZvsrlaQB4kstt19+M3qCPR08+ho/9rz/A1z3vRQBIgCAeOX1G+kq1kzSd01rPaUr3xVF8 - GYAbjdHHDCdHG6FS7bYv260mTTR9MdkOxdLiFO3fM4W9u6awa66Nxfk2di9MYn52Al4zAAIP5PyD8xeg - AgBKHxLFtUyOB0OAicBgcKxpsDmg5ZUtsby6hdPLGzh9dg2nzq7hxOlVnFveaG1sdfd0OpHpdDum0x0Y - kyKGEA9FcfyVwWDwJc9T96Van9JaL3/+K/esfuxP/r8tIjJEZNqTk4aIcPt1N+L/92//I2668WbQ1NNg - 8GSXp3v4SShvfc3r8cipE/j83Xfhbz723/EtH3gPHX/sEZEaI2faM+Fmd3MpSuLdguQRo9MrmXCTIHNF - GHgLs1OhnJttioXZlti90BZH98/i8IFZHN43iwNL05hZaEMEPjJyBbElbZETOVtOXkvkDgCMAoKwjScX - IET5OgkYQWAS2YdghABDQPcinDu9gkdPruDhE8t44PgZPPTIaSyf3zDnVzfN+ZVNs7nVT43BOV95d4dB - 8EUhxN2elI9MtadOXXntVWc//7kvDKZaLfOr//m3zGU3X87PveU2/PjP/BRecOcLn5YMnqTydK8+gWVm - cgrMjPWtTbzkOS/AJz//WZWmqWy1Jia6vc7RVOsjxvCVQvCNQuDawJN7di1MqH272mL/nilxdP8sXXZo - DscOz+PYwTmE0y0IQRAMCAaILcGzI7aP5+jjvovsKwGcE30OJ+5xTT3uNeGeE5nkICwgCIIhCZMabC1v - 4v7jp3Dfgydx//FTOP7IGX7s1LI5eeq8Xlnb0jB0Qkn5hTAIvgjQvdPt9oMveMGdD//Nx/+qOzkxkf67 - //BL5vqbbuRvfNHXIfB8/Nb/+sOnepj/QZWnAeBxlsP7DyNOYqysrWB2ahK9/kBGcawmJyZbW93O1Wma - XqNZX6skbpJSXD031WgdPTAjjx2cEZcdnqPLD8/j8kOWy8tmAAEqiD1j5agnbmDIofP7HC6eHxdEOryH - yKmHq0TuPkuU6ybnHDkSQnGfIzFk15kEWEgYIWBIIF7v4oGHT+G+B0/g3vsfxX0PnOQHjj+mH3rktOn1 - 4g0B8eUwCL7oK++LszPTd1113bX333f3Pd1jew+kN119rf69//PH+IG3vROXHTiEG9/49U/18P+9L08D - wCWWdqsNZsaf/+af4xvf841ieXVZpXEaBoF/VZwktxijb/Q8cYOS4orFuWbzxqsW5XWXL4orj87jiiPz - OLJ/Bs2pBgQRyDBEztkdI92FuXn+HRgSo3s9O18hcBoHFiXgEGOeK0bVBKq5p3Qtq5sEQBkYCAFjgPVz - a3jwoVO478HHcNe9x/nLXzluvnjXg2Z9Y6sDprsD37trstX+3N7FXZ86efbsA4tzc9FHvvN7kpe95+38 - rte/Be3WBP6vX/l/nurp8Pe2PA0AF1majQaYGVPtaXS6HZXoJAiDxq7+oPfcJE6f4/t0ne/Jy+ZnGlPP - ummvvOWa3eKqo/O47NAM9i9NQTb8QqTnWg6PiwAAh0O7Yjy2v78MAOIinlPl8ARA1rSBRtuUqwqVelnk - EoJEtNHBIyfO4SsPPIYvffkBfPKzd5nPffE+vbXVXWeNe8Mg+OKu+fm/uf2aGz7+ufvuXn7WjbdEP/7+ - 79ff+v3fg8AP8Lt/8j+f6unx9648DQA7KFcduRyb3S2cX1tFsxFgEMV+nKRNT3nXpzp5GWBuCzx5WRjI - pefesk/ecdt+uuHKBTpyYAZLC23IwINgrtHfXRG7jptn17YVy51jYHhvlRizuqjEoS9G/HfaRW79jgQw - YjysqiE1UkLpWBZ2hKgzwKMnzuDBh0/iM1+4h//sL/+Ov3DXV9Ioik9JUl+Znpz8xFVHjv3P4yceu/eq - I8f6z7r+puR//M2f47Zn3o6f+7f/5mmj4Q7L0720Tdm/ay8G8QDLays4tPcAnT5/NkiStOUp+ZI4SV/j - e3RdI1AHjh2cbr7suYfEC27fT4f3TmNpcQJBy4NgskTPWYW1IjYwnttX76sc1wHGODE+9/3Xif9jn7md - MbBOFXDbVWdYrBI9ysAAt15rPzAgdLe6OHV6Gffcdxx/8hef4j/5s0+YM2fPd+IoeXSyNfF3xw4c+oOT - y2f/6uCevd23ve1t0U/8xL/E+773A3jf937gaSC4QHm6d2rKgV170Y/6WF5fxe75RVrf2mhIoeaTNP6G - JNWvCQNxZavhLdxx2z71DS86SjddvQu7F1qYmgwhREb0AEZF+zoLO7BzACBsa6UvPcP9bY34T871qiGw - VjKo4eBUp4JUQQUAyfq6qvXWqAguGGhtsL62hZOnl/FXH/87/Jc/+GNz1933xf3+YLkRNO46sGfv78VG - /7e59vTmj/yLDw9e9vUv55/9qZ/F+7//e58GgjHl6V5xyvWXX4uV9VWcPHcKS3OLtLa13hRC7k7S9M3a - 6G9shPLI/FTYftWdR8QbXn45HTswjdnJEJ6vnKg6V5SvEpVrjXcBoMrB6wgxu2+syH4hPT6TAKiO0BwC - LgAhb+cYacCVAnYk/teJ/JXfXNDwaGMOGMCgH2F9vYO/+/yX8Zv/5Q/5z/7yb3Wn29vwpPfAoT37fqc1 - Nfk7PonVH/qRD/Vf/5pv4O/9we/HD//oR58Ggkp5ujcAXHnkMqyur+Hc6nkc3XeYTp473SDC7lSn32qM - eVOzIffvWZgI3/z1l4lveskxHNgziWbDg5TCEksdwdfq8nUAUOXg2xGwcEbsAmL6WAAYo/8Lct5FjK+v - 4PxVAnXedyfifx3x19kaXICqSBlMAjpN0e1HuPveB/Ebv/0H+N0/+F9mq9PpKJKPHtq7/9cnpqd+c7LR - OP/BD36g/4H3fRBv/OY344d/7CNPA0FW/lH3AoGgPA9JEuPQ3v109vxyIIRYjJPkLYb1O5qh3H9wadL7 - 1tdcQa972THsWWjBUxIkKtyN856s6tcu994BAFTruCQDYN1vh/YCqtXDnfq4DljGSQxjJICLFv+rUoPY - 5n6RBSGVn68NEMcJHjz+KH79t34Pv/nbf8Cr62t9X/kPHztw8D+S5/3W3oVdqx/58IcH3/2+9+G73vte - vOEtbwF5/6hJ4B8nAHjSgxACylfQqQYJ4Rtt5pn11xtj3hcG4rIDSxPeW77+cnrrq6/E0q4JSMrFZ7fL - ch0aowR/QQC4BA9A7e/HGQDrCGocAFTF/xoRfAQMHo/47zwTo8RcL93k97i/F85f+57MQKIZjz52Ev/+ - P/4a/svv/jdeXV2Pm2Hzy0cPHvy3LOiPLj98dO1Xfu034qOHDuLtb387lnYv4R3f856nelo+JeUfFQAc - 2LOEbq+P2KRIoxQQpOI4mZFSPMdo/X1BIJ6xb7Hlv/7lR+md33Q1lva0oZAROIBRy3d2Lu/KEkFXj+v0 - d/eeKrd3f5PXfykGwLyNrv4P1Ovi4ySOKgC4xF99rzp3X+X9XW5epx6MO3YBzVUJaqQMFgKJZjz4wHH8 - /C/8Iv77//xj3trcjKbaU39x9ODh/3t6Zubju+YXNl798lemH/6pn8D111yL//ybv/pUT9GvevlHAwDN - MEQcJ7j1puvw+S9/RcRJOiUErmFj3uspetXSYjN46bP3ifd+83W47LI5KFP47oZcflvXnXNuRI/Nr+Vi - 9pMBADXAtFP9f8dSRg0AFCJ59brTBh5D0CNSwzggEeX7qA4Y3FDl4e+ZJGJt8Nm/+xx+/t/+e/zVX/2N - 6ff6W7sWFn9n18LiL89Mz961uLjY+X9+9T+Zj/6zD2Np9xLe+T3f8VRP169akU91A57scss1tyBOImx2 - ttAIQzpx+lxDG305wO8UZH5293zj5hc/e5//E++/jb79zddg92wDIif+OiKpJdzqvTUNGQGJSlSdW/+I - aA08MR4A1F+rHo8AmCsRbGd8rAJWjUhfR/w17spt21n0kaz0pdu+TOoBoITEvoMH8PUveymOHjlK55aX - wwcffviG5ZWVF6VpSr1+f+XY4aOd2265Vb/7A+/B17/sFbjvgfuf6qn7VSn/oCWAVqOJ/mCAG66+Fnff - f6+ntdnNzC8kwe+dbvs3XH/5rPdt33A5XvfyowgCBdK5NS8XqbcTsasEv833sQZAYKwLcKy4DpTUjp0C - ApGj/7vPdduWc09kKwXrpIMakb/Uvrrovzr9fsy1kXeXo78ruSErNgaqnHPrExKaPKycPY1f+fXfxMd+ - 9/f4/gcejFuN1l/OTk//h8uOXf5XQtD573/vdydfeeQErrvmWtxw+01P9TR+Uss/WAkg8D30owjNRlOc - OXduwhh9m2H+ntAX33/VkamD3/qay+SPv+8ZeOYtS/DzzHgl4kaNSL6NBHBBAKhKANV6qs+rqwdOOyoS - RImDVwCmFAVYJbDtjI4uobocuO5c5b3GEnVV3AdGxX0Mf0uVvxURf9QdKWrqG76vYIPW5CRuu/05uO3W - W0inWj308EOHl8+ff8na+lorSZKN//V//s/qG177+vS25z8Tb37Tm3HXXXc9pXP5ySz/4ABg3+IiAODg - 0iy2egM/SdMDqdFvVhL/fGmh8eKvf/7+8AffcQO95dXHMDURgEz+ywqhA5cGANUJPO53Fx0DUH0OKm2t - dESN6EwjRL3NM0ei9GqIrqrrl/z/cti+7dYfbGf9HyH+CuDV2QZG4g7EaNsZkALYvWc/7rzzDuzbu5c2 - 1jca99//wDM63e51xph0ZXXl3DOecWv/l3/1l8358+fxqU99Ch/5yEe+6vP5yS7/oFSAMAwwGERYnJ2h - lY2NCQLdpo15W6uhvuHGK2YnvvlVR+n1Lz2MmbkGhHZW49VyWneiOtddDjc2CKiuLuG0tEaPzut8wmIA - duIC3Ibjj4sFqNXXs2uiCgDbSRICJY5eCwCumO9+r5MKKqpBHfHXxS0IAW0Ixx98AP/vb/02fudjH+PH - Hntsc2py6rf2H9j/GwA+90M//EOdP/yDP8Qtt9yCd7zzHU/1NH9Cyz8YCUBKiSRJEIah7PUHu7Qx3yIF - vnfXfOPFb/i6w43v/yfX0SvvOICJlgdoHhJQndFqRIytXHe/V3X5bUV753wtd99GHC/VU3N/rcFw+LxR - F+B27ajrj+rxNkAxFjyq4v844Knh2iUVp04lcIm/Gt9QDXgqP18QYWZ+Ac969rNx7OhR6na74b333nvD - 6urqVczMn/rkpx59yUteEn3Hd34Hv/a1r8U999zzFMzwJ6f8gwAAIQQajQaMMQ1jzLWpNj/Qash3Xn/F - zJEPvu0a+e7XX47Ljs5AuSvzLqhr14nZNYQ8QvQ1941Y9oHtibBK5MAoF0W5vbW6/PAeGve87fz+Yly7 - at7BXRw0TsQfIf5qXEUVLGokhqrXZJz4X1vPGEDI7pRS4cjRo7jl5lswPTMt77nnnn2nT5++NU7i+SiK - Tt58880bP/7jP55+6lOfwsmTJ5+Cmf7EF3r8VTx1ZXF2Dt1+H1ESwxgzA+AlzOa7Z6eCZ77y+Xu9d7/h - Sjzj6jl4gQQ0UBbDdwIAVcIe7wVgZFZ2sn5xAsDZ+n+bQNMDZAgigkj7AOuaNogx51ADAM7fHazmGy4D - HsPZ6wCglpDHEbQDAGPF7rJBzoABIWHYAEwgSJBQIJLDvoTtQ+Jh3w7rlMPjqvW/Vm2oAkFdP9ju7Pf6 - +NP/86f4pV/6Jfz1X//1QEr5F0ePHv0lz/P+9PDhwxt33nkn7rzzThw6dOipJoPHVf7eSgBBEGCzs4VW - syH6g8FuAN8tJX3w4FLr+g++7Wr13rdcjasvm4EqLPyuWAzUi72Va8LhNnV6vfP71AgMUgWEc0hlGzFN - os8T6KZNbAx8rG4JbA3a6A8SeBhAyW0ItmhGnevwAlJDfn8tAGBMPTtQDaoEM9aQR1l127UTYJLYWnsM - axvrOH/uBLpb5xBFG0iSLWjdheE+jBlApz0kgy2Q9CBkMGxnVa0QrvjvvNcFgQCVPgAIBM/3cOzYMdx4 - 443wfV996UtfOnzy5MkbpJRyeXn5/m/7tm8bXH/99fzhD38Yf/EXf/FUk8Mll7+XAKCksvp+EHpRHB0z - zD/ZCORbbrxiZulffs9N4nUvPYj52YZj4QfKHD37nn0YAAkJkP2wkGBIGPKgKYRRk4CaBLEGcYpRwhDQ - /m6cWJ3AyVPncW5lE2vrHWx1IkQpg2UAvz2Lra0eVk4+gMkmoRH6wLYAMCrG7wwA6r9vrwIA44N4KveO - M9hV2zvW0JhxdSGxfOJuPHb8bkzMzkJIjX5/DZtrp7G6/BiWTz+Ec6cewsq5U0iNxPTcXghSwzocwtY8 - gDFdpGkXxsRg6GFqdALylX+GOZMsXCkATjvduWFVy4WFBdxwww3Yv3+/+PKXvzz/yCOP3Ox53sLZs2cf - ePOb37z5oQ99yBw/fhxf+MIXnmqyuKTy925jECklQhFigEErSZPbjDY/Pj3p3fyK5+0Jfuid1+HYgUl4 - SoJNsURv25Kyh42eQGt2ryV4Q4hTIIpTDAYJokEChgdfpFhsxZhsjtbBzOhvnsfuy74BRCsQGICEgRAA - kQBJCalCEDE2TiXQafpUd6NTLkYLpEv4TX7/6G8G/Q5IaMwvLaA5EVji1RoGDKMBsIDhCRieQW/zPCZm - 9tlsyU5hEM6fuBubG2cQ9dehPIWw0UTQmEAQTsALmlBeE0YLpKlAe+4YhDexzftT+Q8RFhYW8OY3vxkH - Dx6kn/7pn57/xCc+8fY///M/37+8vPxT991332ff//739zc3N/H7v//7X8Vxe2LK3ysAICL4vo9+3J9h - 5tewMf9890LjyLu+6Zj8rjdfgfnpEEC2wR3tbJKynESvcR0eefAeMKeQHsH3Q/hhiGBiBu1dkxj0Y5y5 - 7/No6g7azXbNVGYIMwA4wcT0JIgJQIJMy7XrCIRB2PBAJKC13lHbntIyFj930q+0ze+z6tkgjnrwAx+e - D0hPZ4G9uVAqAfjQPIHeJjkp0svPYSKsnnkI/cEK9h67AmwiDHpb2FxfRTwYIE1S6BRQwRR2HbgFE5m9 - 4WIxLAxD3HHHHdizZw9+/ud/vvGxj33sFZ/5zGeWOp3OT3z0ox/93y99+Us7V15+JV75ilfieXc87ykY - sEsrfy8AYHZqCr3BAFEcYzAYLBLRuwj8XQf2tHb9xPtupFffsQ/NhndJdUfdc2jt3o2lY8dA6IEQw9Ud - SCh0N7s4d9xDktYTrt2SW6DbWwemp8HQgEkwXEZoDVae7wEkkOgUzIyv+aQU5LzCE104RRIP4LXCTBU3 - gEmdxxmrjhkNHfcReo0R7g9YsB/0NtCYbGBmYRbKJ9u3AAwDRBKGfWjTRH9LYtDdQHNmyrGJ7LwIIXDF - FVfgIx/5CJaWluQv/uIv3nz33Xf/q8Fg8KP/9Xf+6+++8x3v3Hjt617LP/LDP4KP/thHvwoD9PiLePxV - PLnF9zysbmzAU4oA7AHwIU/ie6+9bHrXf/7RZ9I3vXg/mo1LxzFfAmlvBVJ5kAoQ0tqThGAIYSDIQHkC - JBXS1MDxI5aKUgLJYNNa+7mqPwPEDM/zAaGQJimYzY7b+JSUJ4L4x/6eAB0hiSMoP4DdtdgFy6GdgQ0h - TSIov1FfIWvEURd+EFgTDhkIYUCCIaUdR88TEACMjiALILm0lyMi7Nq1Cz/wAz+AD33oQ2JhYeHA/fff - /7Onz5x+x2//9m8vvu+73yc++mMfxTve/u1P7vg8QeVrWgJQSiFOEvieL3v9wSEAH26E8nXPuWG+8TPf - exOuOTYFKR4fhkkpkMYb1gCYz4lSrAAgpQehfKQDM5ZzC0Ew8RYAH4U1mk1Wha1Q+R5IekjT3tc+ADyu - cgH5nwCT9pGmKVTQgBCy4haF7T/KjLFpBKnqJTzWMdI4ggqsixUjxG3dpMYYcJpCeQ1YBHh80lcYhnjH - O96Bubk5+qmf+qnpr3zlKz8qSMzESfyL3/Gud5/497/0i+bbvuVt+OVf/5WnejC2LV+zEoAUEq/54Gug - lPLSNL1GG/PT7ZZ606uev7fxf//QrbjusmlI8fhFaBIEE60D8KwfurJUlYFMOgiQaoI2YzgHA5x2AfJQ - 8tczASzAhiGlgvJ8JKmGMX8fAaDYr+xCvVr/O+e0TvrQaQrfDyEoc9UyDT+Q9sMKRieZm49HHsNJF6lO - 4fkhqBRnkC8HFgApsCFonUCqoAYkqm3d2Wt6nofXvva1+Mmf/Enccsst4UPHH/q+hx9++Afvv/+BI9/2 - 1m+Tv/zrv4Jvf9vbn8LxunD5mgQAIQSasonf/9nfD7Q2NzGbH5ud9F79lpcf8H76Azfg6IGJJyyCiQjg - ZAtWGLKBJYR8r107kUgqeH4IrQGtTY190U5w0j0AOQBUlqSCACHh+QHS1MBo3qmdcgeFd3B8od9ejEhc - c2/JhebUOdIcBoMQRz0wMzw/qBCuS8DC9qcxzgMYLhAlgy7YMLygAaLq+EnYTMISzMIaBYQst3+77tpB - lyilcOedd+Lnfvbn8PznPs8//vDxd5w8efJHHnzowSve9i3fqv7jr/xnvOtrWB34mgMAIQhC+OjqbmjY - 3ArwR+Znwpe/47VH1I9857XYv7dVawx6XCXpoIgqK/5mxM8EkITyQ2jY3PT1ZgAG6QFy0bVIVpFPaiZA - CHh+gCRlaMOVeri2zqJcEljQDn9LY463u2/EHzc8GCGkUZCJB30QAdL3MwCoIf68H8cKXYRosAUhCJ7n - Z4Sf/94dTwlAOdumw5ECGJn4Uf9uO5hrQkjcfMvN+Jmf+Rl83Utf6p08ffJNJ0+e+NEHHnjgmre/9W3e - L/6n/4Bvf+vXpiTwNQUAQggIwTAmCpn5mUT40NJ8+OJ3v+6I+uDbrsTuxYZdyPNEF9MfpvwqTZrhxPT9 - EIYVdFr3/GylPccwWmcBRcL5a4NPiAT8sAFtAKN3qgLQhU9VA5yKr1Vxdhxxu/dt17/bEP2Fiqt2EyOO - +yApoZTvRBiK8gcyC7Gm0cdkbY2iDqSnIJU/jPargPjwXC6dlKWIEhjUvdMFuoQACCJcfc01+Nc//6/x - 6le9yju/uvLqRx979Mfuu/++G97+zd/q/4df/U9419u+9iSBrxkjoCV+AWMQMptnEdE/37vYeOF3vv6Y - fNcbjmJ2JgDSqvGmbkJfiN1VzdsMhRhpEsP38onjThCrCvhBCIZCUku49j4lNNIohmzkAFKuB4AFALaq - RLk5VP5O5brtn3zCUtmQVYp74Av4uV1r+zb3VJ8x0o4xen7teSpXwYQk6mc2EeVE5rkZmQSYBUzKUMrD - 0IYwbAMDiPodKD+AEArD9Q7lenIQF1Qj/hfvMtrOkXN108e5SAD27tuLn/yXPwElpfqDP/zDlz30yMPK - aPMv3v7Nb/vc81/0inhmchI/9Qv/Cl8r5WtCApDSBn8YYwJmvp2IfmjvYuOF3/2mY/I73+gSf7XUiW0X - 0oHL5wiApwySQR/McpgKqzR5AC9owJCCLpYSV2sBPAXEURejdoBMnSCC32jAmDwYqMpxuP41nGds//7j - 9XmuPX8JSm+pLeOMguMNpfbnjGjQh/QUhPIqfT2UwJgFdBpD5YY75/f2L2HQ70B5AYRUNeOWe2OsxGUN - gPm2zHl/u/1usg8q47Ldq5WlLAJj7779+LEf/Sje9IY3qEG//+IHHz7+L+574L6bP/uJP/OP7D+Mf/MT - P73Dfn7yy1MOAL7v28g9wGPmWwF8aM9C4473vumYfNfrjmBqygfSqo6WlYuQVrf7QeARBv3NYXx4YYnO - 0Z+g/BBMnuXcdZOAAF8JxP0OhgBQmZCG4GdAkup0J00bc0PVGk7lz8475MKlWnep+sqzxvSLE1dr/5rU - xgAEIYRQTl8P7QAEC8ZJFMErYgDKHwYj7nfgBRkAuOBd3EYwhpGmia2Hq6BVAQHObQLACDjXfjACFsQG - e/cfwI/8yA/jDa9/nUrS5MUPHH/oQ1++954bz66c9Z79vGfif/7m717aeDzB5SkFgFtvvTUX/RUz3wjm - H1mYCe54x2sPyXe9/gimJnPifzKLjeJLemsAVTSibAIRI7NWe0hSzgGrUouNKUj6NhjILmmVhUW6kBKC - EAYe0jiBMRoY4dwVwx/ZhTxEIvsQ8j3yDAgpA4kBEiOQUAgtW6XYg/Ec+sLSAIOQCImYCbHRSEyK1Gho - 5kxr4RqAoMxll7+AW6UlMs6DgLxGiXPnnhfKDYAskUa9zMLvVpcDibbhxH6YeQBqXo0IRjPSZAA/aIEK - oq30u/u9AAEeofX646pEAZAx2L17N/75P/sBvPmNb1BJmrz0nvu+8s8/+ZlPX3fXZ7+sXnT5LbXz6Ktd - nlIbwKc//Wk0m03SWl/JzB+ZnfLvfPc3HZbvecNRTLb9x2nw23mwh1IC6WAdDGmJtUbP8zwfpIKhBFBT - tZSAiTezbnWt2taUBSb4XgBAIE0HAGwcAjhPb23vZCY7/YwlciYFa8WWYCakhpCmGkmiEccxkkRb96QM - IIXEvnnK9OYxfeHaCAr7Qc1incEAJ5fP2Fs4gfI8+J4Pzw/h+T485UFIZa34OUjBApUgCRK2P4eLBLPn - 6AHieIDWzDyklChtWe5ITMwCOulDqt3OO/CwzTpCmgzgBQsQtTEh9nlsABMPoKab2W+r3ZLX63zPAcFd - yegSLLsGRWDUNWRAzNh/4AD+6fd9AGmaqN/52O++7HNf+uKgETZ+7PIbr73nWTion+qQ8KcUADzPQ7/f - P8TMPz7d9l7yLa88IN/3zccwNxsA2vX9VkuVAndC7OPvEQTowTrgchH3d8yQSkFIH0lioI22eQaq9QhC - 4FMhvlpd1lVfCMrz4QUB4HuIEQDGz4KHFLQRSA2QpgZxnCJOUiRxgiTtZ9ICQUgJUh6k58FTPmTYRjjp - Q6oASWxw/6f/CrsmL4OnvJHXGB8BV5nYZF2Uva11nHrkQVx2020gYaCTAZI4Qb+3Dr1hVzUare0rEkEq - H54XwvcDeEEIP2hAKQ9KetlyawsORkeAUPCDplUB6gCABUioLMRXlT0UmQ2AkwHSNIYKAhtMVD+6MAyk - aQShApQJHduDAOBIBlX1h1HrD+ayyEBscODAfnzwA+9Df9APfv8P/vurP/7pT3bMz/3cj7/l9OmHX/em - NzylYsBTAgCCCIYZSZLsB/BjEw31ste/ZK/6wX9yRUb8O+fe9WUn3gLnKgEmXs+INrvfHVxiQAor4scM - hp2cgABn3MEwI04YrdlpDMNahdMe+0d4HuZ278VGZx2Dc4Qk7sEwAxAQSkEqD8oP4AVNeJMhGr4P5StI - IUCCQIKytQrCxkxICakEhPAw6Ke4V0fZWoNL7MJM7QAz0iSGII2Fvbuse1ZbN6c2BiZlsDHQDDBnx4lB - kiRIowjdwRY2tlasqpOmxfJspTxIJUB+iMnZORvKXXhBXFuABdTGxAyiaAu+37T5AHLgJUCnPegkglJe - FgZciUHIubchcBoDQpXGYlsQAMpAUBffUJpy+UVTud9AEHDZsaP4vve/D1ubm40//pP/8/pP/O0n1h56 - 6MGfecEdd5yL1jfxt5//7KVN9cdZvuoAIASBDEBEu5j5BwNfvOalz1r0f+TdV2P3QlgR+x8vEOykHiue - +0qj2Ol3RB1mQBD8IIDgWcRyFil7YPJh4EMbgShOceqRBzDZewSHZ/dmuqbrlsren4HDV9+Afrdrq5Ue - pFKZbo8shwBA0iarFBnR27lc0TUzXdUyRw0pAS8IkKZJ5QXqXHNwDIa5G254mZmhdQrp+4AECBpSZapF - NSNPZnQzBmA2MNr+ZZOfY8AgA44EWqfYfeQoWu1JKxmwS3F5fQZptIpH7/ssou4W9h69Dp7XgJCeTRsm - POh4C9Lz4Ps+ajlyLsULG8lJQlR0fadrMhC2fZL3sdNv29pWq/aWik3BWBC45tqr8E8/+D1YX99of+Jv - P/V2pdSqAP797OTk2rNvvhUf/+ynn4C5fnHlq5oRSCllY+AFTQN4jxT0zmffMNf+hX92Ix1Yambr6PPi - Lgpxz1H5OrnnqwExlXNFfvzhbwxLJIbgTR6DP3UYZHoY5QLIDHCM9fUO1rYEVjY0zq/FWO8k6PRSxFqi - NbsHC3sPIWiElWhFKnETqTwEjSbCZhNhowE/9OEFHjzf+sWVJyCFgCACUWaQYgbYOJ+KdSoLgjnzyMOY - agVotSfKfZW/Ow3vLXO4cnONNtjYWMdAGywdPWYzIVWt5cXHtofAECQgpYSUEsrz4PkePD+AFwQIwgBh - o4Gw2ULYaNpFQEUnC4fgshEihlQSSRxha30Za+dOYOXcIzh/9mGsLz+G1XOPImw1sGv/EXhBCKpa77O8 - gSQbEBTY46IrRGV+OIafKuff1t05xqMw8p0hiLBnz27s3rVIX/zSXY3HTpy8KvSCs0LI+6MkjW+97nrc - d/yhSyWvSypfNQkgVCG00BAsQ2P0qwF851VH2tP/+p9eT4f3NJ6w2P5xhTJjkEa2l3xCiLSPQdrA2loX - 7J/E1YvnYFcdA2UXD4NMirnd+zA5twjWBkJaAxgyYADshCUiENdMGnYBi7P3dTk5UD/ZCJUWYXRyZveR - RNhsIUpSR6qtSWTKDJDJVB7XVTdkiQxGqg2CZmsIGKXnU6V9rts0q4fNSL25tb+oZxt3rRACM4tLmF7Y - DWYaYo8x0DoB6wSe50F6PqhudSUDzCkGW4/hwS/+LTyviZldhxE0puA35+CF05BeA0L6IOEN25q3v5oU - druYh+3ci86xlAIvufMFWF7+Tvrwj/7k0tnz59+vlDq9tLjrT0lQ9K43fDN+6Xd+46Lm9uMpXzUJIDUp - BIQ0xjwbwE8dXGoe/IUfuEHceu0MlHTFyby43Kvm3A4lAGZCqhm9gcHalsHyZoizW22cXA2wvC6x1ReQ - zTks7juG9uRUNuZVP3v+R1ijludBKpmtWwAE8TB/6Lbut3Lbxr7vyCdf2ZYvUKq5nwjMApvnl4Goi5nZ - mRroqBAr1R3bv9porK6uQrXamNu9lBFYuV3D2Hs3+IYqf0X9O5Wkve16yoKqoDxPA0FKq4p4ng8hZNbn - Ltg6v2cGoJEkETbWzmL5zHEsn7oPa2fvRWflIfQ2TkLH/dxPY4PSyLXdVMaz1KV1Y112B9YBgZACl192 - FGwMffLvPjvX7w+WwsD/4tzU7PJks2U+8PZ34Xf/+I921D+Pt3xVJICME5HW+hjAH12YDS77wbdfJp53 - 0xw8+eSEImhtMIgYW12DlU1gox8i0h78IMDU3CwO7N+HmfklNFp5frhctM6z/jgAUzAwM5y4JbNCDbHv - xClR3JgTYI0uWXNMRaMyazgy/RUCQXMKg63lIivOqDi7E8KzsQ6p1photuGCqxvTgG2Pq+ewY6If3l9H - YHVSQ42BLjPAATbY7ODl1+Lg5dfDmBSdzXWsnjuFtXMnce70cbD5BMLGBGYWjmJu77VoTe1F0JrNvAau - T3icIXBMbME4IGBG2AjwT77tLXj0xAn5a7/xX55/6ty572yGjR89vH//Y2/+4HvMW773uy6ury6xPOkS - wNDHyUsMfKTdVC/99tcc9N/zhiNoNXMXEMb4ouu4fOW4ci3VjK1OjDPnerj/0RgnVwKkYgYLB47hiuuf - gWPX34Rd+w+hPTkFTxHAafbRKLvsKv5xrm/aBc9td772xqroWScZlKMMrX1CAuQh6kcYbJzD/HyW9qq0 - k09edbXv3P63H60N1jc6aC/uQ2ty2nLi0gpHgdFoxzGSANeN7ZjCOzy/7XeX6xoA2o4vJyAYBEGA6fkF - LB08hv1HLkd7ehbRoItzj30Fpx78BNbP3g+CgVAelBdkfVvXJldlq4DVNrYAgEFsEE40ceTgfjz4wHF5 - 91e+cm1qzAoBd33urz4xmG63cf8jD+904lxyeVIBoAjOIJoC8C7fE2996TMXJz/ynVfRwmyW4700AZ3v - xbFLEM65inHPGKDbS3D6bB/3PzzA6Y0GppaO4qqbb8eVN96C+T17EAQeyMSAicuEP2JUy/Vi18jmPP9C - Hsbt5vrFgEGJePNVcjJb0y4BUjYFGTwwAjD70CmgBx1Mt72MvssAQi5gugBXUQEMEwbax8TcfniNCdhg - Jft8KrWhuvIuq+eiuf1FnOe646FXpPhwRvzIJDvWw3HP5oEgjdbkBHYdOIwDRy9Doz2F1XMn8Oi9f43N - 8w9BCgU/bEJ6oTN0ta4iDCWEcYSfX8uMpkZjdtcCFman8YUv3S1OnDx1c5Km92x1tx6M0jh9zxu+FX/y - t399cf14keVJAwBPSSuaMgJm/joh6HuvvWxy30+//2px5aG2Ixk8fgBIDWNtPcGDj/ZxciXA9J7LcO2t - z8LRq69Gc6IBMgMgjQBOhgQ/Nr7TVM4xhu43OMCASrtwcWCwY/rICEsoGPZg4IGNgtaEJDIY9CJsbfTQ - 3eigu9FFmmhMtJpoiB5GdXs4yTcuYAcgBePPYRBp9Dtd9Dt9JFECrQUYHgA/A58swKdkxd9B4Yu8NkL0 - LpG5RK9RBoCa4wIQHDDQEQQxJudmcODIUbRn5rGxcgon7vsE4v4GgmYLXtiGKKWgqyNwZ+6wcwxnzpkh - CAijcfDYEQg29KnPfCFY29i4LPD8v7vi4NEzP/uhn+CP/Juf2XmfXkJ50gDAGIYgEob5GiL88J6F8OYP - v+tK+cJbF+Cpqt5PlwAA9jhODM6upjh+GkBjD66+5Rk4dvVVaDR9IOkDOsomRZXwq8Q9Tpwbd63a/tFT - dbft6FzpogJEgCQBOuub2FpZwdbqKjor57C1cgYbp49j9cQ9WD/5ZWydvhvp1iOYnQrhK5fIHUmiaGr1 - GmG4w671FES9DZx+8LNYP/0gOiun0FtfRdTtod/porfZQW+ri0GvD2MIXjiRJfe8wNqNS+X0xXdXt67j - 9NsQfTEHtAMULhAk2Xyx6d33HjqMRrOFs4/dg42zX4EfhAia0xDKx0jMwXZ2gKKYjPjdj4FgjeuuvRLn - zp6jT3/uSwtJnEx4nvep//Gn/2vz0L79uP+R43iyypNiBBREMGDShncR8K7Jlvf8t73qgPy65y4gCCQu - Lh9mFpBRQyipFji7Rji16mPhwH4cOnYUXuAByabjgsoneaa/cjbJ873mmIZuLsp/I4a/L7YBr+i8Io/f - d/apczkoczbJcpCBa4wvvV5RSu+Y74UXgrXEYO0E1k/cjd76KXDag+8Rms0GpifaaC624QW7AJmtrdfa - us1GjH7jvjtGSB6O4ezMBGYXbrN0kiaI+l10Oh10Ns+gM+gjSQkqbGNidh981UTQblu7A0cYybKzEwIH - hvYCkb2LS/CURRYV5/Jj4wBClSsblOIoau+vuUf3QCSx99ASpucmcfy+r+DRu/8IrAeYP3A7pN8evkCt - R6DOGOj0CTvtYIbnKbz3PW/HVx44rv73n/716x45deIeBv/rQRxv/fl//i3c8fY3XQzR7LhcpKK2gwrJ - OoYM0GLmbw188SMve/birp/8nqvp8iNtkK577HYSADAaDMQAhVgdTOHMmsDswjx27120/nidOL/JuV51 - f7jqJpLOppgjO8zmmX28jOht+K9dsGPzzZnsfgZloW8GUil4kgETlSfETiSFvF3CAyOE2TqJdOUzUJRC - +o0h+DCQL0ph19Dm7nVX9O1wmy5yvzNQCopxNxstgDcHIydbT94GbXMpGOHDn7sC8ADSW46qVSkXBAIB - iABxCphUAzJbAQkGwVjjHDQE8dD9xybj4CkKSaCQACoEXgCACwKmco92vAgESA9xrHHq0ZMYDAz2HHke - 2gvXg2RY8wJ1hF/zd+TYQHsKf/Xnf4P3fd9H+IEHHz13aM++d7/02c/7o5//tf+UPFkLhp7wWoUQYGYF - 5meRoJ+75kj7lp96/1Xipc/ZBckoQmBGCH3E0u/eIyotVdDNy3C+GyJsSExPtYaGPVecLRFxdbfabLGO - u+Otk4oKQgHSB+BBs4Bmu1iHU40kjhAPenbnmbiHOOrBpCm0jmGSPggG7fkD2HP5M6C4OySEKlOu+170 - h0SqgbizhkZ8HJSsAySHhF5rzKsR+QEHAIf3FCvwRmwAYkxdznEeMu32FwBWTfQ4QLPlgXJuXZV+3DJC - N7buhJt45Et/jsHWKiA9G6yjPOv7D1rwwyb8oAE/DCE8H0ISBGl4pEFkrf3WyJc4XL1C8GMBwgWDXIIj - gBS0kVhb64DkFKZ33QIZ7s/WF7gvU1EFRggfzjPhXLPPTyThl/79r+Ff/MtfMEmUfvK6y6/89oXZuXu7 - nQ7/8ZNgEHxCVQAigjGGACwR4Z/MTHo3vfWVe8Xzb56DoBq1qToZaNxJ5yIzuHUQpnUA094WwsAA6VZG - /EBB7Lloz/nacofj52oANMpZaGAHVATQ8BCnHkzC6GycR2flNPqdFaSDLjjtgbT9SO6A9BZYx8NJR8Dm - +lWYXroa7bbMNhRFsWpurLHMWQDJAHpbGzj3wOdxYMHA80SlA506SiDiSAHFeZcIHXXKJU5CRdVyK82O - 3fpKW63bhkdby3jksVO47MbbbXvzn1arch9RiPe2bQyF7sYG1u/9HTRpDZoFUhGApI9UBuiJNrSYAGQT - UE2QbMBrTKIxNY/p+T3wJyYhhYAvBISSQDrIdHyHoEt2AlciqEoD2d+snyR5mJ0JEGsNk56BNJMATQ9V - ldJipEoMQB3XrwEIzxi89U2vwue++GXxG7/9h8944NGHvztN0w+hH68xMz/RksATDgAAGsz8qtCX3/iS - Zy6o1790Lxot9ThW+JV1VpaTwNTVkKYP30uAtOcQv6PrIyd0YQe+EPtrMtCSsh/VRIIAUSyxtXwGa2cf - RbJ1BhSdhUqW4el1BJxASgPfIyhpswl5Klu0QwCRhGbCamr3qGtPzgy5UE5kLnd2A1uo/N5JNMDK2RNY - mJiB57W26/jh35Hgmaq3hcu4Wh0ThxjLdbggnNUDKu5nBnqddSyfOI5j199m37Ni/3LHsbx6jjMMseMV - 9zcxPzHA7mkvU5FjsIlheAtxvIw4YcQRI+0BqZZgGaJ3dhabDy8C4S6EU7sxu3QQrZlZBMKuq0DSxTAe - oIbQuSIVoO5cBCF8BCoEiy2wXgUQgEQ47KuS5d+1gbg2CWCsKmAYE5MtfPC734bPf/Feddfd979hqjXx - iZe/4uW/TUTVVV6PuzyhAGCMUQCuk4LeffnBVvvbX7Mf+/c0QSlfgPZruE3tNQCTV4OUghh0Ms4fDe+x - y+hQbCyRG/tyMICjw3JO+GR1bW8SvTjAyskHsfbYlyG6j8DT59FGBw0vRdiUUIqsG4iG3I0LzjVkJgYM - JQx0OhgCUCHy5WI0o7SFWA4Orl1OSGhtEA8iYKpVMTbRkC5zos2JqrKyb9QQSeBCGasj9Er9dWNXaott - e7/XzTSDul2WXLeYk22n4MIAyG72mcY9eIqgNWevlrWUCEHACINhk4wBDA8QxycwiB/FoO8j2ZjCqVO7 - ICcPY/7gtZjavRcNTwDJeqYq6uEHNepBlfDZydxkEpBMQXodrDYBngXYCWgrXnqMV2CcBFDcayCMweWX - HcL3vfdt9D0/+JOzJ5fPvvfjn/zUZ17+0pffm25t8f/+xBOnCjwhAEBEYKuczhLhHZMT6urXv3hJPP+W - uUzvr86ci5UEbCUs26D2EZBZAdJ1QHct9y8Z+8xQvC+s8w7xc6YeiCxvnwihvUVsrndw8u4/gVy7C5M4 - j4aKEQYCQgoQqYLObFLQIenkIvFQuraEIxAjGmyC6QCocDflP3Apy/U0ODYQZkghIVSAQZyA2QniKbir - 27OiDCKogO7YzMGueF89zm93jLTMNcNHYGL0e127Kk8Ih6vWT/JR8Td7DgSi3hpa0jiLD8t7KJQlbXvk - ewKBJ9A2GtqsYBCdR2/lIaxu3I2Nszdj75W3o9mYh4jOWENxHhOCMZw/v1ayC2QP5hSAAAW7wRgA7GOY - Tq6iBoyAAVACvUIFKoOCAuMVL30u/vLjLxb/8Vd/77qHHnrouziOP3Rg9571ysA/rvKEAECr1UKn01EA - 7vSVeNOzrp9R3/KqfVC+AI9N61UHBNuBAwON/TbvVrwJ6A6gB7Yz6wx+BZfXDvd38vWzBKQPDvdga2UF - Zz7zX9COH0JTRVCeyFJIA4Z5uEy5kKLZkdzJvVRMVkIMHW1mxJ1zm/zOCgBUjW5sCcguqQ1spuGCOVfs - ALlhriCyurUV2/RpreTlHBeg4S4GwvAa528NDPo9hI2mlYdGAMA9zuoricVUqGxpfwWKTJZEZNikKtFX - tR2T3SQFoRUSGmaAODmO7ullnB6cxdINr0SrtRvUfxQwmW3AjR8oqQSMepsAW/AgAMkqoJbAmMgWHbnj - UwG37aSA4mV4+AwAE60Q733nG/EXf/OZ8P4HH3nV2ubmnw3i6PeP7juoHzzxCJ6I8oSsxOl0OgLAAUH4 - wN7FsPnObziAvbubmcvv8RZHdA0X7cAlG4DuWxebydw/JrP8cm6My49ztE/sd85EQCGAxl6kcYqte38X - s/p+TPhRtj6AM9EynwtcfApbT/4x9sBed+d0kuUHzI2NqfNxRNAiHLl8jji1K9+8EFGUDB8IoJT91yU0 - d+K5c66YeOXrPHI/V3/kEIN7zbEFFB1i0O/3EDQmsvakY97NCctFHqCV948F87S3CoFqX2f9bMr9XBqb - rKkmDxcA4HvAlNrCxNbfofPgn0CbAAgWMmaRVuZLks0jZ67k88c4c8hEdv4lKwD3ACQoux91ZVwqkgQ5 - YDiiegxBURBw5NBefO93fQu1W809p86dfdfaxuaes6sr9NHveP8TQVyPHwAECRCoAeBbw0De+NJnzYuX - P28Rqm4yXajwyAHyVNRMBPgTNmFHumW5P1cGpwQGyRgQSG39agLs78Lg+B+j0bsfSmgQU5bBBrUEPzLh - HJDnXEfIJ6pOst2CgcJHbXKCSLNJk4NBivLaBA0YDSEJyg8QJwk4z8ALGk6uugw4Y0/w6Pfa4cmlkIqY - Wlvv8C+DEfX7aDRboKz9hX/efa8cBN3ou2IxlraZiKJVW6fbnxXGaYFgFJDLY5TRGxF8DOCvfgbJ2S+C - vXlAZinCq/NlhOCrx3nosGVEhAFgetnYVqUaRinewJWICk9ERVoqTSrA9xRe8ZJn484XPEPGaXxznMTf - 8oKbb23cccvtj5d0Lf0+3gqYWQB8jZT07ssPTnjf+cZD8HzhpDy+CBCo+pxLed6E1S1Nz3Z+TtzFx+Xy - +aA6kkGB8sZyf28ayfn7kZz8JJDGtRMJOfc3XBrLcWBQvp6Ckw6GuqQ74bO2FYBU4YbZOUk2G3Ga6qE4 - siOH+rjvo1JCcWch2VcJP/u4KkiVGgHAGERRhKDRAKHC8Yv3c4HOef/ir806xPGGtZG6tFLp7+o1bAPM - +euY/irik5+C3joPqInsnXWF0B13bolx5G10pMy0B5gIzFE2ZpWMTa4E4KpCrs4/TnrLvhMx5mcn8V3f - /npa2jU/u9HZ/KaTy2eu/qF/93+JZ99w8+Ml3ycAAMBtAO9vN+XcN798D1112SSobgvtqv5at+FE1TXi - TERmsoOrBzZe27hcNRsguCDgInYyBATWYGPAkIge/QuYuFtDzDyWq6CW2Mtcx465BqU9m4yy4ITuRK8j - BFdFSCHI7p6rNYO1djty+HfE4IQx12vucX3+brqvOpApGaqqayoATlOkOkUYhhn3d1Se6vvWgWBGQKxT - cNwBs6kH2TFE79oTh4yYR36frj+M5Pw9jsSmy9zfuKBUmVf5tWJODQAzAOsI7BoUS31UtSc40kBF5K95 - QQA2Scn11xzDW173UgGiKx86eeKtKxtrU82w8biDAh4vAEgAz5OSvuG6Y5Pq275hH1Qd8ROVuXs+oaqf - sYVgjLHBNtrl9q7IXAMIdR8YxFGEaOMk4pX77IQrTZq8OQ6x8+i1sZyGGcbY9d5kekgG/eymmraYdDih - RrhhAiIDz1cwDCRJOnZb8pFTtRJABRBywGXOfRjl+53rxflCGqNyXWAkcR8A4IV+RswxRgipqopVuWtW - jzC9Qvoq9e+IJFDX/3AI37luAAZBR5uI1x7AYPMs0jQdzh2umzeuJOkcsyspxDY9WVX8L6lpYwidnP4e - kaqG5wmM6ekJvOkbX4xjh/c1+oP+i3qD/u2PnjkpLjtw6HER8OMBAAIwT4Tvm257/ntefxDTU/7wxUqx - 5XUvV52o+SmueRCDjYbRuXhfHZjqRw/vqQwow6Cz1cHyI/cg7W+C2YzR56vEzjVAwY6KMJyseZslR4ii - riWwEuerGJVcLmiGnJKQQikFBiFJkqwdO1EDnIlVuuRE+nH1ek74dS5GV2oYlQIYjGjQg5AKvpIgl/hd - rlntg6IvYsCkmR1hCx7Fo0bVbQyx20oDJVqyJ/qrp3D+5EMYDAZgVwWoJfpx82to0zA61/9NeYLUSgKu - NFCzRmFo5Bhez1adHDm8B9/+LV8vGo3giuW11df3B4O5rU6H+J4Tl0zEjwcAJIBXSUHPfPb1M/LVd+yG - Mtkkq1LRJRWufGMba2+y7LTGDNHYJGMmm2tkGkoMg24Hpx9+GEkUlyZH1Zpceg0znEAji8tcsDBDMBEm - QjzoZESVt7FilBxndMrWNihls/0kceoGHjh9xE5XVb/X9Gkxscr9PKyCy/o+Rqgou7EsBQz6PZsrUZLT - 9xXOamqkIHaSs4Aw6K3BE9rp9xxk3X7Om+MQfeX6UN2u2gYIW+trOH/yFOJBf6iuVOdQaT4N1cchCFg3 - ERudrf+qLj2uEj1Xrrn9WXdulGFOTLbwsjtvw43XXSbiJHl+kuo7nnH9jYqu2nfJRHypAJDH+3/X3LTv - fdcbD8IPMh19HOd4HIVh19qlUbdw7xRJ53M01hWuXwyeM2jZpGOTYmNjC6k2jtXf7f9t3H51UkHN7wkM - MgMkgy0wCdSKw67rqTr5MqKQCpBKIk5SpzfquH21v7mMFWN/x5Vj92VQX29lgjKAwaAP3/cghB7zrlXQ - c1xvmZ7NJBB1VuGR2dbTcmEVANv+vj+I0ev1nOc7kmUVvExSnkNG23nHNtAsTezGJ+WG1Kw2HLHwVziI - y/lHgMR+hNE4eHA33vxNLxLtdvPQRrfz9Y+eOrnwnJtvpfd/yz+5JNq6VABQAN4gBV31dc+aFy+4ZRZy - J7ReEi13IsYOi5SEuLuBVGfRfYUBx/Er5+4nVw1w3YPaEl0QAHGqi40+dzaRuDKRKmBgKmAAgHSMdLBl - vQ7FZHI8F6ZK/HFlUsZQEhBSIY6TMqOv1f0z1l1EDNZx7vz+KlHnpOyMT0lNqF5D6b5Bv4cgDO1qPPcd - qnEYpua9TRaVRwpJdxWKTM14bGfsc69v5x60zpQoNmACpDSjBK41oPPjtDKfHP8+A0w+ov4AhCxN2gjX - rlEFRjh+3odV1aHmw4ywGeKFz74Rt998pUyS+AUnz515QZqk3guecWluwUsBAAKwhwhvXZjx1Xe+/qCT - S/+JKjVAIAn9jTNIjQ8mPxP7tIPIpvK3Xn+jNEKzIQFi9FOR5ZcYDeQZNTzB8T1z7eRywQDMYB0hjTpZ - N48xTtYFLTnBKDIDgCROxhBnhVuXjHeV61Wir3L/QrrPj+tABiNtYGQA0Awz0K0QuqmCgeu6dWwgpJD0 - ViDyCLJ8bFxwrdDJjqQBR31LDaGfAJ4nESgDyj1KLrGPBDA588qkYGPjFaAm0Nnq2VXPgir97RJ9jc7o - 3lNnAxhTlzAahw4v4TUvfw5NTbX29Pr9l210Nnf9+C/9W3rF8+64aEq7FABQAN6sJB171fMX5U2Xt7fZ - mHEbgt7uGtdf4/4K4oRgqAGGsO68bEAw8ikPWiEN6Aihz2i37dJSA+m49HLi5hrirxC74bLLtwY8oGOY - qJM1Pjc2xWUpoFYtsOeJY0hhd8eJ4zzXQbU4Mf0jhD+uv3nU7VrYAupAY7sPABgMBn0EoQ8a4fLO9zrw - 4ywgijVYCKT9NZDDyU2FdlwgrrPXlD6GYRwbARtGwj6M18RE24OvjPUqmaHKVRB/af7oTNdPYbQBGwPD - AkZNIxqQ1f8Li77T4O24ejXceMRo6N7nBhEZeIGHFzz7Btx285UySZM7z62uPLMfDbzF2dmLJuaLBQAC - sJcIr1+Y8cN3fMO+Ue4/Qrx1XGQn+kL1wYRWCGytnkWMlt2XzxCMNjBaw2g7SBadHSBwEVxrwEQgRNi7 - NInUmwA155xJ5Y7ZaNBJadxc7mN4BBDAAHQCTvsYhr+6om9G6IjL310g0DGk0JBSIknTzNCEYdxE3qHj - iJ5HOtGZWFWpwJECRoanck9FEmFmRIM+wtBzrPpVDl8J3DIVAMwWS+nB5pBgq/08Trwv0VymjlXGkw0D - wkPqzyCYnMbctA/iCKXVgRWih9ZgY638rFOwzmJImADVQrfPIGpBydAZ45o4gBFpYLyeXzpXBx4MCK1x - 9OhevPLFt9PUZGtXfzB4WW8wWPj0XXfRHbc+66Lo6mIBQAF4nZJ09BXPXZBXHZ6w3D+3HF/KKr8dnbM1 - tycDdJcfxMBMwsg2mCWMZnCawmRbVRuts4EafgrbAGtAJxBJH3t2NxF4gJ7cC9VeBIPA2tSK/jA8Mgmr - 6nXtRDUaSHtgnQf31LnAknpiyc4L0lCeQJrqMqcpcfsKAY/0Z1U0qbmWfydUjLkVdaAKGLBBSkkSwQ8U - aIToE1iQG6f/Z+eyICAkNoNSraHV1PU3hiBcq/szYAxIKsipPUibc5ia8jEzqUDpoGzYy+eMTi23NylM - mnN/O6+MMTCsgGAXVlf7UF4bQbOdrfisiPUlScAl/PEifvllXTdT3ve2bulL3Pm8G3HzDZepJE1estnp - 3JDoVLWLjW52Vi4GAAjALiK8am7Kn3jrK/ci9J2dbwsQqPvZhcqFgYDZbqk0GQywtrIC7e0CKAQzwRi7 - PbXRaS0YuNKBJcoBQl9j/54QW/0BeOEq+DOHILyWrcPost7pvOJ21uhRKdwASQ9p3Ms4S836hGo8gIlh - 1wnY+3IA0MZAp6ndossl4uLYXWXoEGitOlVh86WuNtmpUU5fBgEuHqvjAcAGvi8BRBWid1QB1w1air23 - fvQk7tnoydq+LIMscolrnP5vGJxFfYpgEmr+KOKJ/YDQ2D2n4KvEpoovOLsV8S3xu/PGwKQGrE2mTgjA - m0Q3nUAcB2i05iCUGiX47aSAcXaAGnAtiTnO/SJNcezYXrzoeTfQxERjdz+KXhbHyfSDjz5CX//CF+2Y - qC8GABSAVyhJV7zotllxzeEJCFmXTaZuie84Ih9X6icuMbC4OIHO2XuxlbTB4SKYPBgmsGY7SCbT0dJs - MLMBHoJBaiMKkx4W53xMNyOsbm5AL1wDtXQj/NkDEP4EGASTJhZQMuTnfImgKYv+MAbG6CHoZFxDCqCR - r4tgVwKIy58qobhcEik8JcBsbDDQCCHXEPWISlD5y6j53aioybV15OOTcX9mRIMBiMimezcJ7CrN6vuk - FTCo2D9YA8xohQpkLMHl45YDOIyprAbMx8CODWsNkyY2MIcEZDAJf/YI5NKNiCYPo9PbxFw7xcykAJKB - XbBlXDHfWB2/9FdnfxlsCBANmHAPVtZS+OEcJqYXs30Tq2HA2xG9c38J5aqBJaj53VCvkUriJXfcjKsu - 26/iJH5Fp9e9jGHkvt1LF0XUOykEYIYIr5xsqbk3vnSJ2i1Rz9sLEMgbXXMXY5h8Ytw9wxtLZzxPYmmW - cOaRB+AfOYzQ74B7Z2CM3fYJ+aq5Iiceg2FAgsCCsuQlAsQMEozd8x6CzQ5WVh5CMLmE1t7bQRun4cXr - oMGanRxpNqEzrs6cWmmZABIi+6gsg611BxlmmIQhvQBK5HHjcTbYldyEppLPgO2yWBgGCQ9K2b5ISrEA - lbBqN9kHAJvEI59M+XE+lC4xi4Lgh4lJeLT7R1Q9Ln4fDQYQSkAJAyqkHCfabey6euevHECKFF7Ygo5a - 8FSWuJQBZkucQxAwYLDdEk04LjjpQ6gAJDxwYxbGn4KZ3INu5zzSjYexOGUw3aJMLbPuv7KqMfzLGfEV - C8FIgkQAhEtYH7QQxR72LB2E8n2H49fNX9Rcq1PF8r9VwnfPl+sRWuPaqw/jObddTV+65+H9cRK9qNPv - fvlPP/HXG5/8zf+G29/y6gsS9k4BQAJ4thR07a1XT4kbLp+s2dzDmTElENhpGQcElcg3BubnWtjsnMPp - U23sWzoKZVKY3jlQFo1lo5CzrbrzsGRmwNiUU0QMFgZEBkKmmG37aDU01rsnsHrmNLzmLJoLV0CyAacJ - uLsKTno27ThriIyTsWG7Clx4IOUBMoDwQjCniOMEa2vrwPJJzKx+AcrLOGDRR3X7Erh7DAhAGMB4UMq+ - iwWAmuyaY7Usl5jHZQAaJ1HY39uh5DIw5HUzwEQYDHrwfWXdd1yzAxOPI/78WIOTDURnP4GTq11MtRcx - OdGGlBJEAiYZgNMIpBMI1iBiCAhA+jCk7K5JRoPCWaAxBZYCWih0N85Bn/0yploa0wsEL7P6G51YICnC - wDO5yliX5jCuIw9us8ljqLEbXbEb588bzM4dQHt2l6P7j5vTFVWr5H1B+S9XvldVgRId2PPSl3j5i2/B - H/3Jp9QDx898YzCIPrZnYdfWbW9+lcFbLkx1OwWAJoCXBb7Y84137hLz017Ni9aI/kVc+SWWkqQwrJ8I - OLRvEl956AGckldi1/xlCCChO6cBRxKwgoCVBkhYwi/WJxiAiUHGgESKUPpYnFSYaxP68SrWV89iMGBA - hhBeAPKaWWrqAFIpgDXSJEYSRUjSTLVIDESSZSkyCZqTDUxPBfDMhl0NW8oL6CQmZZf7u1mMDCA8KGn9 - zFYFGGYkKvq3iDxCqZ+G/ZefrxwXkkENcTuT095hsvaN2noG/S7CQEGQa9TMlgFXzfR1m3EAIE4RsMbe - AzPo9jQ2ogQ2tSCDjYIQPkSgoDwJ3w8gVQAmgk5S6CQCmwRGx9Brj4L0AGFAWJj00JgxEDAQnMDENgqU - M8OgpSNT0B2zGXoSCi1UAiqEaO5BzzuAM+cZreYu7Np/hZ1bI2HVFQlqRHVCqW/LYODebzAKCkVDkQOD - 1Aa3P+NK3HTdEfHQI2evTrW+9ez5lePPuPr6wU5IbCcAIAFcIQXdfHhv03/mddMIAzGcfKVMtDXEW1yv - E/cvQvx309kxQyrC5Ucmcd9Dd+O0uQLzs0fRmgphNh+DSfoAtA3HFbYNZLKsvSKTAgBA2InApEE6BYSE - kh7agUK7oQDybZJKk0CbFNoMoJNNxImGNoxQCLTbCn7gw/NCKCUzsTQjGNY2OQZiIM2J1FkkVc1OXKQu - y3McGsAoeNK2PU0Spw44/VrXd27HuapAPrlE5V5nnGi0DptE1JUe7D1MQNTvZR6AbBWgyd16jphf2qor - I8BSEAzBl4SD+9tgKIAEmK39RKcGSZoiSVJE0QBpsgFOGEoSQiXhtwQEMZSy54iDDIT6NnBHpzCZQXDI - 5bP+MybbrcuJF2Cg2AjVawHtA9ikXVg5TwiDORw4dotNDsu63E3jbC4jx/lEzs9XuX4x0Sv316kFBn4z - wNe98Gb8+d98Sa6sdd8kSPxxkiZnD+3dxw+f3H6h0E4AQAB4oZR05FXPW6C9i0E29g5xj+P0O6bvuhud - tFeF2ITiPmZASoErjs3i+KP34XR/NxZ270NrwgN1T8BE6wCnEAaAGKoDZHKJADbXX+5TNwYQ1gVEQmT3 - SAgh4ZMlbHgC8O123JZjM0D5une2XL7yCkP6cvL95QRu09VgZDvtHBCMAVEMKRSEMHY9AHFuqHe6LOfo - +TkHbB1iHfUSYAgKpYQfGFXhSnYEOPcAg0EP7WmJsiuzIvKX1sK7akFu8BpO7jz3PWWAJAH4CoAHK4ty - nnSUAY7Bme+e2QCxEwvCWV7B7N6hx4CzCNChUbFwNxpkaqIE+TPQ7f3YNPPY2GRMTOzGwctvRiEJlTrD - Pa6Tqly7ynbivkNb7jWuuS/rO2UM7nzBjTjya/+fOnf+vucJKY6RoPPZxNy2XAgA8iW/t8+0vakX3DJD - 023nJznHKDhRDZdnRrGTzLaPyQ8rvx25p1y/EISjh2ZxfmUNp4+fx/yBq9GeaoDPfxkcb1kDoLGdLgQN - bQMGgLDbmCEzDoLJ7mijLbGysBmHKd9Oi8iCAwgQ2ffqtmUlDl/5625R5u6yU+L6eT8K67IkCSXkUAJg - l3tfqFTFf675bZ20AJRBIAddLjt5MmlsMOhh3p8cRgFWAcD101WXUo6kyeLK/RVR2TXQsSk8MnD1+cIl - hxEjX+E6NMO6RlyJkBDBBHj2KqxHU9ha7WHp0PWY3X0ok1wypHftIqWuGqfXV8/V3ZdLd6b83nB/UwYF - MgbzS7N47jOvwhfuftiP4ugbAf6CDBtbF5ohFwIACeCZStL1t183JY7ua9qY51pi5uHkHZF2XClhjGhf - vN+oIaq+lDncwvwEpidTnD53H8z+ZwD+SXBvy+r5ebMMMtrlLIN4pg4YCwooNvfIiLsQmSmz1RHYWOs0 - CYeoi/32XELP2l7aZy9vgHDOC4xKBrmXgACSkMKDUoQ0tdZwG3fuWuWdGVh0ryPiu8RcSB2V/i1JWBVQ - cK4N9xPIrpkUaTyA708Ng4CywJ6CoPMdceuIvuoKG3H8D+8tBfvAIXozNOIBFY6e6fVg65kZLtri4SNK - AJCNSzADbh8Fb27gqlteBuH7dr3AyBx0527dlzrpwBmXEWJxCN+N3BxRDcr1KK3x6pfeit/5b3+jHju5 - 8sp2s/ULrTDs1DygVC4EACGAW5USB+58xqxYWghKUmCJEN1JVHAx5wULsYYqE3InBD/edkDEdoXXIMX6 - eg8mJcRrj0FFAxhtn2ftAPZeIsCQ7WfKz+UGQpNx+9xu4HoRXHWH7EQhIrDgDNvEEDjIEe3dTU/zyWUy - ICCH0Iv9Cd1jYaMBRQglgcFAQ+sUUoqs22hM/7gTi0bPVcX5UhVUc66sCjANQcDEEYxJ4XvkRAGmDkG7 - BD42kcLo5M5UBDfoqi5CEJXjgpjN8DgHCZMfA4U0UMUaZrLYORggWX4E4BbWzj6Iybk98PzmGJsX1x4W - J4hr7qurg1ECkZHAIKAEkM53yYwbbziCq47tE4+dOH8wSZPbVjc3Ttxx2zPTP//U32Jc2Q4AbKpvQTfv - WwzEDZe3ETbkUP/crrjIRjR6vnYn4JFZV5p0Q2t1+d4kMVhdHeD0mU0sn9kA0gSH95zBVNMr+olceivR - WuYpyK8LRz2godFwSNhWOuDs2DJ1zpg3W7UABCaRqQaZvQDVSY9RqSBXD0rcP29oCk8ReiZFmmj4rhOm - 5HKtswWg/MxaHZWK28Z7BcogAGIwGUSDPhgMTwHDpddVF2A9Rx9O4vwxAnk20KFQYMoie5F9iZ3rGIJC - sQbA1j9c7Zm9eW7hd4USuDjFgDFIN5exdvIkjp/uIZw+hN1HbsTuQ1dhcnYJUnnDvhrLEKucHhi9eZw0 - UPO3CgY134Uv8coX34yPf/pe1en1Xz/RbP6PPbt2bWsHuBAAXC8Frn3ujTPy2P4GxFirc93LO5OvuiFm - CSCy/6qg4HK4KmfKHtHrJTh1agsnT3XQ6yWYnWhiccpDyzcwqTUOEYYqQAEAOfcvVO4hEJCwbc8lg3zf - EcpciUJmgSci20FYSECqbOtsCc6uMQSYJJgEBBiCbZgrTKY/FolQc+kilxoqtgIQIBMoBbAxVg3Yjjjr - +j8/73L0vH8FUPbSVOopfl4FAWv7iAYdKMlQkq3or/OltHW6PTDi3mIAJAFvAin79lHMgLS6NhlTpBkv - QrmzcG2wzRxkV+gNJYN8BSBM/hgu45AZNqUABldAAQOCMdVq4si+Js6uncfxL/4J1s49jP3Hbsbi/ssR - NNtjRHj3vYDx0sJ2aoLz94JSwPCcpxkvueMG/Ktf/O/y+GPLzwuDcO+X7r33AWzDtrcDgBYBN4SBXLjl - yklamAvqAe9CZYTYhTPhqh1G5WtUqSj7PTNjcyvBo49u4czpDlqhj6sOTmPCZ5ikDx0PxdACX6oSNjKC - L0kE5DDkzBIsFEgFIBUCUsEUhO+DRWB3FxLKEr8BUgPoxCBJNNIkhU5ThK0WZiZn4JnHwGnHJgx1E6XW - gUEBAACZBL6yyJWWogHzQ6r0lWsfqAGCWpGVMernH28UzF1pg0EPnkeQZDIjYOJw/erifZSo0NYsANVC - 7B/GyvIqdGoglQfP96CUgJQEKWDrMqkNwtJ2FR9liUTIaCCNwckAJs3SxmX+/FLKdqBkchj5bjLiBwNa - gwRhptnAVHsC6z2DMyuP4P7PrWDQXcPeozegMTlrJb1xVFHL1d3zOwCA7XT/iiRAAPYcmMcN1x6kh0+c - m+oN+nf2+v3j73vru8y/+bVfqm3iOADIxf9nHFoK5dVHW1Bets3XGFF87LkRFdRRAbjy02q8gIuejhFx - a8vg0ccirK8Z7JmfwkxTQKQRoq0e2CSZv9r6rQuaYofeDMqGeJO5BbOwXiE9iLAJ8hpgFSJVTRjZgtY2 - Gi9JDVKjoVODNB3A6BQ6NeA0j11PgTSCSQZA0oM3PQ9x5XWYa8yC4y3LuXIbQ0k0ccAAmahiAJgESgIM - KwHUUG+FQKvDMkYVcMKlSz8ondtOHSBE/R48T9gowDyTjru3QMnAV7HUA2AhQY0lnF1lnL/vQeg0AVQD - wgtBygNJCSkVSAlIKaCkhFQ+lArhSQHlCUhfQXoJhNeBSPuQOoKJejBxH6yTUl5BBo/kEMDIXwZDg2Gg - kxQkI0wFTTSXprG8EeHM8c8CnGDfsZvQmFyo6SN3AMapADXH24UHF9e5/lrWeEWEV7/kZvzxn31BdXrd - Vy/OLvz6W1/zxuRSAOAyIXDdTVdMissPNCHq0n3vpLhi54hYWQ1GuVBFQJSEWF5LEEcCe2YbaIoUur+F - NIlAnBahqyWGmtNWNn+Her8lfCEkAAFSDcjWNNhrIVYT0LKBKNLobnTR760g7Wd5/nViE0mkfXBi9ylg - rUFsIAlQAlCKoITlXr21HrpbhzHXngIbm0DCghNlgUPWriBcMMgbLmyWGqUUAIMkTYb0SfV9lHVuTf9n - 56vnSmHCdaW+LoZ1AVoDYL7YqezfdzMZD0Nss2t5PEWwiPVTX0CzdwqCU6Q9RqoNEgOkmhFDWKCQHuCF - IC8ESSt9QSmQCuE3G2i0Wmi15uEHgFCbkGEXiLtIu+swSZSBgCnZAaoCCjI7QO5qNMygdACdpBBeA7sm - m9iMgc1zD2C12cCi58ELJ0sMqhRTUTu/K9+57r4K0Re7O1cjD8tgoJjx/GddjfnZtnzkxPlblJJ7v+PD - H7gfY9SAcQDQIMK1YSBnrr9sghbng/I7bWcGuPANoy/uJrjg8femJsRWfwIm3cJcQ8DTfSTdrl2sk+n7 - 7nwu7GyuUyJ3RGTEB5KADKGm5oHGLCJvCt1+jK0za4i6Z2GiLmiwAQzWIU0EKQhK5sRNEB5BBgRBqiTw - FMNCjNgIEPmAsMuXoQ2KBUpkss1HCUa4noS80QzoBJ6QAOtMAhgjcRXcfbvzLhBU1QhnPFwBoDQh4UgQ - QBz1EXgi09PTbIFNtp12FnXn+uYLI15uyRAEUhMgJviehHIYhOsosj9Loc0WdLwBrRmpYaSaoZkw8Jvo - hzNYDdpQjQk0JtpoT+1Bs02QwSqou4q4s2pTy+cpvXL3oasSuNJANu9MNgZGM4TWaAct+GQw2DiJ7mob - 7fkjkF6rYl+p0oTb9dtIBTm6V0FhLEhw6bcExsKuKdx83SF69NT5yfXNjRdubm0dZ+aYaJQu6wBAAFgS - RLfuWwzE1UcmQJKyXX4v5HbaIeGP9I8z22q8VoCB4RADs4DBIEJoBkDaRzrowOQ779SIvkX4QUXFhrDB - NyQVZHMG3twBpMEstroDrD/2CJKNc5CDdcikg4A0AiXhhQJC+HXDCmZAj+jOzgQ22uYsgGcBoPBXc+ZV - AAhkjZYFAAirHjADIoEUAYBsRWAhXm/nzqsr43R6lOvLbRCl+mp+yzYTUHuGirRrNtbeOEQP64tnFIp4 - cZ4YYAEhQpgkzvqxznY2JBgpCFLI4W7cWUl1jGRwGlHnJFLy0A2msBXOIJzZhZnde9Ga2wU/OIN47SR0 - vwPO9vLjDAS4hs64RLechRRbl1sQEnSyhf7GGfjNaTTaHkhWGuVqtBVCHZlFrl2AK/cWHTJO9C+fUwS8 - 7I7r8d//5HOq2++9zPeDX6kjfqAeAAjAPhK44fIDTXnVoSbkpYr/JZ2y2iMVa3WBfBieyyYeM6D9/Uj6 - ISh6CBx3oeMuOLP0j1paR5sxtJMRAAkSPuTkItSuy9FDE+cfvheD84/A76+ghQiBJyEb1p2Xd612MnLV - 9dqQFhlFrADIppZKU5u3gPMt0/NVi5bgmew25BakhJUMsgAhEikk2UUtaZpkQOEEG1WpftsAoQuAwIh7 - cMw1Bpg1kngAT9lMQEYndgszN/KuAAMUf4t03UKCWIBZQsdRkfKMS0ThHFa/wxUiCYEnEXoShgGt1zDY - XEXSOY0zq6cxsXQYc0tH4ftTiM89iLS7BjYJmNMiTqn6HB55HgNGQycRQAJCCHB/HWkygE4GkNREmdCy - iTdO968Q7qi+f4H7RtQMe06B8fxnXoGJVihX1jo3z0zPzB3Yt+/kl++9Z4RQ6mJKfQDHPEkLlx9s0dKu - wJlaowNTLuN0nostzguygREz0ME+mDgBog447oPTdDiR8lDVysQY/RAYCpA+1OQiwoO3opd6OPWlvwZO - fh7twWm0lUbDVxBEee6PMvg6dY9Ib+y0oZjwlqOaNIHd45OgNWe5DIcfLhJQsJOEwia54DSFgIGUhDSx - CUpGuUXdBKoTL8cMmVtfVTwdY3ziJIZObYyCTaqhRz8mS6aRv2tqwKn9a1KGYYlUG3AaD7MducOPbfqa - R5uus99JKdDyJdpigNbWwxg89Gmcvv9LSMJdCPZeD9GcBYQHhhwzV0Z6FDkzY8MwaQSOB+DBJkzaR+qq - PqWPG/9RXQdRkzikapiozRtYHRN3Lljj956lGVx7xV4ShOkkjm8/f/68rKO0KgAQgGlBuGlm0hNXHm5B - eGIMg70QkT9eELB1sAE4PAhtApjuKjiyll3L5UTmf3d85tVuKQ2qAISCCCfROHQb2Gth4ysfR3PzOJoU - I1CyUB24OgmrFdfUX0dHzIBgBscR0hQwrCyRpwY6NdBFUlMHCPIsNzkopHZVoZIEnabQqS5zmpHGuZPE - VY9qGlqrswLbTzjb5XE8ALOGErDif+qm18raXxB79ilAj6ENwPDsvoc6HfY3jzyuPI6VJtaNUX6vIEKg - BFqmA3n2Lmw9ehfk9H4ES1eB/AlAeLCu5TFjXqxxceYZWamU0xgm6iPZOAOWnl0SXsp94FZalyGoEixV - R9RVAq9GUlaIP/9IJfCi514NpaTXHwzu3NjcVG985WtHRrkOAOZJ0O37d4XqmiMtiMdNx1Wpgcf8dUdw - +JepCQ52w0QDa83V2R55lGXiyS3Jpc/Q6jcEAmFFTi+Ev3AU/vwR9B76NPzOKfhZqLBxYsLr6GCUw1ea - X5UMOJs6ZOMTkpTBsNmMrRTABSfUGSAYrQtiYZOlOMsCXzwJaJ1A67Rwo21PxJWGEiqN5vHf60DFOccA - omgAQQxJnLlA83Rso0SvC+nGQGuG1sZ6RChAPIggTTra926for6J48YivzcP7BGCECIGnbsHyeopBIuX - Q03vASnfBmwVzuOcDCpEL8RwzmULwpit5JJungebFNqUPSAFkdflCKwl+jFpxEpEXwF0oBYQFBgvfNaV - EFJ4cZLctjC7EFx55PKR2SFqvu8mwrGDS6E4drCZRf9VRwAXmHBuuUTDYFYXB3NgaiDtr8GkNvlkviqP - hB0YEnKYmotkPRgIAkkFEbYR7rkWgzMPYHDyHuvS48ozUUkHXn29cZKBe4vLhQCYuIc0ZTCFYE3ZviU8 - /ORqQcrQqY0x0Inl/lYlSK0EoDXSVJcbsx1RV96tFqW2BQG3knJgTzQYQAiGIM7y9xmYZEj4LtGbAvDy - 9yW7VkM2Meh1IVmPNLGO8F3Jblui53zXY/cGgulvoXv872C0RrBwCCJogoR0mMZ4oichS+fsug4Nk/SR - bp0FVIAhkVaz+tYEH9QRex3H3/a6wcj4MUMScOXR3ZifmRDG6H1MfPC3/+i/jqj8VSNgSISrAk94R/c1 - MTHpWaVqGwK9MIFfyj3Zd2aQPw3DEmawkYXRZktyswEmx3+T2wRy63mR3ppgo/pUANWYBEkfnQc/Cd3f - LD9yOE9KJ+1EpPrAOmAY5cyVN3UC8kzUR6oZECGMFoDOUpMRsoVIQy1muE6B7Hk2oFRDCYLROosGrOkz - Rr1RL0ch9+XcSMHCx1z5XmNfLB5F1gMgBWBtHDaFtl2XD5RX2FU27zS2chYCUBOIOl1ITsvdyiOPrD3v - vnrtxZpT0fnjiM4+AH9qESJsQwy6VsoCFxbe4epOFOBATpAWuas+TYp06xzCXVeB461stWa1/3hMwyoo - x9tcKw4dic4F84qrsNHwcNuNh+n02fVwY2vzWVudrXsBxG4rXEQgAG0iunluypNXHmpCPB7mvaNR3H7A - GASWLTuB4p49I8iG52bJIHPuD+GIZ+RIBtmCHJLKpvbyG4jO3o9k4zTydFBc14aRC24mmfH3j0gGsNBh - 4h50ygAFYBYjGxkNt6kfSgRDNUHDpOkQAIpYgHFqVM1L1CrWztDXGfrKDvHyAzIXoCfJZtXJAGCE06c8 - 3Gyn9CHACJBqIe51QJxaIbzSvLHcfltOXzd+2Smy2Z77p76CpLMC8psgzwdJVaiU+XwakS6L7wokFEQe - twG2O0CRAHMWCTmOa2+7WeiFuP0Yjo/630pBeO6tx6CUCOI4urXX78vv/pZ3lPpkFACAGxemfXnlwZbN - plNHmaVTYyAZF/jtBYuFTiaCMTHYpMUACJkPQAYEORhQdbAoW7QjQUoBykMCgd7ZB2Ci3qjYXtfSkQtl - FWEnYADY3PmsDVh4mQ3A2Y5uOzDICEonGpJgw451VQWoebBbShlo6u6vm0yVFyr93mSpwPpQggFtoKug - 5byHs4bHbs5kE/hAGwJUE2m/a1OB1wForYhfQ/TV+T9++EAgpBunEW0uw2TJRSlf0FVH9OQSvYKQ0i4K - k9n8A8A6tnkJs/iCYT+6NoAqUbsqlal/iVpgQPn3Y9YISAHcfsMhCBK+1vr6xbl59eaKIdBVAQjALBEO - Lcx44lCx+m88ce6sVO4tiUTbxQTYgTZptt00slh9me0MnKkBlPma7QSqoGHWOTaBhwKTsmm1tlaz3Xoq - E4zGnipfcFSEIQZWVIRSRQxOIxhjgGwfA2PIpkwcWZBUWRZgABYMSG1dk6kuVgTSyCKgassrDWZgmAm4 - RhVw66kNMspFYvuJogECosLwB12e0+zOUaC8IIcIkgUgQqSDPjxjgG2m28WI+LWnS11DMHEXUW8T5Leg - MkYizHCNRj4opchMGor+xT1kjcsAg00CnSTwpEJ9DoBqQ7YT8cddrwNt9/zwnCDCkQPzmJ5qiFNnNxaI - sPcdP/w998EJC3YBwANwzFPkH1gKMTnrgzSPHZOvRrETyIpUOfELo2wEnbOwBJyl0M4J3ti9AFwAEEJC - M7C1sQm/twXFuuaBle80BgxGgMCeHAcGBAD5piSswCyzNQHI7ZOlJcrVJQFgBlIGefYpSZLaAIUSbo6x - B5TCTskBAQx/X6oj/2IwDJ107hciS4fGiJMITd9GiZrUAGl5NyUXAAqJKH+eyGIyhLJpv2vGY8h/amT5 - uvlywRPOJa3R3VyHaBImcgNfFslHztLRKsGTMzCURWwKmUkMMNCZ7Yl4B4S+rf4/7rhyn2sHqDyTyCAM - FK67Yi/Ont9qbHQ6N3d6vQfhAIAbThYS4fqJhpSXHWhCFJH12L5BT6gaUEZLIgM2EZgNhFIQUtm/Slnx - SyqQlNnHOedez1UEKWGMwfLZM+hubTlutAs0h2tbV74+IqoO7QWFhGbsHgMGAgxVAACbigqQVsTm4ryx - qULJpgc3xlEDRkTAukk1Tm/MT11APRBsE8QVdq/ULpARdgMTk7JVayqfOvXGbgJkAcAw2b0XCuNh/qmK - wnX9XC/i1+tyld+xwcryMjbX1y3kZWqkcOZUIeYXc2x4Pp+LpFTx3ejUMh7KRfrtbAFjUHIn9xf0W1UD - yh3ADEhJuPHafSQFNeI4vmYQRSVPgCsBNIjo2smWsqv/ShEXT3AZqwaUi03eEYGFgfBCCOXZhRnGgESe - KcYM1QBn0YnNHMsgYQpuKKXEYBChaxgTkiBphy/o0onTTBp3X9WLAECwho4jpDxhuR5TwfVzZp3XnSfG - KYzQggFiCAMoIZAk1g4gpcQI58/7k5zGlvq65qVGxqXG1UGiqIcI0FEEozUkZRJApveX5mlFfR06bGya - dggPibYbto6l2p2cuoR5mrDAZneA2QldLAW3GzC4HF44fzPJQAw5PzIjICkPwgug0wRKygrrrABzrVQz - jllyzf1uh2bfS2nK8jln/yolcOPV+yClCJNEX2WMETdfeyM+e9fn7XXnqQ0CrmpPSHlsf3Mb/f9iyjZ6 - /gV/k71XGoF9A+E3bEezzeOPLGc8izzWfJghtgwGdl89EMH3FSZaTQy6CTS6kNC46OIQ+QVtBfkFhjXg - xX1L+MIrgD8P6CvE/XzcyQEHiyAQmiGJkMYJjNbOuDsif6mv8/rIAQHnXA4UAMpbhLlvlE0wZ1ELw+r/ - bDQkVBbuiwIAwJmG4jAmrhwLFiAVII4SCBOXiWanqv4lTlEiRmQUWHlotRpQQoIFAXn694ro7xJ+QfT5 - fUJAeh5E0ESSJAh8iRLhuiubxk6SqlgzRr8vTlVffBgcxBUVQUqBK47sghCktDH75mfnGmEQ9PNf5gAg - AMyAsDA9oWz8/9jOdYk4Oy5m6UX4DcdKAVSq3yRdGGXgBS0Y5WcbPFChZ3Fm/CNmm6CTzRAM8j3ksoy7 - BMbcTBuPRTG0x4DuVPSmiygVbn8hMBAE6KgLzQIkrSsw33oqZ9YjiYFoOH+YDGSqIQAkUWK3C+fSLHP0 - /rqJ4i7kqRplc7GyZuEQ5dfL/RQN+mCjQazASR7vn1VZsQPkzxkKlQQGgVTTRhOadOx8eyK4fakQA0Jh - YBoIJ5poNcPM3icxzONIw2CzErG7oJAdSwFSPmTYxiAagPxGuaE85njY+SgBRuklK2pZrfRgO5zzjq9I - HIKAhdkWZqea6PbW2wTaf/LM6fVswAsAkAAOSUG0ay5A2FZZANDjDgTAKIGPq7fKAu0fHXVgAg0RToA8 - D4QEpDOu7gCA5f4G+cafLDLPAPJrVu+bmZrA8loH6cQkxOAUOOqWu/RiJ1j1fqonO0nAYNCFAcGTAfL0 - 35xb4XlI8K4RsGDsmqGzRUG9aJBFA1aelLPcUhKEnArzqMia1uUgwM4YcK6DuPsecNZOQtTvZ1trKxjo - bA0DSoY+l+PDPc4s7CJoIhr0IJwgoGoLHz/BoxBi7FcCN2aQJk1Mhw00A89mMxZDcT9P+T48do2Aw+sW - ACSE8iEbM4hXN8ET/vbtKbwulY4ZeeELqQHO0UhgUH7FHvuewBVHF+nUuY1mt9c91h/0v4wKAHhEuCL0 - SR7e06is/qsj1ouRArYBkYJj5VTjvqydwCbtQacDoDEH4QV2U07ShReAjCv+59lesmPBDhjYDgp8gYXZ - SXQSgpw/AnP+AZv0g8Ro8y5l8lXB2cE8E3XtZWW3HHMXt+TCkJsA2QUEBkMnKTxipFEMk+9lkE8oaywo - +q204SjIbole9GsNaoFAXoBhJk3nWhEBNxRnBv0BJNst1Qyn1sBXJXp3SEsAYEFEBC0km12b2+/x9Hm1 - VL2jTtvVxCwGE0tQPY3ZydBuvZ4CkCrLAzkU7alqC8jBwL1PeiA/AAVtJIPTYDNp7U+lZ6NMxGO5Pcqd - NeYeduso3q1ajz1HAJQUOHZoEX/xyQebiU4PkxlO9gIAABxrBlIc3deAHGOPubQyBkRKq9mqBpLhNV9p - 9AfriBpz8IMJwCTF7q5WmTQWDAwXfwsAKIBBACLPF2+wMDeJ6OwGOmIGM3uuRnL2fqTd1SLWuwgprmni - Jb0+LFGn/Q6MNpnfeLj4xE2DkB+XmHLOVpMUDaWgdIL1lU202lMIAw/aaKTa5gpIUoM0i8hjEITXQKPV - RigMpBBO35dfSKcGvYQw2Fq3yTeFgFQKnlKQvoLyFVQWLdfr9LG1soKmYkjWNgLQTbeNCtFXjjMLD4TX - QNJdhtBJfbTsxRSqmWU518+IwZtcAM0fRa/LaDcTtCcCu5+hGIr1Q45flgRyUKh+J+VDBhPoDxIoQdmo - VhKq1E2IbY2CNfehQvglQyDKxxWPgqcEjuyfI0HUZMZhF6FU1lJFwJEwEOLA7hA7M45foi2gKmKWDFGj - Fu0wkFhZP4WodQCN5jQ47dln5HvBsbBELxjgChgUtgDHO0CAJwm75ydxdm0LW1MLmNx3I7zV44jWTsKk - cRFOzDmHrYJB7cCO66ah1qtgMiJSBRcsgTnXzxcLAgyTpPA8galQYP30aTALBI0AaRojSU22iEhDp1na - bCHBKoTyGziwZxKT0+2hjF4xGK6vrePRM49BmQE47gNgCOlBKQXpeRYMfA9CKnTX15FunMdUIKwEkOoi - s844RjY8dKzsXpjt3OskdaFt5k7tfKqZPgVoWlec8BoIZveDpw5gLWJI2sLsVBNSAKzJuvdyjp9x9xFj - oMwCg8TwPAkJ8kN47V04e+Y0ppuNzDPjvnGNYjN2Au2E6Ovvs19NTV2wAHBgFkKQH8fpHq01PeuW2/GJ - z3yykAAUCIdDX4j9u4InYAlwzYvlUsdFslIhBVS6iiTaAk/MWW8AzDD1lLHGP3uccW/hLLc0JlMThtlp - wBrNho9dNIHl9RXw1CKai9ehNb0X6dpJJJ3z0IMtDNNzDw2T45rP7Fwkq2uCCCJbh2AANJptmzxD5yJv - JqqzI9rlVypSHsOuuBOUYKqhEJkEnVOPYCMLl1ZS2o8iNCQglYDyG+hzipOnH0U73If2THsYoFLo4lZS - OHvmLNZPncXlh5dgkCKNI6QxI+kz4pSRGrvUF2zgk8FMAPjEMGkC1qaocntjvmvcYJhkgHa7jYEX2KzC - xoCzXXzLYm4eWEVuTQUwFifc7C0kIcMJeFOLkFP7EKlpdAYDcLyO+ekmQo9gdGL3ixTKEfmdv64EkAOD - GLoESXoQXgPsz2Cw9QiC6SUb1FUNAip5AlwwqBoE86M6FK2/t6xj1d3DUFJg/+5pEIG0MTO7F3c3fM/v - A0MVoAnQbBhIWpzzIWDAVe5eP+1xYSnA5fgonxuppsZgyISpCeDU2nH02guYaEzDcGqX1BqdifaW++cG - Qc6kAsrsAMhiBcpbSxm0mh6kamN1cxWbSRPJxB6o+Sn4sz1QvAlKIxgdw0RdKxkQWct9Hu8tlA1wF8Jy - dWHDQvP15YYJ2gCxNuh2e0i6GurE/WhwJ5MqCFzKK8+1YOByAJOmEIYRSAXfo+KZgjSI7Jbo0HZDVIkU - gWyA0hjraxvYj/2gUt/aCWnAWD6zjKY08OIOTNyB1DF8tiv22M/tFZypXpmklWqbAIR5tKmlsa5aNwUY - jMHZB7G1FWOtLzDRmEEY+FCS4JF11ZGxW6zbTUFsspGCiNgAQtiMzkYDJCC8EDJogZQHqAZMMIlINJHK - EIOtVXjcx/zsRAHCQmZ5FwudviwFlH3+rmQAy/1VANVexLnzK2iGPjy7PVINmVStoOV78hGvVwfGcPuq - caVuBHI7gAAm2wEaoUe9fjIhBC2cPmc9AQrWBbiLCDQ5Ia0H4AkrVQvIpXkVmk0Pav0xdLYuR2thGiLo - gWMGG1EOBBJDQ2AuFViVQBSeAnIjp9gg9CV2z0+iHyVYW3sMwm8iac5BhvPWyp0m4LgDk/RtRKL0QGyg - 0xgkPXCWoMPuCmS3BWMSGQAAWhvoJEbsKXDcR7R6Al5A2cCIwmHOJRTPwdQeD1UEC17aMEjr4Zr0zEjI - zmQhAJymoIAQSEJnqwMdxxDKAyogkEYJNtc3sLBnBmmvAz3oZBthklMbDV2SzHZdQ6V95XGvED1QyXhs - EK+dRrwVQcsAPTWB1GtCKAVJ2V6NzBBsQLBjLMB2W66sISQ9cGbgFNIHeQ3Ab1qOLj1oAFF3DRSvYHay - gUbYzsbfWPedk+GH6ox8wo0HcO/LVpf6E9DeHNbOfgl7F6fgeXnf1hFy+dworW9D6NVj3g4gRoGEYOB5 - Arvm21hd74UbW5sLnW73AcBKABLAPiWI5qc9kMozAO+0jJMCxnXAmN9uJwUQYWGG8OjZu9CbvgPtcAaG - NaCjYhFQEf9veBglmG8wmdkBINzIwcxYCAMJxkTDQ6sRIEkNtrrnMIgSO7myhSIsGzDGQAgJIoJGto2V - CpAituvJtQabGMQMgrFZaCTBCwheowWFBqATsI6Qq0Uk8rwG+eAx6rP9lAmcmYsspVWLNyHXWjSkpxF6 - Emv9GL2tLqZmppz+tYeb6xswWqPpZ3H5WU7CsQa9kULlh1eJvtwoFNmO2WB+qolZ6SExhMSkSNIEqWEY - Q2BBw+W3UkJKD1J5YLYZfoT0YEwKI0ILzGDwwGb8JbZx8ItTLfhyBnkMMufbw5OsGPYyABAusTvXSpKB - glAB1MQSTpxZRtMnNJuNmjnvEjthVH+8kHjvnNt2bUGV62PkuqcElhba+MpD58I4jhcoyymnYGMFlqQk - sTDjlzPb7kgNGFcuUnW4QFWtpo/JjdM4f+pBhEeughcm4GjD7gRkcpefzaabRwkiMwSycDeXzAHDCSCC - tQsQDHxFmJ9uWtGcrJ9eZ9lucsLRWoONHIpYCCAosOJ1AToGXIiuGThonakPqBB/bkG30kCR5IS4OFf4 - E2t9x6Ndy4wsj30KX3pgo7G50cHk7FSmN1Nx+/nlFTQDD4KQtZNrbR31nB5DG0lG/EW+Qmdpo5tMw+r0 - Nl4DxiY68ZQldEgv486qIDgLp5mKD43c1i6k3SnZGrUZ0lOQ0ocoDM12d58iQklkzy3E+TLXL+n/pRBg - l/glSPqQzXlsRh46q6exZ3EKfuDDAvO4QeFyt/F2RD/GkjqO8MfdV4hsgK8ElhYnSRA1icSiyPzeVgUg - 7FaKaNes/8QZAGs9Ahcg/LFSgH2R3Ys+HjzxOZw7PY2lvbshYICkm21IaQeahNVXh8uEMwOgqxJk3LMU - NlzaxCLPT2c7T8Kmvcq5s6BMbIcThqxzG8SQ+OF4Ioaxv8gyGlkqJc4MXuQQd5FrgAtR2BK1c5+jMlSt - KwXnNgY6TRGoAAKMzY1q5KMlrOVz5zHZaoByoOLRicylJ2BokHMJ3PleEE4JADLuL0RhJLX2QAPo3JCb - gFLK0nQNE3RIKSFz8bxIxGEcYiWAEyC1278X7RFU1uWJrOGvzs1XigLMrf4YqglCgoQHCqcwwBTOPHoc - Uy0PE+12MUfH9dro6XE6/ZhrpeM6VcC9ryKusZUAds1PgIhCIlqAKwEAWPAkicUZvyLF7JRTP15pYVwZ - Wt8BG9e8dyHBIyc/jmX/RVhc3AUplqGTLkjrgqiKZcBM1gjIbNfV85BgWeRSQB5RWF5P4K7SYpdQ8/Ou - vs52px8rDWRWX0GAyYJwsvUKRJTlwedCDckBqLSqi8ohdblKQLnaklu8MQSMvO9L5M3Wc6B8wBMS3W4f - aZLCU5mxioA0TrC12cX84hSgY5t/kLfT613uPvR2jIr8zu5GGectidMj6+qHxDgkzPyxjGGWXWs3KfZW - ZMYwACo34pX19Zygi7pRNuy5y3yH4r6tM5cMkBG/8NtI5CzOPHYGSm9hdm43pBI1xFhHyJXzvN199aL8 - 8NI2akC1fmJISZiZbBARAmPMVO5YyeMA5qUgmmqpHcYAPJ5SBxB1tgBURCVrW2i1fCzNdHDmkb8G87Ox - uGsXlFwFxx2wERiGpFlVADmBEcAZQLCzkCgnRCq4dx5DgMwtlXNuOwmrkYdgtpZyw4AYcnzrqhwaHocq - yZD4KQepbGLnUot7XKgIQCEZkAM+7AJAZWLkdwhiNEMf3ThCr9PF1MxkoVJsrq5DAAgD3+a5R05QlTKW - 02eE6vr3XQAYWUtfJriqrg1RibSriurIiFpU6nODdIT7G6eOnOhRlQCGOn7+jGG6+YzzSx/kTSLiSZw7 - dR66cxZLS/MIG40xxF9DzKXxqTLNMb8Zq9/z+PtK99q/ShJmphogIqWNbucPzyWAWSlAM5PVpYx1DX08 - LsHtfoPKcT6xczaQHRvG7EwDzOdx7uTfIIlvwe69exE2AiDdsjvy5uK3MZbzZFyVQBmB59xXFBzeBQPr - dkJ2znoRkMca5G7HHDBy8BDWK1G4HpnBlK9WdACgFKmY6faFupGBjcltA6aIYiskkbx3BGdMnMsECDhi - sU2FpppTaDd8DDa76A8STGX9yyCsb/YxPbeAsD0D7ln3ln3/oXSUTyhXDRi65F1xf7g3g7tyDrUAUF50 - M+JvryTdKOnopXqd7NCZf76I0nO4ffV3tRl+xPAdhrYBaX39ahK9yMe502egO2exe/cM2pOTxW5GI3Q5 - lrDHEe2Y4wsaDrlyqeY622Xks1MhiEBszIStmgsJYEpKoqkJVVbBR4jyiSp1oMJDOh/BjPIJ1oy52SaU - WsXZ5Y/jRP9qLB64wvpiVR+cdmGSCCT0kMApE9GLve+4sA9QFQxyAx0Pibcg9BxAKBPrYYaeBTPk8jZA - yTj1lhcv5RGL1TwGVIQtO+Tmct88CWqe9txCAADAFCAgwTLjWsoHwgmEqonpdgzVyBNV2HZ5E4uYP7QE - 2fBhwinwoAvoGJRnJWGTGfCzp+SAVICEHqoqwNCoijKXHyW20aW2ZcKvD8RBHUiISn1V0Ch8/a5+X1VB - KiAhBIQMQF4LsWmg0wHOn3oEntnC0p5ZtNtTWVzChRgcdnDNmfTj7APV+2rViHF2BYaQwETLz6G71Wg0 - ShLAlBBEE01ZowJsZ8jbAWFfjEmAL3SzY73WjKnJBkI/wtmVz2D5oQ00Zo9ien4BgQqgVAzons3Fx7og - XjgAkBkGMsJzwICGqkKJWwuHuIvVh1n8gcmTj7jE7rgb2WbC5JHAJWchE+eGcrKWZr9lYwusJxyG7W7G - RkiAbOARE8Eww5jMNw9bj87rTBhkehAiQhgECD2Vhapbwp5oKKxvDrCx2YMxGsw+SAZ21+NMFRCZ4UyQ - yEDAACa1i3gyP72gPFrAgEyKNO4VIFHVrYd/q0tvKwtwJJAv0a0jeqpw7noAcMR7R/cfqi8VW4CQECoE - VBOJVhhEHjZWNzDYXMaEF2NhYRF+ozkMStqW0OvE/cr9tVx7B+fGcfuRerkYw2Yji6Eg8pcWdvnvfvO3 - 9vKonwlBoFYot+HCj6dcQO/f9idVj0AZBILAw4ElxrnV+zBYXcW5rb1ozu5Hsz0FXwUIQgOJCEj6ztbQ - lusaYYqY8TyWADyMIyCHeEdXGeYBRplUkIv9nO8xY4mnMH4h2+Q020iyJGYX6gRAJCGCJtTUPvTjFEmq - sz0KDbTW0DqFjlOwGSDfYFQIgpQCUgooRVBKQiDbLp00gBgEwPcH8EULQFD0ZVP1Yfw+tGKAbM4vthH6 - 0IaRJtquM0iM3eHYWNXB5sLzIKSEkgpCiixlGcOTAqECkrUTdut28BAAcsLMUrXJLNMTFRpjOd6hIFxR - liBoDNEXHN61M7gqAyrAQDaKUygfUA0AHgYJIRkodLe66G+cgcIAs5OEubkl2z86qZmwdfO75i8DJQ5e - 5egjRL8dwVeOt/MiEBD6Xk5Snk51eNe991KuAgSCCGHgZgLcjus/UR6BUaLeGfI4IGAYIMLifBPRYB2b - 3Q3E589iZXUWfnsJjfYspArhyQBBKCCFAUyUWbwT65fP9rKDo/cOxXLjpCCDs+LQFK7F0ialZC3FNgw4 - 27/e2IU6IEbQnoUXrUMPNsE6y4WXAREDIFKgYAJqZjd6x7+AJIkhpYLyCIFHkL7dJRjQIGIIyohfEZSC - XQ/gKagsdx2Ek+aKUeRGyPuwNdlCayqzCeWSiTZ2dWG2C1GarTC08Q9sw6HZQoxmhjYJdGoQZxuCho0m - pvdcibS7YhfcGJ3ZDHPilSDpQU3MIWYPA20DrJSUkFJCSJs/gaCh4w7A2jFvlBNyoPK9HMFXEe2zFN8i - jzdQPiB8aEPoRwZJImE00NvaQtzbhC8NJkONyfaE5frGiSmgujlZQ3t195TmPaOesPNTFzD2FadqPAE0 - vEYAVJbzlJnl+tamFycJFOxSYBYCyFWAnTkCLkJE2NYYWAcC1Udsc092IxsgCDwshMCgfx79aAXJ1ll0 - NlpgNQXVnEPQnIRQAUAKkiQ82YJSAkIQVJbp1t3BtQAANjBpBDPYBOso8/Mbx5iYtUv6kK296A0idLc2 - YUzGtdMIOu5DkoZYOIBGexEMDY56NlDImOGbUYB+P0LvzHHMTdtNUJWwmz0qJaGUb1ecCTkUZQvdEcN+ - YitxFHuaA0MjIWA9JME02GsB/WXADBcokZDwhITnBygSghQ+uWwYjN3zLweJfMt+lGtuAABd1ElEQVQy - m6dAYuXMY0Bq0PCCIhdBLpaTVBBBG2jvRdzZQre7DghYX382HlJKtCaaCFvz0J1TKFLDO4ZBZJKE8EJI - fwIk/Rr3YqZCsF1/oI1BlBikEUNHNiuTTjXifh9p1IHgBKEv0WxqNBshgmbTSnZaV6dczRf3JI27uf43 - Y+tzGXKd3l+9z7lmULouYF3pDBbdfk8N4ggKuTxIsERQS4AjXy5QLpajV393cVJADjCcWdTDho+wAehk - C4N4E5pXkPROYrCpkHIIqBZINiH9JqQXQEi73JVIZNFmnPnZkSG+QRA2ETZ8ULQG0pGN8mPHZQgJIwJo - GSLpPIB0axlKCvhKQPqACgykZAzSNZjGXsiwDa0TkKGsLjvILD0Men2cO3U3nv3co3axS+4tyEVBsrn4 - YdyJ5vwlqunLar8aQDYBbwYYrJQm0JDp2He31VaeQwQhBXwl4Qc0BAoQkijGF//i0ziwdxdaXpC5FlH4 - 5Ul5UK1Z9DShGRKaXgOpZqRpilTH0FGK1DB8fwHhxB6gvwyrYJjMDQgUvnkVgsNd2OxFNksSZTn5iAsX - JRFnUZka2mjoJIXRsZXAdAIpGI3Ag9cEpBAIwwDS92135/tHXHSpI0p36o6TGMZw+pEI0O3q59rrUgk0 - Qg+bnYiSJBFJmlAuAQwfSW4lF0GEO+mPC0oB213aCTjYa2zsX6k8tDyyHFz3kCQG2hBYeNCskEYCcRfQ - TIgNASQtw2QrZAsiMNu48l64CzN7rkQznAIP1qyYabIUZAAAhSjROHv/57F3ag2TMxpCMKRkmzZaKEAA - eqsP4TUhgwkbu5DCTuRs6TErDzJgdLoDpFEKz3fHsRorMU4tq9MrqTzxQEC8CqTW6j+0QKL8m3H9XoRQ - O4ACAESIowhbW114YRMkCcSqaK8FgACyMQ0eMBqBQOi3bNSiyTYSNdbekOgeTjx4N3bNBfA8AeZstWOW - wBPCg2zMYbWjMVg9izQZ2H4mAcNsY3lAxRJdIQhCCASeBz+QkJJA8CCI4PseRCYjg+1ux4/LBlZHm+Rc - GBHtafRHIx6BbdSAkp2g/rogmxsA1s8kwdYLoKr1lCulJ0AKuNie2xmhj0oBlbsc3VxIiSDb+MGqu2lm - ObfGO5NzYAaK5PeCCjRd2TyNJLkMotWGSTuZJV2j8OGTB5OkOPHQA1i6fgoTrSw5ZMY5GSgChKQXQqQN - CM8DI19nL+wrSAU/tHHxcZzC8+Xoi42VsLhyyhHb8yw17nimHQDd4X0lgMjLUKUo9Mri/OhYMDPiOAFJ - haDRhKAYDPsOhf7v+RBBG0rbxCM2mE9YCVTZ9rFh9JaX8dhDD2HX4i3WI5Avx3DsCBTOoXviPsw0BQJ/ - onCNutOjkF0y9cECsrMaMCMc69Ov2MBKXHG7ObuDa9vedhGEXj3edn3IsK6hugrrK8YwEnD0N0+o+z+r - MEeoEe51gYeWpABc4L6qHpZPTLfDrJgshECRwGUkIGk4c5gAf2DsphEqBEkPeVL/QgUgCeVLaBB6/RTt - yYwjGoKrexMnWXBJAOH5KBJgcOaRkBKeLyClwiBK0RpJMpk3KhNzi3wCVRCgSje5E9El5hopoUTobj9W - h4lq6mYMBjGU8uAHPoRJwbASgI1fkCDl2U05+wNQBkzMovQMow36/QGMIXhBA0RxgQCFF0F6gNeCEEAQ - eggDf9gul6GWbB/5n9zIu01q+LFW9bE31swl3sFPxxn6avq30tf1z6jaBqo2oiFnGJPBAKP0OFY12I4o - LxZJ6kRXDF+Atrv3Ig2M2fUhINZ0Yi7eCkvodvsoH0IqMNLM5pCF7ZKEgkIQNhDFjlHP0dsBQCCxRirl - W6OVSob7GjKDpYBiBeX7iCL7DBr3rlasGNXP3eeWALcqYub6fI3xqvita0Nw7BDF71wpwxLVYBDBDwJI - zwOlEoRsYU8mugtlA5SKoCx22bttAwOI4gR+GEL6PoTWKDZSzJfzSg9QQZbr0Lp3S0Nffc/i/cYRKJX+ - 1BvodlKqHNl5HlXHZbsHOPWMVQeq36u/cd+DRypWwDa7YxQNdV8A2Jl9wK2kMnm3tQdcbJ01hsu8o2vv - cTgoUDGYjamfGYKs6w2kbAZZFk432j6SJBE0GhjEW/UDANjUV1k2ISE9sFHOfgbWgi6Vgh8EiKJsG/DS - OHD9u4xwbHfg4YxhVeesiv4Voh47VowqHuV1RlGMIAwhpbTLpslzAnjsFm9EXsb9s05k990YzBpRlCBo - Nu0WXSyATJWwBkXrvzdkpbEiZHosI6iO7YWml2vf2GnhHRxv95u6/t1JPS7RjwcGoiwS1p4s0oIXUQ1j - Xze3Qm/bH0+U3jBOvx33iO24fB3x16sI40HAHkoyMMYmCbHbRcsy0JMAQSAImxhE6/UCCwAp2G4hrRSE - 8sDsZRbqLAaDJISQ8P0GBlFn+/4otbGqWlVFe1chHidhjbFclSSNGg7qYjszoihB2Gzadf1GFnp07gIk - z4eBgEA+IUelODbWlhA2J4oFQlbdyQFA2pRsQGm9RKlPaExfXVBfrpsrOyk7uH8sRoxTA3ZSCdfcPlqf - Nhr9QZo/TAMWAGLYcUOUMNoX9bJ04T4d97ttpYDtibHsFcAF7hvXcdn3Cxo57TklgVjH0IbhCQUUBDsU - 8YUQCBtNbG46i2gAuACjJGGgI8DLctcZZWN0igVEAgIKfiNE1NuAjbvLm0JjbRz2elVKGDc4YyZ3rUoA - jIJM5bwraWQAMDE9BZLC9hPD2VrLRt2lzBDCOFvQlYmXmRHFCebmG0PpAUNXo42DUNCphhT5gqjKpK/j - 4LXq0HbG5ieiVKUu99LFEnzlPXdA+PmfNDXoRymYYaSQmoSVq2LAxo5vdlN3uo1WzPWni3cbu5b48XTk - dh10gc7j6pdx923TbgKIGEoROO1Da8ulXX3VjXUPmw3EiSkt5nHrEwLgdFDkrSOVqRTF7rM2pNcPQkSx - swNwCemd79VBKPmAd8opRidLuY6qiGnGPoOZMcgkAJFvna3su9l3ViAVQGttJYCCKMofZoM4ThE2m8hj - CMoSCIFJIY4GUNKGINcTivsZBnm5eSOKzwXnxLi+HTOnRj6uyuM+80L6vNN+uG2vtstU/rJTo/2NnbVk - giDQE80JqOzu1EoApsxxLlgcbg5nbKrvsd3viIeiGtfcM3I8+rV8sk56cPXaMdKFyz2pXDkzIIUFAKMN - WMls4rrFirhBo4FUwwYSSQyflVUtBMC6V1jDbV5WDCclCQhI+GGIODWVeehwtlqviEvArrRQvc4OMdUN - lGt0rXIvV3pz+3JYVxRZwiVBsAa+XHQXmSclAOsUAlmIL7t9bp9njA1BDpuNrKk02kyhkPT6UCIDiLGS - zoUmZUViKHkNLkV/3+batlpplfCzYx5XEWrur94yHPMoSXNhVbfCRjLVnixiAHrG8Eynp2lEyqzWuJ0t - IH8glSe9PR4n7mM4AS4oie1UFdimw92TI6K/K0JTqQOFIJi0a+MGSNVIc1af9YIAhglpqiHzuIPCyJV1 - iu4BpEDCz3YJYuTJSwABQRYAbOi5sYHx1Q4d6+aj8jNH+ogrt2+jw5VUggrAjlEXtDHQ2iBsNLLUZxLI - EnEi2yOBZAgkGpQDQMmOYF22aZpCMyEIQ4dzuoUA4SON+wjlMItwGfTGqDI1NoeRvil+/kSpAdW+r3hU - Lkjw1bbsgOidv8yM/iABmJlA6URrYnDTtTdwLgFsGoM9m92UdmT8KBFVDYWNBVnnXnKIbKw3zyXUMYRe - urYNGNS5uupeqg5sAMvNsh1z8q29RvuK4fkeQBJxYhAEYzpD920gCxQgJYjyZcTZqkES8P3/f3vvHSfJ - dd33fm9VdZqeuDObgcUCC2B3kSMBAoIIUCRFQmKQKdGWbFrv+ZnSsz425Wd/ZPv5+eP3LEuiIm3KMkVJ - zKSZBFAgCCKRBIicw2IXm+PsTs4zHSvc+/6oqu7q6qru6gm7Cwrn8+mZCjfXPb977rnnnptBCB3LckgZ - RsMGnkYQiOvMfpGC8/aIkbAmLQSfh0b2SBAPgaRwZUfLdA/azGQzCF15ylFqEofQdTCyKGXibvLx9/41 - tr9lWiAEqXQqoOH3y+FNB7Q0jrWIFtQBqChACwJ7xDePA4Km6yQkEqYTnFa1Sk/F/I9KOkqCcElKRalk - +RMss1Aumd/5wd/V7ADmHanUYtFJUN0oJosRq1vFV6FrEWbAVml7Dd30TWMQPmK0bgwfeidiyu6UvbXm - wCGcoUY3DHeZy6w60B0hPgPCqeBvQ3XBxPNVDy4ICA0jnULoBmbVJpczGsvXNB2KGKEbgIIQUIbbyZNA - IiWKoNTlS0kRor/3PStVE8NIk0pnEJqJa8LnzfU9DztKSyNU2T2Xr0k6cUdAyzTRDAPDaFioCnxqASKN - squuH4ZYCigwI19H9VURwVRJKWY+3zaZKMklhukj+3ILgMD1ZL2wVEG5yqny1MyUZNypAcCc4yg1t2Sh - ElW4zVSgVhCR/F0bSb45UADtRQzjN+ko2gFVhD4gmJZT8d7pESDh+gHQdZ1UOk3FtOu8GQIVoapeBza8 - 5SwPVIRAoIOWIZNLk8p2Ua6Y9NX270d9dNFa1G9ggDi9gMAFIT+d8Lt2oFMHgXKpSqYrj57Lo0nhuVNU - 9e8kDNDSXn52XVkamDYqKamaJqlU2l1JiGRed0UBadFoRBQK0xLsqQFXdNTVFP/D3y7czv7/VkwfAy6x - PFsHVNtxmF2suAtNiIImNMRmo6YEnLEdpWYX/FWAhBVvNxXoOJG4NFqFiVrSiQkflDRipw3xIKDhesBB - pKhLII0KTE3TSGdyVKrzoSrURXEN9yQb0kOQMkDa4Hn0cWyJ7ehUcehetx2RnqbRXDVmzh5r1RcGTUJg - EWo/JRqzaRJjRWO4BolAINL99KzvpiLzpEQaI6VcJvb1GJqByPaj61MIAqscnnm2L2VUKjaZrKdHcELF - 8MstDFeKUA71LS0x5Y1kvBbtuWyK0jvETQUSTDVUJ+EDfTq0wuDYknkXABwhxJJw52w1AJiyHKUmZ01k - 1NQ2tqLtGD6BFBA5ciUFkpB4FaU/aFmuCBAQMe+Fb8XneOKy7v3A9zqDnsXQ03T1DVCan8TznVMvnOca - XMNmenQYlepBOSWUbYKykbZ79Llj20gp6e3N09sjQU3Wiy7CFQ117FgtblizLWLAwkszVrqKSNMbnYQQ - 9K1bj7lkMHn6jHd6j+H6L9B114uQkUGlJkmVZunxfRM2fEt3CbBYqpAf2IBI58Cy8U+EdsN57e9qTBAN - Hb5F+zSBWgu9QMdWgHFtlGDu3tDE4XD1A2miEwhKePEShO1IpmdLSilVFULM+wEMQCrFhOMoOTVndYiD - oalAEvNJERE/XJmoaWqD3XmEHqF2GQKTsFY/PI/1y+z/bwLwenqG5nrgEbkhSKfAqYLjYNkOlmVjV8G0 - wMhvRdcsBHOBSnuqLs/Bx+Lws1h0IaQJ0kQTNoYGuu4eX54yBLmuLFlhhPQlqg0IRLVZFEIGpYFWjOC9 - FzF5NaSryBlF+vUy5XIFx1aYjrfNV3niv57Dlhrr8ha960L2FLW0NXLrLkbv3shSwSCl9ZAyejHShidN - aKClEOk+DN33YqUa4jfVI7LoYeAP1zEOIFs9i/osqjlay7AJRf2W1oONYS3LYWyqgFKqohRTBAEAGLMd - pSaTAkBUn6rxWYt5dlTdmirqizBxKwuBysYp64Lz3AAziJQGOdwdemUVWF1SdWCI0h94+GAYMHbqEGrG - RBOmq8xzTJS0kbaJkhZIh6yusW7jAELNNablka4LNvQsolhyt7ajar79NE1D1zR3u6pWQjhBfUMABGpt - H0bLKKVduH3D0gAhIIhSEopQe4fy8tLSKdHX5dCb013Gl5rrS9DDG6Uq2JZDJptC1wJ70Wp9ynVAunHT - BuYWykyfPErNWWfNE5KBSOWwnTmy5Vm6e8MdK6wUjJcGhRCQEi5mmKo+kAY37TR2wKhOGUMiOn546hy5 - chFxH1ue9oBhWTbj00WkoixRUyKwF0ACZ6REziyYqKpEpETj3oy4VZKaoiSkIOpYjI9SCEalEZVXu/zc - d0oIRmZKvHRkkb4eg3fs6CNvGG3yqDOcEu75dWp6P5X5Exi6QlMmupDoOqQ1QcpwmTuTTpGr+VlpFk0F - 0Nfju68KMmR4pBIRXSwEkiKcRzCvqKlVjBIqsgnD+gEfDeOAwF3GNLx2TfmgEpRYFHUXarU0G+snEPQY - s2iZEqZpYlnKdTsmJe4BUBpKy1CtmOQHdDQtH9EGcZ22MYzpWOw/WqRQsrn2sh66s6lA/JXqBVqJ/6J9 - ONUGECLjBkG7Xg/LdhidKiglVUXX9RmhCSVNWZcAFKhi2WFh3qJrQzqRfiJW3xIZsBUgxI+8icKGr8OK - LgGWcvjeE1N8+b4J+noN/uiTO7j24h5PNxWlDAzlp9zjlbYOOUhVQNNEbeQWAVNg997ytNO+KNqMpu5I - oxrLGaeQrD2KYOYGMT7mgylCCs2Y/Bp0Ay0ApGlaEMwzsMW61gGDxRdEf7PgXF2hU6U3r6PyWc+K1nNo - 4cVSEmw77XryEYJIjb2IvXGz1ODIySXu++EU0zMWpfeavOv6DaRTq60YjKIIBkvE8NFt3phOMIxrTVqu - 2swtVJBKldK6PmHourJMq7YMuIRShaop8yOTVbFxQ6eHhCYYrTtunKAmvlV+7fNRAkamSvzkpXmOHK2Q - SgtmFkx3JErCGIHyZLNhDz2N18pntob2a1He2DIE4jYxMCQDgbC+BOLNPDuUBhokkCQMEwR1SXR71AFc - AGjCO+m3VXvHjbLhaWQzmEpgYqbCyGiV6VmHn7wwx81XDJBOpVnZEmAHcRumYK3itZsexE8DHKmYnith - 21LhWv1OGGlDQl1bYik4XTGlOj1ZWZ4CtDYyxBUyKZot53nMPMu7kEKx71iR46crKGDLphRDvSk0RIsy - RyvFfLdK/gm6jffe+FT7H46/HGUOgTSD70RjmiqQb2RdwqNDmzxrm00i0ggq3aI20oTDNJUTGrXW8WGV - VDUvzP5BLKp2WpOMjhdbBtnQTpqSbNmQoivn+nY4OWwyPltwzb1ZwU+1+7UrN53n06LNbdtheHQRqZQS - QiyYlln2gdP3w2QDx8tV6ZwaqzQ6m11V6gRVVedRwhE80K9YNq8dXGJkvIqSipuvy7NpIBM4Rz6cURRT - BMXfViAR+i+oHVGNLtwNQv5P896JmLgtmy+mvJF1CXecYJ1jmK+WXhSwRKQdGy7EgGEwalmOUHo+cKhW - 4RIylndU/AWbuti4XkfTFeWy4pX989iOQ3sm7oS525WJBIAYZvoW3zcU3rIkR0/NI6WyBGJME5paKLhO - a3wJwFaKo6WKI4+eLuO0FUfiqJ0UkCB+bOO0Cx99rYTg2OkiL+1bolSUZHOCO67vZ6A7FZFUKxAIj6It - QMB3XmOIOqPrgOa907xrHdCVBwyibmHcACDCtXjTUvU9CCom34ZvEMeIgXctpYEIIEjEWHFSQYtRqnaZ - dJQN9IuWgNAmDeWelnPF5VnyOVBS8fyrBeaLlbo0t5x0W1IUYLYAsCDDJ2X6QJsqwLIdjp+eV1KqskId - 99a/gMAUADhiWkqeGq+A428JXg4ItIvWLs32TJ04vICq5fDkawu8cbCIUrB7Z5ZrL+4hk9aa01St8gnl - UQsbEJV8r7a10V3VGbrp4wXSCgJDUDoQAkQKjDyk+yDVC3o2oGOIYNSWI3In0kBEWyTttLFlaDdqB18l - GAnDn6VjQHDx94bdPawbcHdljo7ZPPvGDDLRSL6Sn39Ia+h6uQyPon7SdCCOclcAjrgSQEnTtFOapkUD - gFLI2QWb+VkzOIbSGakEz5YLAp2FV0JwaLjAo8/OMjvnkE7BB24b4KKN2YAuLGl5I/Lw10r90dxnYj9M - rSMH7pvyCIcLpKNrYGQhPQhd2yC7GVI9NVdYiRxKNIGaiv7ftrMRkWbcyBcFMgnAKGKEbg0GLebSwbiR - wFBnuk1Dea7enSWdBtuGHz+9yPhcMUEZl8P0IQALMnvsXJ74+4bH0fHLFYuTI4tKKlUSQhyLAgAJTCpY - WCza6uRIBSlWogQId/aYMB2n10EcAfPFKg8+O81LbxRQCq7cleWuGwbozadCaanIy+jOHcxD1efxGgHj - kVBiQcVXw7eJAAn/n1AuAKQykB2E3l2Qvwi0LhcAakr0TkCg3YgdTCYKKIJptuqsRL+LnB4kG6mbO3on - I3RcdgqUxBAad97cz/oh9/iwMyMWDz09iWnbAVdjHfxi9QPhIoXiiU7SD7ZFPChKKTkzsUSxbKEUBSnl - CQKWUkGbyTJKHVss2vLombK7J2ClpGJvOo0ceKTahhcCbKl4du8c9/5oioVFh95ewUfuGmLXRflApWNA - IKxhb/rvrZX74rqICBuJ6oF7f3VLqMZ5vwrG9z+oCfYCOEWobaENFj08ugXrFOo0baUBFd9BG54Fyqji - whKTV7C84TBJGCCYzQpHZaUQUrJtUzd33NxNNuPazT/x/BIvH5hFSpmYL+PHixaM3Oo+iuET19kly5bs - PTSDlMoRQoxLKYvBAEEAqCh4c6HoOIeHS64E0NL+ux2pBM/apRvRWduAgDs9Vuw7ucgX7x/j4NEKqRTc - +Y4+7n7nIL25VMQIFE4mzASh/0LVlXZNozo0zU9RdWavKQFpVAj6EkRQZyAlOGWoTkDhAJROgLMEjkXk - XDyRNBDH0KFnrUaquHRVi/Si0mkSzcNl7nA0rLV961Ex6mcIjTtvHeSKy9MgFHNzDvc+MsXRkUXQ/CPf - z8Yv6tEy0Ue5FpSvH5jCkaqC4oBASMuq+1cIbsUqK8Ublap0jp6uoEwntBK4TBBQEc+Wna5qGUV4THZk - pMjf3DfC488vIiVccVmWj9+9kYu3dIcaNaoMKuIyyPzU3NM3vG9ifO86ONLXFIOqnlbke+9eSdcHgTkP - 1XGwJsEpgLKod+pw27QCgUCY2O8SM9pGvYsChFggaMPgqwEGURJCS2AIxpFs7MvykfesY+tmHdtWHD5W - 5W8fHufURAH0oAvzVfhFTQs6ZvYoRmhsR9txeP3glHIcWRZC7BVCNJwDEpQATOCA4yg1NlVlYrK6LJaP - pBUlFAMYoY4ihFubQ2cKfPa7p/nuo7OUipILt6T4px/cwO3XDpDWtVByCcAo+Mhnfi30IggowXL5I3pw - ec/vjEq5jkPDoCEIrAp459E7FbBLrjSACaJpg3ygIGFGasFMsYo5Qv9VRFJtmDuyDAmZuyUYxMRZzsga - BAelQMJVO/r58LsHGFwnqJqSF14r8rcPj3NidMmVBGr7X1bA5G0BtROmj2sz1zBtbqHCiZEFpFQVIcQe - TdMaAEAPpZYTQnywK6sP3LS7R2zfloswCV6OckAQbVraSbox5qAC12mEDi8dmudz3z3D3z48y8ycw4b1 - KX79Ixv4+Ae2MNST8Y78Fm2yFNH5+WK/HrJxVy3qUTPyaVXXUH7BW9/8N8wMsftUItKNPDasVROLuBeR - be81QnyYBlIJ+kESChpPrZbFmpuOJgSb1mdRmsXR4TKFJcX4lMlCwWSgT2doIIWmac0bDmNJtX4X2TVU - 66QalM3xg5iUkmdeG+NbDx5Rli1PaEL8eSpllG2njgFhAMgCN4C4bPfFee2ma/vQ23a0Dhp4RSDQHFYA - Iq1RtiwefWGav/j2GR58coHFRcnmDSl+9e4hPvHhrVww1IWS4bRERLIi5j/eslzILl2FwqlAOrUlwVYM - KOL/iyCzRwBJU0dpw+hNG4rafaN23yLAfA2a8shM25QpyYs2YmSicicTozNpgy0b0jjSZmSiytKSZHTS - ZHKmQjqjGBpIuyc4ByW/WJIt8vTbME6Ub1ePVvkrLEfxtfsP8tzrE6Yj1VNKqe/qum47AQAIe5tcVIpX - Fov23YeHy4ayVPO+lpVQE2CHH7RC9Po7AbjeMxQHTi3y0NNT3PujGfYdLlOtQi6ncet13fzmR7ewfWMX - StagM5ReOMvgBwn89815g2FUKHxQKhDKO1o8Ks1QncIbgWrOSQLvNe+5VHUg8CUEFVXmYF398qrGx3G7 - B/16NHkAhubO6rdhFBC0ArxA2wfbODKP4L2frgylR3wnFVFphikEBBKGetJ88Gc3sFSyePDHS66Z8N4i - sws2p8cq3HZjPxdvziPQwXbP0+iMQgzcsBsydB9bQdXivUI6Dk+/OobtyIpAvCCEcKqm2RDKCMUqAfsc - R8mTI2XGJyps25yNyHs5olfSOPHhhAakXCeap8eW+MkrCzz63AxPv7LExIyNdAS6BkoqdA0Gug1UZAcK - MUkkCATu/RURFRUmory+jqAGCmFGDyavmsMoaHAC0nTcV4hpGlx/h8LUyug9Vy3K0gQEBBgoqv1ovG/y - J9h44m8zOAUyixJmmnsArTt9BLUEhrgM3S20/T0GEn97s8Ky4MiJCjNzFkdOlXjndb1cu7uHTUMBIJAt - GFfFlCNSkkgCKFFg7P5RwMRMmUMn5pV0lKlp+rNCCFs6jXOXMAA4wGmpODM8Udlx8GRJ27olh75qMoA/ - woUrERjZg3NX4W+ecf9XClX2HZ/j1f0FXti7yAtvFDg9ZrG45KBpgkwaFALLUuw9VOKxV+b4pTuzaLW5 - f1SHjwKBQIOKgI2+inhfG10DTBwFFm0Zz5MYhGpM0x9Va+kG0gmfex/p8DTQpg2dJFiMuHYJMGakb8Ao - YIJGT0Tt+k4bMIgK0vJF3Egp2gerJSuQUnF0ZImX9xQJHjtumTA6bjG/6HBsuMIrby6x+9Iudu/Ic/GW - LJlczsU9/3Qo1djmTZJC1Fw+djtuK3BpfCel4pU3pyiWbalgTAiOZbNpWSjaDeGMiBSnlVKvnJmsbt9/ - vKTddfugO/VdFSkgPqowNMiAe0QWSNtmvmAxOWszPFnh8Okyx09WOHiyyJGTFSZmHIpFiVSKy3ek6c7r - HDhsuk2sBKfHTL7/k2luvbqPLQNdrufoyGEmCgQCnVoEn4nmOoQZXQtNB4LvGkAgHMYLF2bkoNcfXx8Q - zFzH3ctZK3YLiSGqPEF9Q+S0IEoqCYdp+JI0AoH/OMkgEsPQkc0V1Snbzf8TFkGBads88MQkk5N2nbcE - bN6kk8vBkeMWJ05JxicsXttfYNvmNBdtzbBpU5btW9Ks788w2KfT3WWgGfWDZIQjUFZIgxjpP6KNyN9G - /2Cj+NHzp3EcaQOv2I5TdpxmzWUUAMwoxUvFsvNLB0+WKC7a9Of1mGxWZyrgSMmBEwv87Y+nqFYUUilM - SzK/ZDO74DA1bzI2ZTG/IKlWFFWvAXdemuH9tw9w543rKFYs/sXvnsCyQAiFacKzry/xo+dn+PjdOVzX - kXGie5wkoAJz7cDLhulbHKO1YLqwj79wZ6559g1LAsE4AQmlCZwCuoJYHUTcvJ824QikTXS4yM8e1hME - yxdFEf0q3OkTd712ARsHBqkkrx6e5rlXfN8ALvX16rzvZ/u45tIent87z7OvLXH6tEVxVGNyymHvoTL5 - vGD9OoPefIr+Po3unE4q5bpK68ppXLe7h2t29CGCfgBjmTk5w4fDVyo2T748hu0oSwjxEyGEXa5UmmIY - EalUgENKsXhkuDR08kxZXLurp364Q2SmywCBwFSgYko+e88w33xgDtsbzZRSOA44jkAq5X0IQVcebr8+ - z5039nH71QNce1kPG/qyzCya3H7TJD95tuh9R8XYpMV9j09z0xW9XLG9H+FEiVAxHa1Bqd6CsVU4TKcg - EPVhQ0xew4ngNMArnG9roELMW5MGwpVrJ+7HAQHU5vRNzkZbpFl7HxSFRQgIQmEiKagcJVDeNtVrS80R - Fspl7nl4ioVFWc9CwLatKX7+nYNsHcpzydYubrmqyOuHF3l1/xJHT5gsLcFSQTA15SBEFd+Hqe/ZMZUS - jIxX2LYpy0A+S6PRVojZIxWBUdSsB5DAgSMzjEwUlZSqJIR4krqc2EBGTIqnHakOHDxZun3/iZJ+1RU9 - GInXPZNSo3hbsWwWFhtsFEhnXIYfWqdz+fYcV+7Ic80lPeze3s2OrTkGujMIXDdcA/kU/+wjm3j2lWOY - pqcrlvD8ngL3PzHFto05ejK+GXCruWOAgbSYd52CQNCsWoVBoMV0IJhGw1bPUBgNamdsRJYtTnkXVb+g - uO8/D26dXobk0ECBqU1DUTpR6LWYIzclEwariHcBkigeeGqCfYerOJ4RjwD6ujVuuTbPpvVdCAWDvRkG - r0izc3ueO64fYHi8zJHhEsfPFBkeNZlfUFgmVMpuP1QojBRUTAdduKbFKrgy07S9eRl6AI9sFD98bgTT - cqQQYp9SakKI6DlYHACcUYqXZhftW988XtSrJQcjo7dApJXpA7JpnU/+8nZ2bJ6mWFakDHcpb7DPYKg3 - Q19Phg0DKTYOpBnqTaNpuufdSdXEekPXuH33AHe8o4sfPllC1107gflFh+/+eJqbdvfwnps3eFP08CgN - sczdIHq3CBcFAgJv+TAw4vsjsxLegBojotcYF5o6qgoBSuzcOE4aiAOewLNa5/TDxrVZlOQQ1T8i6hGs - T2x7t4jXQG0YJkF0JWD/iXkefGyeSqV+NLvQ4ILNKe68uR8dGpSCfV1p+i7OsOuibt5xlcXsosncok2h - aDFfdG0IylVXgs1nNa7b5XoeVkHDrihm9087btmezRUTAqQpefTZM1i2tEA9LIRwpIweweMAYAnY40hV - 2XO4kD49WmHnJV1t9DjL1wfoQnD9jn52bO3CclyeSRkamZTrihuhu0Elro+4CFFeCMFgT4Z/+gubePaV - 45RLqiZpHjxW4ZuPTLBja55LNucb5/OR5Y9gxtp1C+VaUDytrR6EGDw8tZCB8G2lAX/kbJxCNYVpWb4O - gcCvc5QitAkIgroJWqTbpks0AXCUBBOkuHedzf0XixW+9dA4YxN2w9w/n9O4/aZuNg3mm8y3lWdCjBAM - 5NMMdGdgK4CD7TiYljuVVQoMHXJpw5PmgrqMCD1A7FkBEc8Cn0Eq2H90lqOnFpBSmSAeEmDHtZwW81wC - RxypDr1+uOAcPFlCJmLuhJrWiDhKQm8uw2B3hoF8hu50mpRIge1qTVXkGmtjOumUxm1XrOO9t/cgVX2c - t214+Kl5vv/0JItlM2aUSVL+Dj6GpiLyCTFMbWMQIbSPyUeF0mriXRWRlyK+nlHhw+G8X9L9BQ3h4/KP - yjvmPrKILcK3fd5cHiEEUjp8/8lxXt5TwnZ8p6MKocH2C1O8+5Z16GHGbaiO58DU8fqqLTBI0ZVK05NL - 09uVpiudDoBkqK2E6qAeUVVx28oCHnrqNIWy5YDYK4Q4le/piZ3AtwKAY0rx0syCJd84WqRUtJct5bcn - HwRU/ed7fo0I14rW92f4tfdvZP2QdyINrkQxO+/w1e9P8Oy+OWwpAzq4VmKWarqMZx5Vb7nI8sZcBzcW - qZg0a7cRHSPRzj5apEV8njVLw2BbxAFBuGOHypcIPFrcBz0tN32P5f8ECikkLx6c4YHH5igUpXeSkfu+ - Jy9438/0sXGgi2QOP+u/mgfjgFfjWNPgpvrIwH1ElKi6CIlj2vzw2RGqVWkD9yupqtUI7X9D94sgBSwA - exxHFV7Yt8iZiWpCd+HLkQL8zpIkrdZiYNoQvGNXPx96dz9o9f6naYIDR6t8/r5RDp8uhIA8zJyh+yZp - rA1jN4Rv1bkJ2Rn4ryPSbCpv0tEbmvMP3rYbcWLSjNz2G1fGkFTQ6S4/AY0MEU4vqgjtRn+PSXUYnljk - 2w9OcGbMcs1Q/NFfwBWXp/iZG9d5m+JWBjbJfjGfIkE8B9izf4qjw4s4UlZQPITANkPmv0HSiCcHeMOR - 6tCrB5ecw6fKyFXZAdVp1CQg0LjMNNSX4VfevYldO1I43rRBeOv3jz23yFceHGFyodwmTdXiXYv34RE5 - UnJolWZQGgg8j+zggThN7qJjwjVd+7cRTJfYHXhEmnH1Cpc3SbyWfu8jRtJWfB9MR4O5pTL3PDrB62+W - sWzlmf66yuWBfsEv/dwgg91ZWivkOmTwqKgNzdQatOLubQH3PTbMYqHqoHgJoU5qhtaSa1sBgMS1B3hl - bsmWL+xbZGGxk2nAckBAxUTtgAGBlCa4/tJefuW9Q+TzeFMBF9FLJcU3fzDNvU+MUzKtNvnEMXmL9wpv - 23H4VVgZ1q7jQ6PY22KUVYE4DQwTzq/VNY3ptJqORNUj1mNwTPhgWZsAiDZxkzJFC3AQgkrV4uFnJvnx - cwsUy66mTil3Y4+uKe68Jc91uwYDVqRtGLpdcRt+4bJ1UI+ovIVibrbMk6+MU646FvC3KCqt9WatAUAB - BeAVx1FTj74wq4bHl3tqUCe0XBAIPFXQm0/xoZ/ZwO035JFe51S4U4GJaYe//M4Yj748iYo8STb4DZKA - QGhUl4RAIGIu7YePc3whAu0gVWN+ojHpyLRjpYE2TK0C8WPjxAFMWBJJCgYhaSKSGUiWRktmca+FAClt - ntkzzfd+NMP0jO29VbXi79ie4iN3bSBv6ERONTph7pbM69/L5veqVZzGS1sXPPHCKKdGl5SUagp4nIjN - P2HSaU9lpbi5UHK237i7R9t1UReG3gkKLBcxRERUER0u6qmAvh4D3VC8fmiJ+QWJ5u3P14RgZs5hZLrM - ZdszXLixO2KJU9QT8n30J6lTbTYSFS8YPbBGryLSDurUZHD5UDQusQlCABFVRhFT5KiyCZpQPtbOoE1b - 1MKJUNAo0+R27Rl62GQanYzc6ileOzzH1743zv6j1drU1k1J0NWl+Oe/soGbdw+6x8ctm5JIweG2DMcJ - tVXEVEQIsC2HP/vSm7yyf8a2bXUvcK8Qotou93YAoHC3CF8uFTekDS19x3V99HQb7dKNqMRyaAUgIFzj - oA0DKaYWquw9Wsa2fX50NW/jUxYTcxWuuDTHxsGuiMYVAWOeQD4ilGe4D9b2DoQYN6p1ZRzzi/rAEM4z - fO3QgpIAQVTwGMYSsTctniUJJlqESzidbFM2AShdcPj0Al/+3hgv7im6e0cICmGKu+/q4WPv3UIu5Z+d - 2+kv2IbLoYD014QJzdKD0gVvHJjmr75ziPHpsqUU/x9wmAR+i5JIABLQlOKdMwvW4F03DYgLN2brPJGY - ziYI1C3U8rkUgwM6B4eLnBoxEfhHeAukFIyMm8wsVblmZ5Z1vTEgoInQ6BW6jhzQvJG0wfQ4BBoqlI4P - GrW+JCKyDDzzl+mcJO2bAAjCm55atXfbb9LB9xZxceMMfNrMv8N5+4CpwfBEka9+f5QnXihQqdCwEU9K - uHJXmt/85QvYOpRfo1VvleBx4KYGgPF1tnXBl+45zCPPjDoV03lJCPGXQoj5JKVJAgAA88CNpiV3bxjI - aDdf2UM2rSWM2lCTZVInINDYaYQQDPanMVKSNw4XmVuQLnh5IGDZMDxaZaFU5YYruujpitD4tpwCxInL - AaaWAaaWotmhr08qBAS1fyI6fQE4KnoKkeg7JJkaRIBX7V41l48k923CRlo4JqWYsDpMzpf4+g9GeOTJ - RQoFz8FnQLLu7YXf+tUt3LRrHXqn3bsVqcQPY97Fh1Wa4PRIgc9+8yCHTy5YSvFpEM/i2gS1paQAYAH9 - SnHzxKzV/Qu3D4qh/lSkVNuaViAFREZP1tFSusbW9VnmimXePFaiWqX28YUQmCacHDVZLFe58Yo8+Vym - EQQEjUq5qHla0ygdmv+GR/ZYvVoUg0YAgJ+F7yC4rY6i1fsOdAStnrcFg07AKe7RMvqQJphbqvC/Hhrl - gccWmF+UDYKU23yKX/vQIB/8mU10pcNs0YlJcacU7GdxEo+IjiMETkrje4+c5NuPnJSLReuEUnxaCDGq - aZpSqn25kgKAwj067M5i2blwx4U57epL86SM5cDkWoFAFNPVS9+VMbhoc4bDZ4qcHDWRTqC/CkGlqjhx - pspiucpNV3TTlfVBwBuB9DSksu7hnHrWvRde8/mbQ2pDioopa/hhGwVhA0OF6u8r/2Rc+LgCrBQI4iSC - qOBt8mpHcTqxluULvRGCpXKVrz90hu8+Os/MnGwauGxH8e7b8/z6B7eysS+LWOmxeCuiGGZv0vy70tfM - XIW//NZhXtk/bdmO+grwA6AshGA1AQBcPwFbpeK6qVkz+5E7h0R3l7EMKSCqkh3Ga4oecdJvRB7retJs - 2qDz6oElpmadeijvT6WiOH66ykLZ5PpdXa4kIFKQyoOeAyPjHdMd/hmgnNpHie73HU4hRNw7UddaOUSn - syIgEPFROhLlW9QjERgk5f54xaYQgsWyyVd+cJp7Hp5jZrZx5AewHdh9ucFv/soF7NrWi74i5l8JtVAe - Rkqd4OiCx54Z5Sv3H1PTs9UpBX8CHBFCOEmYHzoDAAWMK8X7F4rO+l3bu8Tu7Z0uCQZptUGgfR5CCDYN - Zenpkbx8oEChqOqhvKDliuLocJn5ssnVVwzQ07vOBQF0EBreWiLe/MGVAjQDtDTudkWbWqdsUg62YnzR - GjiCzA910b9VnUVSRot734lE0CqP4KuEYJCIEVsD0mLZ5Av3n+LehxpHfj+WlLBhvcZvfmwLt181RDrV - CTt0SgkY0t91GWbeKH+MQlAoWHz+3iM88fKEbdry74DvAAudSDCdAkABuERKrp6et9L/4K4N5LIr0Zas - tU6g+Zmh6Vx0QRemU2HPoTJVMxDKBwFTcHJeUEhnuOyCPAP5Lk/RJpoZ1Y8tdBAG4HjSgP88VBQRAIfg - fVT5w9KA/18m0fzHAUGSeX0rIGgx1UoKBiJp+E4VgPU0ZgoVPnfvKe774Txz82Hmd330ZLsU//TD6/ng - HRvpzhqBPNeQYkbzevHj9ACNz6QuePbVSf7m3qOMTpUXleLPgNeJ8fwTR51CngQmlOLu+SV74Kod3WLn - RV1ona8J+rVdebxlgEA2ZXDp9jyTCyUOn6jU3JD5/KXn0rCun+NTiqkli4s2ZVnfk0coA9BcSaBhvu9r - xDUXCJQZQPEYpl6ONCCE53E2wTJdZDslmL+3BYLlAEiLPEWb923zaqaR2SL//RunePDxRRaXVJ35vQul - IJVSfOS9A/za+zcz1JsNfMY1BoAGisgrtnkbv+VSweJL9x3n0WdH7aopHwG+Csx0WoJOAUABi8BltsOV - 47PV1EfuXE8ucy6kgEDcTkFAQW9Xmp07ujg1XuDEGRPHYyphaGTX95LqzVO1dI6Pw+i8ZOtQjs393WgY - gBEAAWiwtxCePkJZ0XmLmDJBe2kgqPVvCpNUGkja9m1GZ7HMeO3yFa3ex6clBEilODSywKe/eprHnl2i - VHb384tAPIXrmOM9t/fwf3x4CxduzHsOOv0lzeVIHUFaIYBEAmywbCA1wQuvTfHZbx/mzGR5SSk+A7xA - wqW/IC1n0uMAo0rxwdkFu3fnRV3iih3dyzAMaqj1yuImVlg1gsBQT4bdO7IcPrPE8KiFVAI9ZZDdvA6h - pxFaBsvOcWrK4PiUor8ny9Z13aT1NLXDAoSg7szBz0MDWa3fhjt1cCBuOQ0IAJwMKv1aMdlqTgsSvGv5 - 6ZY7RRD1kbilhOAxvwYVy+HZN6f4zNfP8PxrJUzLHfGDsXyvPLff1MUnPrqVndt60URcm5wLarH3wQcA - IVhYMvnaAyd46OlR27TkD4EvAZPLyXE5AKBwfQVstx2uG5+u6h+8Y5Du3EoVKOcGBDYOZNm5PcOh4QJn - Jiz0rhzpwT4QaYTIIbQubNXD6FyWN0c0jFSaretydKdT7sghFAjpgUDgJBxlebqAABP7zB5ZvBbMEfQj - 0fB6hUCQaLUgQfkgAfN0AAat0goAghAu888uVrnvqTH+5jsT7D1cxXFE04CkAF2DG6/J8hu/spVrLx1A - F6HTos8KACSVEKLDSRQv7Z3mz//XITU6VZ5Xis8CT7OM0R+WBwDgjkVnlOIXZxftvo2DaXHjVb2s3Hjq - 3IDA5nU5dlyU5vhoibFiCr27ByGyIPIIvQeh96EYYGqpm31nNBZNxcY+g8FuzfP56XGoUNQNhmyQdkwZ - EuowwpvElqNPWFUgaFrWiM6v7Wdc7vQiEETXkNLhyMgSX/nBGb794CynTlugRBMfK0DTFNdfleUTv7yZ - m68YJKVpEdp2P/RaU7s8Qlp/39BLwOyCyZe/d4JHnhl1TEv+CPgbYGq5JVkuAPhSwJAj1TvGp039529d - R3+vsSIWbqz8CuJ2qBMQCLYM5bj0oiynF2FkKYNSWYSWB60Poa1D6IMIfZClcp6DIw6nZkrksxYb+yBr - 4DJ8cCqgLO9ZXDlipgR+6zaM+q0UhnF1TAoEcYrCJN8jQZ6dgkHsabT1ub4wBEslk6f3zvA33x3jh08v - MjOr6iu0gWSVcldub7g6y2/88mZuuXqIjBbj4bolAMRVZKWAoSIvI9f9JbzwxhR/8uUDamquOgn8FfAM - HWr+g7QSud0BhpXi/QsFe10urYk7bhpYUYJ1SqKtbhE3sSRQf65pgi1DXVyyrYfJosGpKQ2puhF6H2jr - EPoGhL4JzeiiatoMT5Z48/QcVbvIQF4y1Ku5h6dIDwQc01MExiz7Ba9ru1Go+xJox/jLAoJOFIWdAEGS - fJKAAS2/ndAEaIrjY0v83ePjfPX+SV57s0y57Ir34bg+899yfY5PfHQzt14zRFbTA6csrzWplrfxbRBR - OAFTc1X+4puHefKVKcdx1KPA54DZlZRwpfy6BAhHqp8bmzb1W67uZcvmbN0Tdqe/cI3bNpTXWA2/Vlrc - diCgsWkwzyVb17FQEZyY1LGcbjSjF8QAQusHBBolHLvAzEKBN0/NMzK3gK6ZbBoQZDMGwnbAKoF0Gu38 - g3b/EmqOJoKjvWxX5k7E51ZAmnBq0OR+PGoa0O4jtdnjLuLCu9dCgEgJihWTJ16d4msPjHH/43MMj1hI - 2TjyKy8xpRSaDnfemuc3PrqFm68cIqvrzd6aGrIWnJtlwKhvqBpuLVvy+EsT/LevHVKLRes08D+Al2iz - GbwdrRQAJDAM3FqsyAuqptR+/p2DpNNaBGPG/MIjJIHrsMJMCO+kYOFu0dWFq4zXvZ+G+9wfDTRBk/lX - GxDQNZ2N6/rZsaWHqqNxfFJQMTPoetr9KKqMUIsIFkEVKZULnBpfYv+ZeWYLJbpzks2DOsKp1kfy8Cag - GgCIRoBIxMxJ7+Oq2unI3ml67RJox4CNSQpdA02y/9QC33l0nG88OMWLe4osFpS7vCdocNgjcF3A6Qb8 - 4l29fOIfbOHay9aR1jWP+VuUIXIKkLR+qwwcobKMTpb53b96kzcOz1el4vu4c//CSrNZDYm9BCxIqT44 - NWelt23KsfvKATSluQejxf48s1qheYwaBA3qvwaGJ8DogZ8fNvzMBwM/ftu1SgFKoGkphgZ6uWxzDqHB - 8UmLpZKDLiqgFkEueCCwhKZKWHaZmcUKh04XODZeZHZilvV9Dv0DOYSMGlU60Yiz/LhNt8vVE0Sl26lU - 0abda2l65tmahkhpTM4XuO8nE3z9+5M88vQCp8csLFvUsL1hDBXg2Ipcl+JXf3GQf/ahrey8qBejQeHX - YrfdmkwLOgWG4PKne10xJd98eJiv3H9CVqrOUeBTwIFlJN5Eq2X8PA5srVTl1YtFpd1x/Qb6ers8y7lU - xM+o//dNaIVnXOODgyHA8P7XGJjoj9SyGUS9pkGQaPWxlULT06zryXHZpjQ9ecmpqSVmFgroFEEtgVpC - yAKoEoIqKJty1ebUyUVefWmCIycLVB2TCzelyObTCCemXEnvWwJBJ9JAEsbtBAiSppksLVfc1yhbFR59 - YZKvfG+c+x+b483DZYolDxx8BV+oWpYFmzYKPvGxjfzq+7awfVPeXedvAOAW5Yo1w11tSpKHW05HKg6d - XOI//vlezkyUlxT8L+DbQFt3X0lotQDABMaV5D0zC1Z/zkiLn7lxC7oyQBqgQj8i7tHd/7oOurfDTtcD - kkHA8KaxjdpKlg0KqDAIRGmdlQIlEZpBXz7NpRt1tgxKRmYWGJtZAFVAyBKoElBBKBNNODiFMsWReeZn - qhw/Y7L3SJEjwwWE7poTG9m052G2+UMnul+pNNDwaKVAEPF+BWAgEIiMjiNNntwzxRe+O8bf/XCal/eW - mJ2TOI7XBZpSdK+qVcVVu1N88tcu4EN3bGTjQBbR0ZDuhz2bOoD25alUHX73c/t5/MVJ6TjqdeD/xR1w - V4VWCwAUrtcgaVrqrukFS79sa46LL8ohHMdThoV/snHypmnerrqUJw3oHkD4cr8PBmEgCIlvcWCvIhi9 - NmXwAtbseFS9nALyGYPt63V2blXMlRYYHl/EkWWEqADucp85t0h1agFZce0xbEsxO+9w5FSVPQeL7D+1 - hJYy2bYxh5FOhYCgQ2ZcVSBoFb4Thd/ywEAIgUjpKM3iqT2T/PW9I9zz8CzP7ykyMe1geQspjZ+5DuhS - giMlP39nnn/1Dy/kXdcN0deVdsPE7VmKLP7ZGv1DpGIeCHAcxQNPjPLprx1WhZI9iyv6P8kKFX9BWs39 - jzYwqRQ7l4rWJY5ta7dd1UV3l+Mth5nezwr8TBAWGDZoDi5XSPerSnc+jtRBedtxG35a9JDQUnqNeemD - QIM04IGAY4KskjEkWwcMrtmeQs+UOHxmkVKhhFwqUJ2cx5orIKtW4AO6eZmWYnrO5vDJCq/sK/L60QXQ - q1y0MUsqk/LshpLsrkui5FttIIhsxM7fR4CBy/gaVbvK469N8JffGeXbD03z4uslRidtTFNFqOMaVyQc - B/I9il//B4N84sMXcO2OAXLpJF16TSb7zdSxK7DGIo5OlvjkH73O8TPFqlL8APgMUNQ0LZGzjyS0mgDg - bxeecxz13vHpatdgryZuvLIbXTgEFrmpqcE1CSkHdAcXPywPLPzroKQgXGlA+dMFT/0v9MbVhKStGxVW - D0gWSnhldUBa4FTQZZnBnMWVWxVbe4u8uXeMiZOLOOUqyqmb/YrGP6BcIJiadThyssKLbxR57s1ZimaZ - rZsM8tm0u1NNRY22q8HEbYCk4zRapNMmjNAFQofppSI/eHaM//mtEe55eIaX95WYmLIxLRWxHb45HcdR - XH6pwb/+J1v42M9t5qIN3W18U7Qp71lfAoRWYGA58F/+cj8PPjOmbEcNA78NnAASufpKSqvtAcEBpoFM - xZTvnFmw9F3bu7hwa67Z774OpETdmU9tJPTAQUlqQIDt/pQTWD7zgcCfHuh1iSC8rBjZ9jGa35okoAJl - 8oBA2aAsetKSSzemuXl3hvlCgZOnzZDL8fCgJ2r3lgWzC5ITZ0xe3lfixy/OMTy9SHePYrA3jaHrMcXu - VEnYLk4rZVir950DgRACoQksafPmqTm+/sgIn/v2GA88Ps/eQxWm5yS2TcOoFufUQilIp+EDd3Xzb/7x - Nu68YT3r8pkI4a7DUb5h2W0lEsLK/QM6wANPjPGHXzrEUtEq4or+D7GKor9Pa+ECxQSmleLyuSV7u+Mo - 7YZd3fT5ZwkIPA1/oJFbeENyRXGPAWuA4OsRBCitWSpAS/gNo0BA1JcfG8rTuIyUSWlsHcpx81X9bN0K - R8+UWFzyR6+AiioEAr7e0ZGCxYJkZMLkjcMVfvz8Is/tn2W6WKK3R9CTS6EJLdSxO5UGEsaJeybUitJR - CizH4eT0Ag+9MMbn7hnlK383xZMvFTh22mJxSSKly+xtWU+4S3/bt+n8xj/cyD//4IXsvqiP7LK9+CRZ - 1lwLUm3fnjxT5F+5or+tFI8Af4hrdLfqtBYA4PsMKNq2uv3MZLVnQ39KXHtZNyl/SU8PhW7VLk320UEw - sN17pdzpgfSAQPnTgwCD+zqeJik7Qlnk/9dEyFCHhsgCwUB3mt3be7jt2h6qVBges9z5q6qPYnHSgC8x - VCqK6VmbY6dNXnyjyCPPzPPCoRnGF4qkUpJsRkPzpBtN80ZU0ViSJlqRfiCkEIsBIR/MhFcYqRSWIylW - bQ6NzfHIyxN8/r4RvvjdSR5+apF9hypMzjhUTRdbahJTnP5NgPI29/T1arz3jm7+7ccv5D3v2MjGvgwa - YpXVdud2BUAIQbni8B///E1+9MKEsh11Cvgt4PhaFW4tYW8A+B0h+LdXXpJP/+m/vpT3vHMAPSWavSK1 - 94AU887nbB1IAykQKW+1QIJmgfCnD3Zdn9Bw2k7gIjhtaFhgViET3WaFlkJxZq7MU3sm+fx3J3n9zQrF - kkQpzWXaWjQRkXVd2nCN1RSZjEZ3TmOwX+eiC1Jcs7OLG3b2sHNbNxv7usildVK6hmEIdD1gDeXrEbyz - ENtPDVqP5EEJJtg+jiOxHYXlKExTMrZQ5PhImdeOLLDvUJVTZyzmFx0KJem5XRN1FUuoHWoebIN5ee2Q - 79LYvSPDP7p7iJ+9cT1b+nPomkbrQy+X0a3PiQ6gMXtLKj5/zwn+82f3MzNfLSj417iefpa11TdRvmtZ - J+AK4FPplHb3L94xqP/eJy9h58VdjZJl0xp8TGptjX2CQJB2lxI1AcJxQUB4u/Nw3FWGsA+POBAQuCsS - tmprpy80QdmyOTVe5PtPT3DPD2c5ctJkqSgRtACCsHTgFc0/s84wIJfR6OpyAWHLJoMrdmTZsSXPxRdk - uHCom+5MmmxGI2NoGIZGyhAYhkAIrT5Ux5kcB5/VCuAek23bCtNWOI7CtCUVU1KoWJyZKTE8VuXYSJFD - xyuMTTrMzklKVYdyRWHbAoFAD3pPC+VVq3ugbEqCQtGd19i+NcUH3tXHh+/YyNaN3eTTOipsWdlSX9Gu - z4TvzxYANOcjNcHTr0zxW7/3OgdPLNlSqS8B/wGYW8uCrfXEJwO8D/iD/h7jin/xD7dq/+bjFzLYn4oQ - relcEoisjq8HCAKBqoNAbYVBNe66EwE0iAIBf9ahovIM3HkbkuYqFsdPL/Hdn0zw6DOLHDttsrTkAUFt - dhIvDTQMht4+AqncjTG6jsvsKY2uLkFPXmNwncb2rWm2DHYx0GuwYchgQ1+G7lyajKFjGMIFBV2gae4B - qW6fd9OVyh3VLVthOWBaDoWqyfSCyeSMzdyCw/hchVOjJjOzkkJBUSorqrakairX1EO56TZs9Qi1U5hf - hXCXtKR0p03d3YLtWzPccXM3v3TnerZf0Mu6XAqUCI367bT6CcPVC3LuJABdcOJ0gU/+4R4efW5SWrZ8 - FvjfgWOsMSqdDc1HL/AJAf9+0/rM0O/9y4vFr31gI9m0FnvyduR90nc1jtVwTY09INA0z9bABuFt1VWy - viuvoTW8C63xtgYCCZpRaAKFZLpkceTkIg88Nc0TLy9y+GSVuQUXCPQoIAiVIQwOwituwyKF5m6HTaUg - pesYuiCVFqRTkDIE6ZRGNgu5LshkcaUEXaDrAinBclwtfLUCpTJUqmCZCtsB01a1a0cqLFvhOO6I7esi - fKZvXl2NmkoEnnsYLJWiv09wyYVZbru+mw/cNsilF/Ux2OUqQtudcd/qOyQPvhaskGA7sC6YWzD5L587 - yJfuO6mWSvYw8BvAj1kDrX/LJlhD2gT8FyH4+BU78rnP/M5lvOumfnSt3hFaNlKr5y2rFZwWZEA33JFe - s+pTAmUTOh+6HjcoCfjLlbYCJ+ESmXCBwJGK2ZLJ0VOLPPbyLE+/vsS+w2XGpxykrI/KEDVwidbPoCZC - N4BCsAy1n/CUiIHkPClA4Y7gPrgEs/QNcERwdA8WKEoh2bTAUr9SCmxboemKTRsMdl6c49Zru3nXDQPs - 2NbHQM7A0LW6d/VVo7PV3ZOQQghB1XL463tO8odfOszYdGVRKf4z8HmgeDZKsZYnIQSpBJwSsGtu0d4+ - OmVqN1/Rw1B/uvGTdCIFtCU/ZX/VwJv3+3sO8PcY+G68gu6XItIJKq/iXH5HPfNGynzGYMtQF1fv6uOW - 3e7cfV2/jhQOC0WbSkXVwjYwVNS0oKFYARbT3KUyf6OlpoMuXHDxw9WmE9JjeClqS5fK08xrmm8T5cX1 - mkrzpRDf54IKTt+9OXQTGLiBlHKP4LIsSSYDl1+c5t239vIr7xvin/zCJu68eQMXb+qmJ224ZZWBb9Kq - fVfsxTdU1rNEQoCD4MGnJvjTrx7h5GjJkoovAp/FNas/K3S2AEDhKjPGpeTGsWlzcH7JEe+8trfuTHQ5 - zJ9IEex/WM8KUeHtLzC8Xu0FaQUC4Q1IrfbwE/PcY+6ulM76/gy7dvRy65XdXLmjix0XZujrE5Qsm9kF - B8dWtfl0LaU2U4PGHEXksrY/ggerFDwuvVl0CNcm6lnz8yA5DlQthRKSrZt1br8hz4fvHOQfvX89H333 - Rm66Yh1bB3N0pTx3ckrSmjpl0g50AGeRlCF4ae8sn/rCYV47uODYjnoQd71/eBmVXDadLQAAdxgeAxYt - W73z1Fglb9uIO67vazbhXPb8P4YajlbyTJGVd4gHen10FzGjTnhaELQdaA7U+rkHBBldpz+f5qLNea7f - 1ctNV3RzzaXdXHpRmt4+KJkWc/OehRzUXVzHTgPqL8PTAxFRpAbJoUXnj3rXCgyUEtg2mJbEkYqNG+HW - 67r4yLvX8bH3beCj797Au98xxM4LexnszZAxPM+8vkK27bJlbEkThDnbFN1ZlaFx+NgSf/TFI+rHL06p - iilfBn4f92QfZ2WHk3ZG56LVBoB/CfyH9QOprn/3v23jtz++DaMjg6Dl1NTnck9rRhrIuXoBTYLmbVZS - dt2VV7il/CUriLANaNWcbRhMKBylqFqKYtnk9GSFY2dKHDhV5M0TBd44XOL4sIVZcZf1XJ2Bf0xhAiAQ - EeG8NhF+27QxwxVxo7xyrRptx1UepDJw8UU6V1yc55rLurnswjyXbO1i24Ys+a4UaV13dT8q2em18c3X - addtt2pwllYBDMHoeIU/+uJhvvrAablQsI7jbvG9D3eqfFbpXMHmRlyl4D/btimb+k+f2M6vf3Qrhi2j - GX3Vvkt4cu2DQKo9CDQsCwp3NcBR8fl09Nx764nhjnLX3ktVm8m5KiOTVYYnyxw6XWD/8SIHTlQYHbWp - VIQ7VdAEuqbV1tyjjG3qF9ESQeRz6mDgKwelv1lTKTRNkc4otm7R2bmti92X5rj8gh62bcyxaV2GTYMZ - ctkUaV2rnbpbU1I2MNxKtPedtXHrOEl0DlGUsINqGnOLJp/95nE+883janrenMEV+7/AWZz3d1q7tcp3 - O/DfNU3cffm2nPFf/+UlfOS9G9As1ViotQDlBl8CHghoKdClu0ToLxPKACCF7QL8vUqBs0CSNW2CJg/g - lFSuO2jLsVkoWswu2MwsWkwtVDk2WuTkaJXhiSJHhitMTSsqFYFpCqTjV9Vfm/cOy6itzzeP/nVloGsX - 4FvnaZq7fJjNKtYPaey4IMeFG3JccmGG7Ru72dCfYV1vinV9rgOVlK7XlI+1Txg2p2454i6zWyaKFqkc - WfvRXwiKJZuvPXCa3/vCYUYnKyXgfwJ/BkysbeYdtcZZIw3XUvCvDF3ccvWlef1Tn7yUn7t9HbodUMat - Wa1DICCyoGVA8wyGRLW+RBgHAlZgSVC0zKyD5xEhvfK6y3zKdYKhJMWKTbEsKVVslkru/WyxzOhslelZ - h6Wiw2yhwvSCxUJBslSQVCqu3zxbugyuaZq7PcMQ5LKCnm5Bf7fOur4Ug70ZerpSDPUbbB7KMNidI58x - 6O7S6coa5HMa+ayBoWne0qCobchU7XQkHUsAq9BVW36jtQMAIaBqSb73+Dj//jMHODVWspTi68D/B5xe - 08yX2yRniXTgBuDLKUPsuunKXu0zv3M5N17Zg3DUypSBTRNjFfE+yNEZDwRSnsGQ6YKAtOsL7GEAcHBB - IJjhaksDMeGDNVLe4ZYScKRD1ZJYtrfsZktMW2E77s+12GvcF+XPajTdtUkwdEHaEKQMDUPXSKUEaUPD - 0PT6ykRAilDti9thvc+y0k9oCVYflk+WLfnhC9P89p/s83f4/QD4d8BRIjRJZ5PONQCAuyj/M8CX0ylt - 223X9ok//u1LueHKHrS4OXYneNnK1VMYBESG2nRAszydQNXzQ9BkHeN+OjNCUbCG0kD78CLmNs5mYbX0 - GO2UbMHrsMi9FgzfSfi1kwBsR/Lsnjl+6w/3cuD4kqMUTwL/BtjLWbD0a0dncxkwjiQwChxwpLprbNrs - Pj1eFe/Y3cO6/tTq6AMS91np9QX/CHDlmQMrEKGpQBAE4sRd0TbDDt93Er4dECTt9Mth+JXWM2k7rGT8 - Cq5hrs04aNuS5/fN81uf2svBEwWpFK8Av4O33LcmmXZI5wMAgNsYp4HjjqPuHJmsdp0aq4jrLu9mMAwC - y6Wk/bi2KchzTKrhMn/Q+kcE4jnE8NFypgRJ33cSPgoIltuiy5Vgoub/nVZ3LSUAWG0JwHYUL7w5x//5 - +y7zS6X24jL/i6zh9t5O6XwBAHB16qeA05atbhser+bPTFTFVTu6GepPrfzk4Y4AwLcV8M4qCBoQQaMk - ECkBRGTQMRCsZDkrwTuRJM5y8lolcFsTUIiJv4oSgBAu8z+zZ5bf+tSbPvMfwGX+p3A9Zp03dD4BALjI - eAIYs2x18/BYpWdksiou39bFhoFUbVmpPYlEjyKfu/ao3s/zMCSEt6XY91dIXQpQIoEa52xKA0kqHGHC - t+r5JHm/muv/K0x7FSQAn/mffHWWT/7xPg64zL8fV+H3E1bpMI/VpPMNAMBFyOPAhGmra0+NVfpOjJbF - JVtzbFmfSQACMXPbjgAA/I0tNX+DgjoAiMBUwBcOEtHZBoK4ODE2t+cUDJaZ92oM3qsgAQghqJqSx16a - 5t/+2QEOnChKKdUbwL8HngAqq1DSVafzEQDARcpjwKRlqyvPTFYHTo1VxIUbs1ywMeO6wIqdd7fS+Cd4 - 3gAAkoapgPCfBZYFOwKAUIbnRCKIrXDEo1VSsq043FoaBvm0fAlA6K4vv+8+NsF/+p+HOHiy6EipXsFl - /qc4T5kfzl8AgDoITNi22nlmsjp0eLgshvrTXLw5i2F0qBXoGAD8a0XN9bhGoxTg6wCWtZK73CXDpO+X - WZ7Yx6s03161+qxm/cXyklOAIVhYtPjGQyP8/uePcfRMyZFSPQn8P8BznIdif5DOZwCA+nTgjCPVJWPT - 5qY3TxS07pxre55KdQACKwIAASIFaK4uAEntbK9lA0Agk2WDQNIwK22U8KNVkbtXOdxKyraMOAJIaUxM - Vvmbe4f59NdPMjxetqVSD+Ju7nmZ80zhF0XnOwCA24ingBNSqQum56wL9xwpaErCFZd0kc3qq7ucHQkA - vhTgOxoNTAVWDAARGa+ZVCDoiOmTvFs1CaHTuiw3fJxVKCSdBggEyhAcPVHkv3/jBJ+/7zRjMxVTKb6B - u613H+fRUl8reisAALiNeQY4KBWDCwXn0j1HCvrcks2Vl+Tp6U01nzwUpmUDANQUgr4UIJS7exBZcza0 - erSWQLBS458271ZdSljNtNrVKSHzC4GjwSv75vnDLx7jnh+NM7tgFhX8NfCnuOa9dqLEzgN6qwAAuI06 - AbyhFEap7Fy9/0TJODVeYfvmLJs2ZSOO3g7QigAAb+6v43oZxpMAHHer3lod2dC233cCBGdZs79mYLAG - 6SaUAIQmsBzFQ09P8gdfOKZ+/NIMSyV7HPg08Je43nzOCwu/pPRWAgBwG3cGeANYqJry5mNnKuk3jxVF - X5fBpTvyGHExxTKeNV17ugDh6QKEdH1e+YeXrgmtNhCsoBwrCbNmU4XVKnMbFNfd7bxfvv8Mf/yVE7x2 - cFGWq/Ig8AfA14HJ9omcf/RWAwBwG3kJeBM4bNnqprFps2fP4YIoFGxu3NVLKqMlMzVNPPoH/3srArpX - FB8AWma0Umq3YtBpRVepPMsNc1akg9WritJgbKLKp754jL+69zTHR8q2ZauncbfzPggsnNtKLJ/eigAA - LnuXgSPAS45Uu2YX7c37jhW1I8Nlrrm0m/51aUTDcVMh6nj0x5sGaK4UoHnzxuD+2paJrwYl0Q8kyf9c - zM+TAsJqly9JueIHbgd4/eASv/PfDvG9n0wyNW+aUnIPLvO/yDlw47Wa9FYFAJ8sYAR4RilyxYpz5eHh - svHS/kWG+lJcfPEKpgSxEgCuHkAY3qkWvttxFb8rcNWpUyBY7T0HK00rQbizBQoxVoBCuI5Nv/XwOL/z - 3w7w0oFFVSw7c8D/wD2u+xhvgWW+dvRWBwBwdfAzwEvAiGWrW0enqtkX9i6KYsHh6svyZDOhai6H+f1r - Aa43YcNzBxY4dyCWzjUQLCO9s5rWcjcIrY1uQymYnDX5D39xmD//1imGxyuObatjwP8NfBl3vn9OHXms - Fv00AAC4Y28RVy/wopTsnl+yN7x6cEnbf7zIjq1dbBhM13ziNVESXUBwGiAEqJR7aKhQgOOfatmC1lKs - bQUEYRF3rQxwVju91do12CZASAKwHMVjL83yL/5gPz98YYb5JbuiFI/jHtP9JK7+6aeGfloAwCcT16/A - 4wqyFVPuPn6mYjzxyrxIGYKLt+bIZrRmqa/VapmI+C8ARweZChgFxU0DaJH4alPSXX5rMDovt5xrHTfR - bEPhSHfU/6Mvn+B3//ooh4dLsmrKaeAvgP/ET4nIH6afNgAAlxPncO2wT9iOunxm0R549o0F7eRImQs3 - ZVnXm8IwIjTr7YAhKEHYmisFCBJOA+ISXivyC6tIpic41+Ve670GcTEEpYrk8Zdn+O0/Ocj3n5pSM/NW - RSn2AJ8Evg1M8xZc4ktCP40AAO7HKgGHgGeVoq9clVsPD5cyP3pxThi6xsbBND15vXF7cRIloKB+QGjD - /gCn7lgycVc5y0tgK7YnONtlX0OdhBCYluTYSJlPf/0k//ULxzl8qigrVTkBfA34v3DtTd7SWv529NMK - AD5ZwDjufuwp21Gb5hatdc/vXdQPnCiK/l6DgZ4UuS7dO2UnQFEKdN85UM0NmLca4OsBkBFLgknoHDDT - qkkFZ6v8q5SXEEglGZuqct9PJvmPnz3Kw89Nq9kFa0kqXsQV97+Ca3X6U6Hoa0U/7QAAIQWhAqNcletP - jFa6f/j8rDZftOnLGwz0GqSyOt5pW3VqmvurgLGnAaTqVoEEjYI6pbOpdEtqWLSccp1Lw574vIVwjTXn - FiyefG2eP/7qSf7q3jPqxGjZqZryKPAlXOZ/nbN0NPf5QH8fAMAnXxp4GjjtSJUrlJ0Ne48U00+/Ni+q - piKf1RkaSKGlApaEwbm/fxpQsPlE2n2pBY4KWpVjzVdKHWr71wQMVrM+y2wFAcoz431+7wKfv2+EP/36 - KV7Zv+gslZxxz0f/7wP3AFO8xWz5V0p/nwAAGi0InwHmLFvlpxfsjS/uW9T2HC6IUtmhK6uzbjCNFlYU - 2uEDQTVcCUBzDxNJtByYlFaqKe/o8IRlZLtWm4tWh4QAdIFlKl7ct8A3Hhrj098c5kfPz8ipebNgO+on - wGdxDXsO8lM+149tp3NdgHNIGpAHrgU+CNydMsTOfE433nltn7j7jkHefcsAl+3owtCEewCIHZ7fG24S - WgZ0E6iAqnoWgqtVTJ+ZV7Dffbn5dZR1MN9OlYnLsVOISU2A8nbt7Tm4yI+en+X+J6fYf7yoimXHcqR6 - Gfg+cD9wkr+njF9rr3NdgPOAPC7mNuD9wAfTKXFhd5eu33pNn3jPOwf4wG2D7LioC0OCcFSgu2pAF4gc - GA6IMsiqd3zuWhU3iZ3/aq9YdaJAXFbAFacjBEhdYNmKNw4s8tAzMzz20iyvHVpSpYpj2Y46CHwPeAj3 - VJ4Sfw+UfO3obQCoUxroA96JCwQfSafE+t68oV+/q0f87PX9fPhnB9l5WTeGBpqjvDP5siC63ZOFtbIr - AThOwzkia0Pn6tMtFwzWotzuqcfSEJhVhxfeWOD+J6Z4cd8Ce44UVKXq2JatTgF/CzwM7MFV8L1lHHas - Nb0NAI0kgBQwCNwE3C0Ev2ToYrCny9B3XtQlbr+ulw+/az03XdVLKi3QnQyKblebolVAVdwDRdseGLKa - RQ5en017FZHoUcdpJCFN4BiCyoLNj1+e5YEnp3j1YIFDp4qqakrbdtRp4FvAI8B+3C27bwk3XWeT3gaA - aPKBYAi4CviAgI/puljfldOMCzZkxY27evjQu4Z43y2b6OrtRxcCRBAAlmMPsNIin2taDUCIjyQESCGw - dcHEaJkfPD3NI8/OsO94kZGJijRtZTmOOg58A/gRrvnuPO6I/1NpybdSOh96zflMAldH0A9cCnwA+Mea - Ji5Ip4SxYSClXbS5i7tv38qH77qAiy/PkpJldMdEtTvefE2KutaOSZZTpvjb5MkIHE1gVSWvH1zk3sen - ePrVeU6NlZldtKXtKNM7hOPruEZfp3E37cSe3Pg2uXS+9JTznQSukN8NbALeA/y6EFypayLdm0/pQ/0Z - rtvdy0d/bpD33dJHV4/u6gXPafc73z5vB4AgPLMLBVNTJj94epr7n5zmzWMFZhctVapIR0pVVYoncLfo - voprvVfmLE7A3up0vvWQtwJpQA7owdUT/JqAXxBC5NIpTe/u0rUN61LceWM/H71riFuu7COV01wVwTkt - 9vn2qSP24Xs/WymWlmwee2mW7z81w3NvLDC7YFGsONKylaUUU8B9uHP8w8Ai7vz+771Wv1M633rFW41S - uGCwGfgl4GMCdgpNpNOG0HNZTWxdn+Wum/v50B2D3LCrm3zOwBAgNLGKh9J2ovw7vz65UiCVwpYwv2Dx - 3L5F7n9ymidenWdm3qJiSmnZ0lGKCvAKrpj/GK7VXpm/Z5Z7q03nV29465IGZIAu4Brgo8DPA1s0TRhp - Q6QyaU1sGEhx+3X9/Pyt67jlyh4G+1KkUgJDF+irCghJ6Ox/euX9saXCthWWrTg9UeHp1xf44YuzPLd3 - kWLJUVVTKtOWlsf0w7ij/fdxfe6XcPflvy3irwK9DQCrTwYuGOSAn8G1Mrwd2CAE2ZShZTIpITJpjasv - zYvbrunjtmt62b09T0+XTjqtkTEERkoj8WnoK6a1y0hKhWkrTEth2pK5RZs3jhR49o0FnnptnuMjFVW1 - JKYlHctWFdyDNEeBR3E97vpbck3eHu1Xnd4GgLWlFK6BUQ54B/BeXIvDzUDe0EV3yhBGyhAil9a5+rK8 - uH5nN9dd3sPuS7ro7zbIpjWyaY1MWiOdEq7/AtGoXFzd1f9kVnfBTY/KK4DjKExLUjUVFdOhbEqm5iz2 - Himw50iRVw4ucXi4pCxLYtlKWbaqOlIVcY1zjuNq8B/D3blZwWX6t4121pDeBoCzRwYuGGRwlxRv836X - 4i4z9hq66DF0YRi6EIYhxIaBNLsu7hI7t3Vx2bYc2zdlGRwwyGcMslmNTEojkxI1cBA+ODRkKwJ/k5GK - e6bA8UT3iimpmpKqJalUJeWKZGzW5MRImaNnyhw8WeTYmbKanrOwHKVsRynbVqYj1RKu0m4G9wy9Z3G9 - N43iMvzbI/1ZpLcB4NyQ51aYFJAFrgaux9UfbAcGgD5N0KfrIq9rQtM1ITQdMilNXLAhKy7clGHL+jQb - BtJsHEixcTBDb14nm9FIp1yJQdcgk3J9IKYMV8/QjhzpiutKuW6xbamomi7Tl8oOs4sW0/M24zNVxqar - jE6bjExW1chUFcdRypEoRyocR0kp1aJULOAa48zgGubsAV7D9dZkeT9vH/XbdLbpbQA4P8igDgoGrlRw - uff/EmAj7j6FfqBP10S3ppHThNCEBppAaEIIIUDXhOjJG6zrM0QmpdHfk8LQoLtLI5PWUS0dlgiqpsNC - yUE6sFi0KFWkmluyKRQdpFJKKjcJKd1r739BSlXAZXSf4cdwGf4I7lLdaVxGdwL/36ZzTG8DwPlJvtmA - /z8NbAUuALbgGiNtBNYBvbg2CXlcQ6UuIchpQmSBrBCuOxMhah6wW31zpVRtfq+UwlFQVUqVlaKEq4wr - 4lrZFXBF+WlcA5xx3ENaRnCZ33OQQKceU9+ms0hvA8Bbh7TATwSue3GnDP24UkIvLhjkcZcls7h6hzR1 - CcO3SfK/v3fWOTZ1sbyKu84eZPol3NF9zvtfCsT1re/867fpLUBvA8Bbn0TMj9A1Edf+AkJwXhC+VqHr - 8O9tepveprfpbXor0v8Pm1KkgzgzTiIAAAAASUVORK5CYIIoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAWAwoMVA4sN4MWRVaiGU9ksBlPZK8VQlOeDSgyfQIGB0sAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAME - DxNYHlluvTCZwvw/x/r/QMr+/0DK/v9Ayv7/QMr+/0HK/v9Byv7/PsHz/y+StvYZTWCvAggKRgAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD - Cw5IImyG2D7E8/9Gy/7/QMr+/0DK/v9Ayv7/Qcr+/0HK/v9Byv7/Qsr+/0LK/v9Dy/7/Q8v+/0PL/v8+ - uef/H1tyxAIFBjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAHETRBlzq04f5Bzf7/R8/+/0HL/v9Ayv7/Qcr+/0HK/v9Cyv7/Qsr+/0PL/v9Ey/7/RMv+/0XL/v9F - y/7/Rsv+/0bL/v9Gy/7/OaXO+AwjLHsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAADxtVasRAx/r/Qcr+/0HM/v9J0f7/Qcr+/0HK/v9Cyv7/Q8r+/0PL/v9Ey/7/Rcv+/0bL/v9G - y/7/R8z+/0jM/v9IzP7/Scz+/0nM/v9JzP7/RcHw/xY9TKUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAocWW/HQMr9/0HK/v9By/7/Ss7+/0PQ/v9Byv7/Qsr+/0PL/f89uOX/MpW5/y6Eo/8w - hqX/N5q+/0S+7P9KzP7/S8z+/0vN/v9Mzf7/TM3+/03N/v9Mzf7/Ssf2/xc+TaYAAAABAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAFEBOp0DM/P9BzP7/Q8v+/0rO/v9Ez/7/Qs7+/0HG+P8qfZv/EjA6/wkND/8T - KjP/Gj1K/xs9Sv8WKzP/EhUZ/x9ATf85jq7/Tsz7/0/O/v9Qzv7/UM7+/1DO/v9Qzv7/TMTx/w8nMH4A - AAAAAAAAAAAAAAAAAAAAAAAAAAgUGl1Bvu3/R8/+/0nQ/v9I0P7/Qs/+/0TP/v9Ircz/Eysu/xc8Sf8y - ja7/RcTz/0rM/v9Lzf7/Tc3+/07N/v9KwOz/Ooqo/yM9Sf8lQU3/SrTc/1TP/v9Uz/7/VM/+/1TP/v9U - z/7/Rq3U+QMHCTcAAAAAAAAAAAAAAAAAAAAMK4Wm6ELL/v9By/7/Qcz+/0HM/v9Cy/7/QZqy/3NSNv9M - p7z/SM/9/0rO/v9Lzf7/Tc3+/0/N/v9Qzv7/Us7+/1PP/v9Vz/7/Vc36/0GPrf8mN0H/SqfL/1nQ/v9Z - 0P7/WdD+/1jQ/v9Y0P7/K2Z8ygAAAAEAAAAAAAAAAAsjK3c/yPz/QMr+/0DK/v9Byv7/Qsr+/zObwf8Y - OD3/WMfp/1LT/v9L0P7/TdH+/0/R/v9Qzv7/Us7+/1TP/v9Wz/7/V9D+/1nQ/v9a0P7/XNH+/1O33P8w - RlL/VLbc/17R/v9e0f7/XdH+/13R/v9WxO7/Bg4RTgAAAAAAAAABJnmY30DK/v9Ayv7/Qcr+/0LK/v9A - wPD/FDVA/0G86f9K0P7/TND+/07W/v9Q1P7/UtP+/1TQ/v9Wz/7/WND+/1rQ/v9c0f7/XtH+/1/S/v9h - 0v7/YtL+/1m53f87WWj/YtH6/2PT/v9j0/7/YtL+/2HS/v8rXHC4AAAAAAEDBDo7vOz/QMr+/0HK/v8w - mLz/K4Sj/yFfdf83n8T/Scz+/0zR/v9O0v7/Udb+/1PV/v9W1f7/V9H+/1rQ/v9c0f7/X9H+/2HS/v9j - 0/7/ZdP+/2bT/v9n1P7/aNT+/1abt/9Qi6T/VJm1/1yy1P9o1P7/ZtP+/0+mx/kAAAAUDi46fkDK/v9B - yv7/Qsr+/0PL/v9BwvP/J2yE/0K45P9LzP7/TtD+/1HS/v9U1f7/V9b+/1zV/v9b0f7/XtH+/2HS/v9k - 0/7/ZtP+/2jU/v9q1P7/bNX+/23V/v9u1f7/Zbnb/1iPqP9u0/v/b9b+/27V/v9s1f7/adH5/wgPElQb - VmyvQMr+/0HK/v9Dy/7/RMv+/0bL/v9Hyfr/MH+a/03N/v9Qzv7/U9H+/1bS/v9a0/7/adX+/1/S/v9j - 0/7/ZtP+/2nU/v9s1f7/btX+/3DW/v9y1/7/dNf+/3XX/v9hm7T/dtj+/3bY/v911/7/dNf+/3PX/v9x - 1v7/HTlDhiRxj9BByv3/Qsr+/0TL/v9Gy/7/SMz+/0rM/v9KxvP/T87+/23T9/9yz/H/Y9H6/3PQ8v9g - 0v3/ZNP+/2fU/v9r1f7/btX+/3TS9v+C1/X/dNH1/4zb9v981/r/fNn+/3vT9v992f7/fdn+/3zZ/v97 - 2f7/edj+/3fY/v8vVmWnKX+g4UHK/v9Dy/7/Rcv+/0fM/v9JzP7/TM3+/0/O/v9Szv7/etn6/3LQ8v9x - 1fr/ccrt/2TT/f9o1P7/bNX+/3DW/v901/7/cs3x/4TX9/930fX/it/6/4ja+v+E2/7/hdv+/4Xb/v+F - 2/7/hNv+/4Lb/v+A2v7/ftn+/zpmd7gpgKHhQsr+/0TL/v9Gy/7/SMz+/0vM/v9ZzPj/b9L2/3LR9f92 - 0PT/bMjv/2jF7v9cuOf/Zcjx/2rN9P9w0vn/c9H2/3PN8v9sw+r/Y73s/3PI7v9yzPL/gNPz/4bX9f+L - 2fb/i9v6/43d/v+M3f7/it3+/4jc/v+F2/7/Pmd4uCZ1k9JDy/7/Rcv+/0fL/v9KzP7/Xsv1/3vT9f9u - y/P/Z8Hs/2C55/9Ur+L/RaTf/zmd3/80md3/NZre/2K+6v9Hpd3/M5jd/zaa3f89oOD/S6jf/1iz5P9k - vOj/aMXw/3LO9f+D1PP/ktz6/5Tf/v+S3/7/kN7+/4zd/v85XGqqHl10s0TL/v9Gy/7/SMz+/0vM/v9q - xe7/Wbjq/06r4P8xltv/IYzZ/yKN2f88ndv/Lpfe/z2j3/9kw+//dtL3/3HK8f9lvuj/MZrg/zab3/8w - lNj/IYzZ/yOO2v89ndn/VLLo/1687P+P1/X/neH+/5vh/v+Y4P7/lN/+/ytBS4oSNkSDRMv+/0fL/v9J - zP7/TM39/1q16P87nt//Pp7c/yGM2f8hjdn/IY7a/z2k4f8uqOr/Tbnr/3rZ/v+A2v7/htv+/4XX9/80 - rOj/Mafp/zWb3P8hjtr/IY3Z/yyT2f88nt3/P6Hg/4nR9P+m5P//o+P//6Di//+c4f7/EBgbWgMKDEFD - w/T/R8z+/0rM/v9Ozf7/Urnr/zCX3v84oOL/OqHe/y+Y2f8lktj/QbXr/znB+v9cx/H/f9r+/4Xb/v+L - 3f7/kd79/0S/8P83v/j/OaPf/yqV2P8zm9v/Qafi/y6Y3/86nN3/pd/6/7Dm//+t5f//qeT//4m91P0A - AAAaAAAABi+IquZIzP7/S83+/0/O/v9Szfz/RrLl/y+v7/8zuPT/QMP4/07M+/9Nz/7/UtL+/23O8v+D - 2/7/itz+/5De/v+X4P7/Yczz/07Q/v9Qz/3/SMn6/zq/9/8xtPL/Na7t/5TQ7f+96v//uur//7fp//+y - 6P//WHWBwQAAAAAAAAAAEjRBgUnM/f9Mzf7/UM7+/1bJ9f89wvn/P8T4/zyu5/8ypeT/Mafk/3LY+f96 - 3v//e9Hy/4fc/v+O3v7/ld/+/5zh/v+C1fP/c93//1nD7/8wpuT/NKfk/0G47P87xPv/V8f0/8Pq/P/F - 7P//wOv//7fm+v8VGx5aAAAAAAAAAAABAgMUN5m97k3N/v9Rzv7/YNP8/1DR/v9bzPT/JqTp/yen6/8r - qen/nuf9/6Tq/v+A0fL/it3+/5Lf/v+Z4P7/oeP//5vb8/+e6P//c87z/yep7P8mpur/Pa/o/1jU//9Q - 0f7/yO39/9Du///K7f//dIuW2AAAAAQAAAAAAAAAAAAAAAAOJi9sTMj3/1HO/v9t2P3/d97+/4ji/v9y - zPH/R7bq/0q36f+67///v/H+/4LT9P+N3f7/ld/+/53h/v+m5P//q+H1/7zw//+V2/X/PLPq/1S76/+I - 2/j/f+D//4Df/f/e8/7/2/L//8Lc6f4RExVGAAAAAAAAAAAAAAAAAAAAAAAAAAQjXHG3Us7+/1fP/f9t - zO//mNzy/7Xs/f+/8f//w/P//8L0///B9f//suz5/5ve9P+X4P7/nd/7/67m9f+/8/3/wfX//8P0///C - 8///u/D//6zm+P+k3PD/0+r2/+73///m9P3/QkhMkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAxMy - fZrVV8/+/1vR/v9h0f3/qOf5/5fb8f+g4/f/quj1/5nh9v+f5Pb/ltzz/5ng/v+e3/v/p+Ty/7Dn9v+s - 4fH/wPf+/8Tm9P+16PX/3PH5//f6///6/P//+Pv+/2xvcrwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAIEBRs0fJjTXNH+/2HS/v+t7Pr/g9by/5jl+v+S3vH/gdr+/4nc/v+R3v7/muH+/6Pj//+t - 5f//uOj//7Dg9P+x8/v/1e/7/7Dn8v/e9Pr//f3///39/f91dXW9AAAACwAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAECAxEoWm2xXsz2/3jV9v9y0/j/hdv3/4TX8/+B2v7/idz+/5He/v+a - 4f7/o+P//63m//+46f//vej7/7Dl8v/V7/v/zuv1/+j0+v/r6+z+UFBQlwAAAAYAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQIypiSpe16GzV/f9z1/7/etj+/4Ha/v+J - 3P7/kd7+/5ng/v+i4/7/rOX//7fp///B7P//zO7//9jx///j8vz/mp+i3BkZGUkAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEOGC43ckeGnthx - yu3/gNr+/4fc/v+P3v7/mOD+/6Di//+q5f7/tOj+/77r//+01eX+eIiRyyIlJ2MAAAAFAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAwQGBy8cMDdvN1lmnkt0hb1YgpTMXIOTy1Z1g7pEWWKZIywwaAICAyMAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///AAH//gAAf/gAAB/wAAAP4AAAB+AAAAfA - AAADgAAAAYAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGA - AAABgAAAAcAAAAPAAAAH4AAAB/AAAA/4AAAf/AAAf/8AAP//wAf/KAAAADAAAABgAAAAAQAgAAAAAAAA - JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIFBgUPMDwKBQ8TOAQMDmQDCg2AAwoNjQMKDYsD - Cw18BAwPWwYSFysOKzYIAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEJHyZmHVlwpSRxjtwpgaL/MZnB/ziw3P88 - vu//PsT2/z7E9v89u+z/N6vY/y+Tuv8pfp7/I2yI0RpRZZcBAwNYAAAAEgAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkCBogvTKLrPg9wPD+PsX4/0DK/v9A - y///QMr//0HK/v9Byv7/Qcr+/0HK/v9Byv7/Qcr+/0LK//9Cy///Qsv9/0HF9v8+v+/8JXKO8wEGB5gA - AAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFBQAAAAAAAAAAJBVDUpspg6D/Q9P//03S//9A - y/7/QMr+/0DK/v9Ayv7/Qcr+/0HK/v9Byv7/Qcr+/0HK/v9Cy/7/Qsv+/0PL/v9Dy/7/Q8v+/0TL/v9E - y/7/R9L//0PJ+/8lbIf/EjZDeAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAEDA95LY6x7z3B7v9C - 0///RM/+/0nN/v9Ayv7/Qcr+/0HK/v9Byv7/Qcr+/0LK/v9Cy/7/Q8v+/0PL/v9Dy/7/RMv+/0TL/v9E - y/7/Rcv+/0XL/v9Gy/7/Rsv+/0bM/v9Hzv//QLnm/yp4lt8AAABQAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwwnML84 - r9z/Qs///0HN/v9Azv7/TtL+/0PN/v9Byv7/Qcr+/0HK/v9Byv7/Qsv+/0LL/v9Dy/7/RMv+/0TL/v9E - y/7/RMv+/0XL/v9Gy/7/Rsv+/0fM/v9HzP7/R8z+/0fM/v9HzP7/R8z+/0nP//8zkbT/CyAofAAAAAEA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAbHl111T/D9f9Czf//Qcv+/0HM/v9Gzv7/TNT+/0HM/v9Byv7/Qcr+/0LL/v9Dy/7/Q8v+/0TL/v9E - y/7/RMv+/0XL/v9Gy/7/R8z+/0fM/v9HzP7/R8z+/0jM/v9JzP7/Scz+/0nM/v9KzP7/Ss3+/0rN/v9M - 0///P6/Z/xtKXLEAAAAHGEFRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAABkaUmb4Q8///0HK/v9Byv7/Qcv+/0LM/v9O0f7/Q9L+/0HL/v9Cyv7/Qsv+/0PL/v9E - y/7/RMv+/0XL/v9Fy/7/Rsz+/0fM/v9HzP7/SMz+/0jM/v9JzP7/Ssz+/0rN/v9Kzf7/S83+/0vN/v9L - zf7/TM3+/0zN/v9Mzf7/TM3+/0jC8f8TMz/IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAFx9geN9E1f//Qcv+/0HL/v9By/7/Qcz+/03O/v9H0f7/QtH+/0LL/v9C - y/7/Rc3//0bU//8+vOn/NJzB/y6Gpf8oc4z/Jmh//yZpgf8reJL/M4qr/zyjyf9GxfP/TtX//03O//9M - zf7/Ts3+/03N/v9Ozf7/Ts7+/07O/v9Ozv7/Ts7+/07Q//9KxPL/GD9OugAAAAcAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAQOEgAAAAAAFD9NyD/H9/9Bzf7/Qcz+/0HM/v9DzP7/Uc/+/0bR/v9C - 0P7/Q8/+/0PL/v9H0///NqrS/xY+S/8MFxz/CgsO/wgDAv8IAAD/CQAA/wsCAf8MAwP/DgkK/xIUGP8W - ICb/JFZm/0a85v9Q0///UM7+/1DO/v9Qzv7/UM7+/1HO/v9Rzv7/Uc7+/1HO/v9Rz///Sbvn/xY5RocA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFBqRO7/p/0HR//9Bzv7/Q87+/0nO/v9P - 0P7/RND+/0PQ/v9D0P7/Q83//zir1P8VP0z/AgAA/wwVGf8VMTv/JGN4/zSSs/8+sNf/Qr/o/0O95/8/ - rNP/No6r/yhfcf8eNT//Fxsg/xEJCv8sYnX/S73n/1PR//9Tz/7/U8/+/1TP/v9Uz/7/VM/+/1TP/v9U - z/7/VNH//zqQsf8CBgdAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAEA9ocn7TND//0zQ/v9N - 0/7/S9P+/0jS/v9D0f7/Q9L+/0PQ/v9U1f//RH6C/xMaEP8KFBf/K32Z/z6y3P9Jzv//TNL//0zQ//9N - z///Ts///07P//9Q0P//UdH//1PU//9QzPr/R6/W/zR1jP8YFRf/HiUr/z6Oq/9Z2v//VtD+/1bQ/v9W - 0P7/VtD+/1bQ/v9W0P7/VdD+/1jW//8vcovxAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyBheb1C - yvr/Q87+/0LN/v9AzP7/Qs7+/0LP/v9Cz/7/Q8v+/0XH9/9qcGT/hEEZ/0Nzbf9Jz/7/Sc///0rM/v9K - zf7/TM3+/03N/v9Nzv7/UM7+/1DO/v9Sz/7/Us/+/1TP/v9Uz/7/Vc/+/1fT//9Uy/f/LE1c/x8YHP84 - c4r/WdH//1nR/v9Z0P7/WdD+/1nQ/v9Z0P7/WdD+/1jQ/v9Z0v//GDxImQAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAARDOfyP9Ay///QMr+/0HK/v9Byv7/Qcr+/0LK/v9Dy/7/RM///x1OW/9APiP/c6m2/2Tf//9M - 0v//S9L+/0zS/v9N0f7/Ts/+/0/O/v9Qzv7/Us7+/1PP/v9Uz/7/VdD+/1bQ/v9X0P7/WND+/1nR/v9a - 0f//W9P//0KIpP8kIif/P3qR/1/Y//9c0f7/XdL+/1zS/v9c0v7/XNH+/1zR/v9b0f7/P5Cv8gsaHxkA - AAAAAAAAAAAAAAAAAAAAF0ZX50LR//9Ayv7/QMr+/0HK/v9Byv7/Qsr+/0PL/v9F0P//HFFj/woQE/9D - stb/Wtf+/1LT/v9L0P7/TdD+/07R/v9P0v7/UdL+/1HO/v9Sz/7/VM/+/1XP/v9W0P7/WND+/1nQ/v9a - 0f7/W9H+/1zR/v9d0f7/XdL+/1/S/v9Qqcr/KSct/0iSrf9i1///YNL+/2DS/v9g0v7/YNL+/1/S/v9f - 0v7/Wcjy/xAlLIwAAAAAAgECAAAAAAAAAABJN6/c/0HM//9Ayv7/Qcr+/0HK/v9Cyv7/Q8v+/0TL/v8y - l7v/ChIV/zimzP9K1P//SdH+/0vQ/v9N0/7/T9b+/1DU/v9R0/7/U9P+/1TQ/v9Vz/7/VtD+/1jQ/v9Z - 0P7/W9H+/1zR/v9d0f7/XtH+/1/S/v9g0v7/YdL+/2LT/v9k1///TZSv/y4sMv9aut7/ZNT+/2TT/v9j - 0/7/Y9P+/2LT/v9i0/7/ZNn//zJuhf8AAAADAAAAAAAAAAAYSFyjQc3//0DK/v9Byv7/Qcr+/0TR//9G - 1f//RtD//0fS//8PKC//M5Gz/0nP//9Kz/7/TNL+/03R/v9O2P7/Udj+/1LV/v9U1v7/VdT+/1fR/v9X - 0P7/WdH+/1vR/v9c0f7/XtL+/1/S/v9g0/7/YtP+/2LT/v9k0/7/ZdT+/2XU/v9m1P7/aNj//0yIov9C - ZHX/Z9P9/2nZ//9q3f//aNf//2bU/v9l1P7/ZdX//2DM9v8AAABrAAAAAAAAABAriKvUQMr//0HK/v9B - yv7/Q87//yNyi/8VQk//KHyW/yp8mP8YOkf/R8r7/0nM/v9L0P7/TdL+/0/S/v9R1f7/Utb+/1TV/v9V - 1v7/WNb+/1jR/v9a0P7/XNH+/17R/v9f0v7/YNL+/2LT/v9j0/7/ZdP+/2bU/v9o1P7/aNT+/2nV/v9q - 1f7/atX+/2vS+/9BVGL/X7TU/1CHnv9DYG7/WanH/2vY//9q1f7/aNT+/2vb//8oU2PGAAAAAA8uOiAx - nMT7Qcr+/0HK/v9Byv7/Qsv+/0XP//9DzP//OqzV/yFcb/8mZ33/StD//0vN/v9Mzv7/T9P+/1HS/v9S - 1f7/VNb+/1bW/v9Y1/7/WNT+/1vR/v9d0f7/X9L+/2DT/v9i0/7/ZNT+/2bU/v9o1P7/adX+/2vV/v9r - 1f7/bNb+/27W/v9u1v7/b9b+/2/W/v9RfJH/V4+o/2nD5v9v2f//cNj//27W/v9t1v7/bdb+/2zX//9N - mrjiAAAAFxQ+TUg3q9f/Qcr+/0HK/v9Cy/7/Q8v+/0TL/v9Fy/7/R8v+/0jP//8qc4v/QrPd/0zN/v9O - zv7/UM/+/1PU/v9U1P7/VtX+/1jW/v9l2P7/ctr+/17S/v9f0v7/YtP+/2PT/v9m1P7/Z9T+/2rV/v9r - 1f7/bNX+/27W/v9v1v7/cdb+/3LX/v9y1/7/dNj//2q+3/9ck6z/dNj+/3TY/v9z1/7/c9f+/3PX/v9x - 1/7/cNb+/2/W/v9fudzzBQkLMhE2Q30+wfP/Qcr+/0HK/v9Dy/7/RMv+/0TL/v9GzP7/R8z+/0nM/v9A - rtf/MYGa/0/R//9Qzv7/Ts7//1HQ//9V0v7/WNP+/1nT//9e0/7/Y9T+/2DS/v9i0/7/ZNP+/2fU/v9p - 1P7/a9X+/23W/v9u1v//cNf//3LX/v9z2P//c9j//3bY/v932f7/euD//1V0hP920/b/edj+/3nY/v94 - 2P7/d9j+/3fZ/v922P7/dNf+/3TY/v9ju97/JkdUSBM8SqVCzv//Qcr+/0LL/v9EzP7/RMz+/0bM/v9H - zP7/SM3+/0rN/v9Lzfz/Ssfz/0/P//9Oz///g9Hs/4DP6v9cz/v/Xs/6/2rH6/9mz/f/YNP+/2TT/v9l - 1P7/Z9T+/2rV/v9s1v7/b9b+/3LV/P92ze7/fM/u/3XZ//+CzOf/jdTs/3zY/P982f7/fdv//3nR8/9+ - 2///ftr+/37a/v992v7/fNr+/3vZ/v972f7/edn+/3jY/v9rxOf/MFdmYxlPY75Cz///Qsr+/0PL/v9E - y/7/Rcv+/0fM/v9HzP7/Ss3+/0vO/v9Nzv7/T87+/1HO/v9Ozf7/meP4/4HY9f9c0Pv/cNb7/5jo//9o - w+b/Y9T//2bU/v9p1P7/a9X+/27V/v9w1v7/c9f+/3HP9P+G3fr/mef//3vZ/v92yeb/lef+/4Ha/f+A - 2v7/gdv+/4Lb/v+C2/7/gtv+/4Lb/v+C2/7/gdv+/4Da/v9/2v7/fdr+/3zZ/v9zzO//M1tqehxYb8xD - z///Q8v+/0PL/v9Fy/7/Rsv+/0fM/v9JzP7/Ss3+/03N/v9Ozv7/UM7//1HP//9Nyvv/n+j9/3nT8v9b - z/v/eNb4/33V+f9cveX/Z9X//2nV/v9s1f7/btb+/3DX/v901/7/dtj+/3LP9P91z/P/gtf5/4be//9z - xeT/lef//4HW+P+G3f//h93//4fd/v+H3f7/iN3+/4fd/v+H3P7/htz+/4Xc/v+E3P7/gtv+/4Hb/v95 - 0fP/Nl1thB1ZcM1Dz///Q8v+/0TL/v9Fy/7/R8z+/0jM/v9KzP7/TM3+/03N/f9Uzvz/XMny/23O8f9u - y+7/h9v6/3HM8f9dyvT/dM/0/2W/7f9bv+j/atT9/2zU/P9u1f3/ddj+/3jY/f931/z/etf8/3bQ9f9k - ver/a8Xw/4HU9f92x+n/ftj7/4bS7/+J1PH/h9Pw/4jY+P+M3f3/jd7+/4ze/v+M3v7/i93+/4rd/v+I - 3f7/h9z+/4bc/v9+0vT/OF9uhRtUacFE0P//RMv+/0TL/v9Gy/7/R8z+/0nM/v9Lzf7/UMr4/3fT9P+E - 2fb/hdr6/3nU+P9xzfX/ZsTy/2LA7/9guen/VbHm/0mq5f9SruP/T6zh/1Gv4/9XtOT/c9P6/2K54v9U - sOT/Uq3h/1Ot4v9KquT/Tq7m/1y25/9hvu//Y8Hw/2zJ9P900Pf/ftj6/4Xa+P+L2fX/jNXy/5Ph//+R - 4P7/kd/+/5Df/v+O3/7/jN7+/4rd/v+B0PD/Ol5tfBZDVKlE0P//RMv+/0XL/v9HzP7/Scz+/0rN/v9N - zP3/ddDy/3fT9/9wzPT/aMXy/2TA7v9ft+P/XbPg/1Sr3P9Kp93/QKLh/zec3/8zmN3/L5fd/y6W3f84 - m9z/c9L4/0yn2P8tlt7/L5bc/zGX3P82m97/O57g/0al3/9Pqdr/W7Lf/2C14f9hu+n/ZsTx/2zK8/9y - 0Pb/h9n3/5DX8/+X4f//l+D+/5Xg/v+U4P7/kd/+/4/f/v+CzOn/PF5saBI3RINCx/n/RMv+/0bL/v9I - zP7/Sc3+/0vN/v9Ry/r/dcnv/2G/7/9auez/VrHi/0Og2v8tlN3/JpDb/yeQ2/8okNj/S6Ta/y6W3f8u - l97/QKPf/1i35/9evOj/e9f7/27G7P9euuf/VrLh/y+X3v8ult3/N5rc/ziZ2P8pktv/JI7b/yeR3P84 - mtz/Uard/1e36/9evO7/ZcPx/4zU8v+d4v//nOL//5vh//+Z4P7/l+D+/5Tf/v+BxeD/OVViTBVBUU87 - st//Rcv+/0bM/v9IzP7/Ssz+/0vN/v9hzvj/XLbp/0ys5f9IqOT/MZDO/yCM2v8hjNn/IY3Z/yGN2v8e - jNn/U63g/y2c4/8uoeb/Vbno/3nZ/v982/7/f9v+/4Tc/v+I3v//iN76/zGe3f8un+X/N5/h/zWa3P8h - jdr/IY3Z/yGM2f8gjNr/JYnN/0up4v9IqeX/T7Dn/3nJ8f+k5P7/ouT//6Hj//+e4///nOL//5rh//+E - xN72GSQoNhdEViI2oMn/Rsv+/0fM/v9JzP7/S83+/0vN/v9q0/v/Sabj/zmc3/83m97/S6fi/x6L2f8h - jtr/IY7a/yKQ2/8fjtr/VLfp/y2r7v8wsvD/XcLt/3vZ/v9/2v7/g9v+/4fc/v+L3f7/kOD//zet4/8u - r/D/N63r/zef3/8ikNv/Io/b/yGO2v8fjNr/P6Df/zye3/83m97/O5/h/3PC7v+s5v//qOX//6bk//+k - 5P//ouP//6Dk//99tMzlAAAAHAAAABMzlbvZR8z+/0jM/v9KzP7/S83+/03O/v9Uzv3/UKzl/y6W3f8t - lt7/R6nm/0ak2/8kjtX/H4/c/x+R3v8fjtf/WMr4/zO9+P87w/r/Zsnv/37a/v+C2/7/htz+/4rd/v+O - 3v7/k9/+/0m96/82wPr/O773/zml4v8gkd7/H5Dd/x+M1/83mNb/T63l/y6X3v8uld3/M5ne/5HT9P+y - 6P//r+f//63m//+r5v//p+X//6jp//9QcX7MAAAAAAAAAAAhYXqtSM7//0jM/v9Kzf7/TM3+/07O/v9Q - zv7/Tr7r/z2h3v8voOX/LaXp/zKs7v9LvO7/S7bj/0uz4v9Kr97/S87//0PL//9Mz/7/b8zw/4Hb/v+F - 2/7/id3+/47e/v+S3/7/l+D+/1zG7f9Gzf//Qsr+/0y86v9KseD/TLTj/1G86v87tfH/Lafq/y6h5v81 - oOH/abPb/73s//+46f//tuj//7Po//+x5///ref//6zq//8NERN8AAAAAAAAAAAAAABWRMLx/0nN//9L - zf7/Tc3+/0/O/v9Sz/7/VND//1O75f84tPH/MLb0/zW++f89wfb/SMj4/0rK+P9L0P7/TtL//1fU//9k - 2P7/dc3v/4Tc/v+I3P7/jd7+/5Df/v+V4P7/muH//3DL7f9b1v//UtP//0zR//9LzPn/Scn4/0LD9v84 - v/j/Mrn2/zGz8v9cvOj/vuj8/8Hs//+/7P//vev//7rr//+36v//uO7//3OYqP8AAAAQAAAAAAAAAAAA - AAAAJGR99EzU//9Mzf7/Ts3+/1DO/v9Sz/7/W8ny/zu+9v83wfr/QMn//1G75/89rOf/L6Xn/zGp6f9Z - vun/atz//3Dd//+B4P7/ds3w/4fc/v+L3f7/kN/+/5Tg/v+Z4f//nuL//4HQ7f933v//bNz//2XM8v82 - rOr/LqXn/zWo6P9Ks+b/R8f4/zrE+/81v/n/bcjs/8rt///G7f//w+3//8Ls//++6///uev//zM/RqMA - AAAAAAAAAAAAAAAAAAAAAwgKW0K44/9Mzf//Ts7+/1DO/v9Uz/3/V834/0LL//9Iz///Srvl/yWg5/8k - ouf/JqTp/yOl6v9pxOz/heT//47l//+U3vb/e9L1/4jc/v+N3v7/kt/+/5fg/v+c4v//ouP//5LW8P+S - 5f7/iOT//3/W9P8lpuv/Jqbp/yWj6P8joOf/Pqze/0rR//9DzP//Rcv//7zl9v/O7///y+7//8ft///D - 7P//krTC/DU/RiEAAAAAAAAAAAAAAAAAAAAABAoLAyx4lM5MzP3/Ts7+/1HP/v9X0P7/Ztj+/1XU//9c - 1///ctT1/x+i6v8oqez/Kavt/ySr7/+C0u//oer//6vt//+Z1ur/gdn9/4rd/v+Q3v7/leD+/5rh//+f - 4///pOT//5/b9P+p6Pv/pOv//57h9v8nre7/Kazu/yiq7P8kpuv/W8Lv/2HZ//9X1f//T9L//8Lu/v/W - 8f//0vD//87u///M8P//XnJ6qQAAAAISERUAAAAAAAAAAAAAAAAAAAAAAA4mL1BGuub8UM///1HP/v9X - 0P7/ed7+/2/c//933v//j+f//2rF7f8xsO3/LrDu/ySv7/+f3fP/t/D//7/y//+Z0ub/ht3//43e/v+R - 3/7/luD+/5zh//+i5P//p+X//6bd9f+57fv/ufD//77t+f8or+7/LbHv/zGx7v9Etuz/juH7/3vf//9x - 3f//b93//9z1///e8///2fH//9n0//+etcL5AAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ - Q1OsT87+/1LP/v9Vz/7/ZdL7/4HT7/+c7P//nun//6zt//+l4vb/l9rz/4/W8v+97vv/wfP//8P1//+5 - 6/j/jNb1/4PR8v+V4P//mOH//5/j//+c3Pj/otrz/7bn9//C9P7/wvT//8f0//+Q1vL/lNrz/57e9f+u - 6vv/o+v//5vq//+G3Pf/tub3/+34///n9f//4/b//7nM1/8mKS1lAAAAAAMGBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAJWB34FPR//9Vz/7/WND+/1jL+P9wvt7/p+Dx/77y///A8v//wvP//8L0///C - 9v//wvb//8L3///B9///wPj//8L0+v+N1/b/muH//5/i/v+v5/b/wPj//8D3///C9///wvb//8L2///C - 9f//wvP//8Hy//+/8f//tOr5/5bP4//D3ev/9Pr///H6///u+P//4e72/2hvdaEAAAAAFhUZAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAABxMWJDmPr+tY1v//WND+/1zR/v9d1P//Xcz4/5LX8P/L - +v//hM3o/53g9f+/9v7/sOr2/6bn9/+p6ff/q+z4/5/e6v+R3fz/nOL//6Hj//+d3O//rOz2/7Ds9/+1 - 6/f/tOn2/7z0/f++6/b/tt7u/8Dy/P/E8fv/1+nz//r8///9/v//+/3///r8///3/f//iIyR0gAAABIX - FxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAADA4h6X/XNj//1zR/v9g - 0v7/X9L//6Di9//F9Pv/Zsju/4re/P+59///jdTn/3/Z/f+H2/z/jN38/5He+/+W4P7/nOL//6Pj//+n - 5P3/rub9/7Xn/f+86f3/uOb5/6jr9f/D7vf/0ur5/7bp8//I9v7/7vj9//v8///+/f////7///7///91 - d3jiCAUKDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAAAAAAAA - AAAsPI6t61zR/v9g0///XtL//6rm9v+v6PD/bNL6/43g+/+y+f//g8/n/4Hb//+G3P7/jN3+/5Hf/v+X - 4P7/neL//6Pj//+p5v//sOf//7fp//++6///vOj6/6Hq9f+78Pj/4PL//6Hb6P+68/z/7fj8//79//// - ////9vb2/5qZmtEAAAASAAAAAEE/RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAEAAQAAAAAACA8TIixjd9Zez/v/YtT//33Y+P+C1fD/b9b+/4PZ9/+c4/H/gs7p/4Hb//+G - 3P7/jN3+/5Lf/v+X4P7/neL//6Pk//+p5v//sOf//7jp//+/7P//v+n7/6Df7P+x5PD/4fP//7/j8P/Q - 7/f/8/n9///////f3+D/b29vpAAAABAAAAAAQUBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQIAAAAAAAAAAAAcO0idWLzi+2XT/P9r1v//b9b+/3PX/v92 - 2f//fNr//4Hb/v+G3P7/i93+/5Hf/v+W4P7/neL//6Pj//+p5v//sOf//7fp//++7P//xe3//8/v///W - 8f//3vP//+j2///x+f//8/f7/9LT1vQ3Nzd0AAAAABAQEAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGACl0kQAAAAAADBofRj19lr5b - ttn/ct3//3TZ//932P7/fNn+/4Hb/v+G3P7/i93+/5Df/v+W4P7/m+L//6Lj//+o5f//ruf//7Xp//+9 - 6///xO3//8vu///S8P//3fX//+v9//+3wMb/hIiLpgAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAkLDwMEBwk/MF5v3WW/4v942///e9r//4Db/v+F3P7/it7+/5Df/v+V4P7/m+L//6Hj//+n - 5f//reb//7Tp//+66///wez//8nv///R8f//rcPO/0xSV7wlISglAAIAAAAAAAAAAAAAS0lMAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAATEwAAAAAAAAAAAAAAADoyWmqZV5u1y2exzu5vuNb/f8zs/47e/v+X - 5P//nOX//6Lm//+o6f//qOL7/6DS5/+ZwtT/mb3N6IOdqcRIUliIAAAAJQAAAAAAAAAAHRogAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgHiMAAAAAAAAAAAAAAAAAAAAACx8zPBw+ - ZHQwM05aXi5GUIM4Ul2cPlpmpkFbaKU8UVuXOkxVfUdaZVRWanQqISgsGQAAAAcAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//gAH/ - /wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAB/AAD4 - AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAMAAAAAABwAAwAAAAAADAADAAAAAAAMAAIAAAAAA - AQAAgAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA8AAAAAAPAAD4 - AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD+AAAAAH8AAP8AAAAA/wAA/8AAAAP/AAD/4AAAB/8AAP/wAAAf - /wAA//4AAH//AAD//4AB//8AAA== + AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAKCAEAK4EAAAgIAAAAQAgAKgQAADWJAQAMDAAAAEA + IACoJQAAfjUEACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7NVTJ+6pMxvvsQ8P7/EPD+/xJxfvoRMT7nELD+zUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sOV8r7ukLD+/9mz/z/o+L9/7/r/v+/6/7/o+L9/2XO/PxCw/v/Q8P7pkLD+w4AAAAAAAAAAAAA + AABCw/sOVcn730/H+//D7P7//////+z5///K7v7/yu7+/+/6////////w+z+/0zG+/pExPvLQsP7DgAA + AAAAAAAAXcz8wU/H+//j9v7/9Pv//4TY/P9Dw/v/QsP7/0LD+/9Dw/v/iNn8//T7///j9v7/S8b7+ULD + +6UAAAAAYMz8P0LD+//D7P7//v///2zQ/P9Vyfv/ver+//b8///1/P//ver+/1TJ+/9s0Pz//v///8Ps + /v9Cw/v/QsP7NWvQ/MRmz/z///////z+//+L2v3/4/b+///////////////////////i9v7/i9r9//3+ + ////////YMz89ELD+5pTyPv1o+L9////////////v+v+/8bt/v/1/P/////////////7/v//wev+/73q + /v///////////6Pi/f5Dw/vhRcT7/r/r/v//////vOr+/1PI+/9Wyfv/hdj8////////////i9r9/1TJ + +/9Qx/v/t+j9//////+/6/7/Q8P7+0XE+/6/6/7//////3HS/P/Y8/7/5/f+/3HS/P///////////3HS + /P/b9P7/2/T+/2zQ/P//////v+v+/0PD+/tTyPv1o+L9//////+f4f3/T8f7/2DN/P9x0vz///////// + //9x0vz/Xsz8/0/H+/+Z3/3//////6Pi/f9Dw/vhbND8xmbP/P//////gNf8/77q/v/d9P7/cdL8//// + ////////cdL8/9Lx/v/B6/7/eNT8//////9gzfz2QsP7mmfP/EJCw/v/w+z+/9Px/v9Yyvv/Vsn7/5Td + /f///////////5rf/f9TyPv/Vcn7/9Dw/v/D7P7/QsP7/0LD+zUAAAAAYM38xU/H+//j9v7/1/L+/9v0 + /v/6/f/////////////9/v//2PP+/9fy/v/j9v7/TMb7+kLD+6UAAAAAAAAAAELD+w5XyvviT8f7/8Ps + /v/////////////////////////////////D7P7/TMb7+0XE+8xCw/sOAAAAAAAAAAAAAAAAQsP7DlvL + /L5Cw/v/Zs/8/6Pi/f+/6/7/v+v+/6Pi/f9lzvz9QsP7/0TE+6dCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAARsT7N1nK+69Nx/vtRMT7/UPD+/xLxvvqSMX7n0LD+zYAAAAAAAAAAAAAAAAAAAAA+B8AAOAH + AADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAADgBwAA+B8AACgA + AAAAAQAAAAIAAAEAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7EELD+zBCw/tSQsP7akLD+31Cw/uRQsP7pULD+7hCw/vLQsP73kLD++BCw/vvQsP78ELD + +/dCw/v/QsP7/0LD+/9Cw/v/QsP790LD+/BCw/vvQsP74ELD+95Cw/vLQsP7uELD+6VCw/uRQsP7fULD + +2pCw/tSQsP7MELD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+zFCw/tgQsP7jULD + +65Cw/vOQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD+85Cw/uuQsP7jULD+2BCw/sxQsP7CAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7Q0LD+3pCw/upQsP71kLD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vWQsP7qULD + +3pCw/tDQsP7DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD+5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD+1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sIQsP7R0LD+5BCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9lCw/uQQsP7R0LD+wgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD + +21Cw/u0QsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7tELD + +21Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/twQsP7yELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+8hCw/twQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7bULD+8NCw/v+QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/5Cw/vDQsP7bULD+xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+0NCw/upQsP7+ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7qULD+0NCw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD + +3pCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/ulQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7+0LD+6VCw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sBQsP7SULD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7xCw/tJQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AkLD+1hCw/vbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9tCw/tYQsP7AgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sBQsP7UkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9ZCw/tSQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yRCw/uxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7FCw/skAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD + +4tCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD+4pCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD + ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vULD + +yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/t0QsP79kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9r0Pz/gtf8/5fe/f+l4/3/s+f9/8Hr + /v/Q8P7/2/T+/+b3/v/n9/7/7Pn///P7///z+///8/v///P7///s+f//5/f+/+b3/v/b9P7/0PD+/8Hr + /v+z5/3/peP9/5fe/f+C1/z/a9D8/1PI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v2QsP7dELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/vMQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0TE+/9gzfz/g9j8/6Xi/f/G7f7/4PX+//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+P3//+D1/v/G7f7/peL9/4PY/P9gzfz/RMT7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vMQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+3dCw/v6QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1jK + +/+F2Pz/seb9/9rz/v/6/f////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + ///a8/7/seb9/4XY/P9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/t3QsP7AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD+79Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/+O2/3/v+v+/+v5 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+v5//+/6/7/jtv9/1fK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+79Cw/scAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7nULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/d9T8/7bo/f/y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////L7 + //+26P3/d9T8/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7nULD + +wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP7zULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P+y5/3/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////v+v//suf9/27R/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vNQsP7IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Qx/v/ld39/+D1/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4PX+/5Xd/f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/t7QsP7/ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/2zQ/P+86v7/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+v3//7zq/v9s0Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ULD+3tCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/utQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/f9b8/9Tx/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////9Tx + /v9/1vz/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rULD+woAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +/+R3P3/5Pb+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+T2/v+R3P3/R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vjQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/47b + /f/p+P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+n4//+O2/3/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++NCw/suAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/vxQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/iNn8/+f3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+b3/v+I2fz/RMT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ULD + +0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v931Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/I7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////8ju + /v9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/1Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/6vk/f/7/v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+/7//6vk/f9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////v+v+/1LI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz/8fv///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////x+///hdj8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3gAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////++6v7/Tcf7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/o+P////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+j4 + //9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/6Lh/f/9/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////f7//6Lh/f9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/ULD+1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vxQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////v///+35///W8v7/x+3+/7rp/v+t5f3/oeH9/5rf/f+U3f3/lN39/4zb + /f+U3f3/lN39/5fe/f+g4f3/qeT9/7bo/f/D7P7/0/H+/+f3/v/7/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/FCw/suAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vjQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////j9 + ///T8f7/s+f9/5Td/f931Pz/Wsv8/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9u0fz/i9r9/6vk + /f/I7v7/7vr///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////j9//+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP740LD+xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//+76f7/i9r9/2PO + /P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Xyvv/ftb8/6nk/f/Y8/7//f7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Ti/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/utQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/vOr+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r9///K7v7/kdz9/1zL/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/991vz/tuj9/+35//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////vOr+/0bE + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+61Cw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t7QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/0vH+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////6/f//xOz+/4LX/P9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/a9D8/6zl + /f/s+f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///S8f7/T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ewAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9nz/v+Q3P3/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7/3PT/P+86v7/+f3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+D1/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP77ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/5Pf+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////7/v//uOj9/2fP/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+/+W3v3/5/f+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5Pf+/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP77ULD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7zULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//+j4v3/U8j7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/991vz/1fL+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////q+P//Xcv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8/v//6Dh/f9Nx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/900/z/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+/6//9jzfz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///4/f//qOP9/03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/920/z/2/P+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////7/r//13L/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD++5Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+/6/7/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+G2fz/6/n///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////q+P//Wsv8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++5Cw/scAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+H1 + /v9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG+/+n4/3/+/7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+T3 + /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3dCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////+/7//6Hh + /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/U8f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////4PX+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t3AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/v6QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/0vH+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////3fT+/2XO + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5be/f/5/f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////S8f7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD + +zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/vNQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/vOr+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////+////qeT9/0bE + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/X8z8/9vz + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7zq/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t0QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////w+v//d9T8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9GxPv/q+T9//7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////pOL9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP79kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////Y8/7/V8r7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+A1/z/9vz///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v2QsP7IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+66f7/R8X7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2LN/P/k9/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//2bP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7YELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+b3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7/8ru/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/T8f7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD + ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8vv/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////z+//+I2fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/tuj9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////8vv + /v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++lCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Lh/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//961fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/9ay/z/btH8/4DX + /P+L2v3/mN79/6Dh/f+g4f3/qOP9/6Dh/f+g4f3/nN/9/4/b/f+C1/z/dNP8/1/M/P9Jxfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4f3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////ouH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yRCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/9/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////T7//9u0fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/4LX/P+o4/3/ye7+/+f3/v/9/v////////// + /////////////////////////////////////////////////////////////////////////////+/6 + ///R8P7/s+f9/47b/f9pz/z/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Hc + /f/+//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////3+//9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/skAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/uyQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//o+P////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////T7//9q0Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Vsn7/47b/f/A6/7/7fn///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////j9///Q8P7/n+H9/2nP/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/j9v9//7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6Pj//03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7sgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//9y0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/1rL/P+a3/3/2fP+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////7vr//7Ln/f9z0/z/Q8P7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+P2/3//v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sBQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////v+//900/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Hxfv/iNn8/9Hw/v/+//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+v5 + //+l4/3/W8v8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4XY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7z0LD+wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7U0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/8fv///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+E2Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH + +/+k4v3/7/r///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7////G7f7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/n+D9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////x+///Usj7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+Z3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7/6bj + /f/2/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////Q8P7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+1hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+56f7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Ixfv/oOH9//b8 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Q8P7/bND8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8nu/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////e9X8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/vcQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+r4//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////Y8/7/R8X7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz/5/f+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+56f7/Usj7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+r4 + //9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6vk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////y+///V8r7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ+//J7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////X8 + //+U3f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1/M + /P/1/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////q+T9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sBQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/7/v////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////f9b8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////8/w/v9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP71ELD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7SkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//I7v7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////uen+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/7zq/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9fz//4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////yO7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////8fv//07H + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////s+f9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7//H7//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////57g + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//T7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////X8v7/Vsn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+e4P3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4fX+/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/ulQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////7/ + //9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//v+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9kzvz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//7///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///h9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//7///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////9Pv//3LS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//i9v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7ekLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////xe3+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///7/v//e9X8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+O2/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +//p+P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7jo/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////6fj//0fF + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+91Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+R3P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////H7f7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/i9r9//7///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//3LS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//K7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/5Pf+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5Pb+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//3+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////1/P//Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4/b+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5Pf+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7+ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/f9b8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7///9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8//P7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+v5//9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//7/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9/1vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7FAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/9Tx/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////mN79/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/970/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////1fL+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+8NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/23R/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+z5//9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+p5P3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0vG + +//s+f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vDAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/v+QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////s+f9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT/P/+//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v///3TT + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+y5/3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////vOr+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/kLD + +xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/twQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+W3v3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///y+///Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+W3v3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r9//9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7yELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/ld39//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////6rk + /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3rV/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +/+q5P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ld39/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////4fX+/4HX/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zc78/8Dr/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////8Dr/v9mzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7/4HX + /P/h9f7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////8vv//8Dr/v+i4f3/lN39/5/g/f+56f7/4fX+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+H2/v+36P3/oOH9/5Td/f+h4f3/wOv+//L7 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/u0QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+y5/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////7Ln + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sIQsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///v+v//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/d9T8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3fU/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+5BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7bo/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uQAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+//y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////8vv//0XE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP72QAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sbAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7V0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qeT9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+5JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////971/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vNAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/ELD+wwAAAAAAAAAAAAAAAAAAAAAQsP7Q0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+/6/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tDAAAAAAAAAAAAAAAAAAAAAELD+3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7////+//////////////////////////////////////////// + //////////////////////////////////////////////z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////v+//////////////////////////////////////////////// + ////////////////////////////////////////+/7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////6/n//0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK + +/////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/2rQ/P9ExPv/RMT7/2nP/P+/6/7///////////////////////// + ///////////////////////////////////k9/7/hNj8/0zG+/9Cw/v/V8r7/5nf/f/1/P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////R8P7/dNP8/0bE+/9Cw/v/YM38/63l/f/9/v////////////////////////// + /////////////////////////////+/6//+R3P3/Ucj7/0LD+/9Px/v/i9r9/+z5//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAQsP71kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+F2Pz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////neD9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5je/f////////////// + ///////////////////////////////////W8v7/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YM38//L7 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+26P3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ftb8//3+//////////////// + /////////////////////////////+j4//9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9TyPv/4vb+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////hdj8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vWAAAAAAAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////ze/+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/yu7+//// + ///////////////////////////////////7/v//Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+F2Pz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////l9/7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+t5f3///////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2nP + /P/+//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAELD+zFCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/9rz/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV + /P//////////////////////////////////////xOz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7//H7//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////nN/9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8//// + ///////////////////////////////////i9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/2PP+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////a8/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sxAAAAAAAAAABCw/tgQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0TE+//6/f////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9cy/z//////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//U8f7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3rV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//7/v//////////////////////////////////v+v+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/7bo/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+v3//0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAQsP7jULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9hzfz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD + +65Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////g9j8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uuAAAAAAAA + AABCw/vPQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7zwAA + AAAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////G7f7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/AAAAAAQsP7EELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////4PX+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7EELD+zBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+zBCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////3+///k9v7/U8j7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/6Dh + /f9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8/6Dh/f+g4f3/oOH9/6Dh + /f+m4/3/y+/+//z+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+v5//+15/3/oeH9/6Dh/f+g4f3/oOH9/6Dh/f9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/33W + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+W3v3/8/v///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////U8j7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tSQsP7akLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Y8/7/neD9/27R/P9Hxfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9dy/z/0vH+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//5be/f9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Xyvv/hdj8/7fo + /f/y+/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////2vQ + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7akLD+31Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9Pv//6nk/f9cy/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//Q8P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////v///33W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RcT7/33W/P/R8P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+D2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+31Cw/uSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//quT9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//n9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/a8/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uSQsP7pULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+l4/3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////d9P7/ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5zf/f/7/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////6Xj/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7pULD+7hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/s+f9//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////A6/7/ScX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////6/f//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cNL8//H7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7hCw/vLQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP73kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//Q8P7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////B6/7/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO + /P/3/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73kLD++BCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/2/T+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////f9f7/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////b9P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++BCw/vvQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/+f3/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////9/v//ac/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP78ELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//n9/7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////seb9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//b8//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/7fn///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+P3//1TJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+m4/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////s+f//QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Vcn7//z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////8/v//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P+Z3/3/x+3+/+j4 + ///3/P////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////3+///v+v//3vX+/7Ln/f9+1vz/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//H7f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////P7//9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////u+v//Q8P7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/7bo/f/+//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+n4//+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/itr9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////z+///QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////uen+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/XMv8/+f3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6rk/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ+/////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////8/v//0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//t+f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////5Hc/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+X3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////lt79/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/6fj///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+35 + //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/5/f+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9t0fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////n9 + //9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/BCw/vvQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+f3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////Vcn7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+//4/f////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+t5f3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP74ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//b9P7///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v///0PD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+C1/z///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/md/9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9v0/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP74ELD+95Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////P7 + //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qOP9//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////Q8P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+95Cw/vLQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///v+v//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7np + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////2DN/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP7uELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+z5/3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8/v//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//A6/7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7Pn/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7uELD+6VCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/peP9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5nf/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+l4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6VCw/uTQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5fe/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5nf/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+f3//0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+o4/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uTQsP7fULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+D2Pz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3DS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9mz/z///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////8zv/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4PY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7fULD + +2pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/a9D8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9jz/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+r4//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9r0Pz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +2pCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////wuz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9v0fz//f7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////T8f7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13L/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////U8j7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tSQsP7MELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/+P3///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////b8//9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//Vcn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+X3v3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7MELD+xBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////gtf8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//X8//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Q8P7/Vcn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2vP+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+xAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9jz/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Uyfv/p+P9/+f3 + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+f3//83v/v9+1vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cdL8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////G7f7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/AAAAAAAAAAAELD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////dtP8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/V8r7/3fU/P+F2Pz/k939/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td + /f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/1bJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/etX8/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td + /f+U3f3/lN39/5Td/f+U3f3/lN39/43b/f+A1/z/bND8/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/87v/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////peL9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vPAAAAAAAAAABCw/uuQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4PY/P////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+T3 + /v9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////4PY + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rgAAAAAAAAAAQsP7jULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9hzfz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////qOP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+//v+v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD+2BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7//r9 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7///+C1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF+//T8f7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/f//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tgAAAAAAAAAABCw/syQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//a8/7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//F7f7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////2vP+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//i9r9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+//Q8P7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAAAAAABCw/vWQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4XY/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+46P3/Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3PT/P/q+P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9YAAAAAAAAAAAAAAAAAAAAAQsP7qULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9ay/z///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////2/T+/1vL/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+U3f3/+/7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAELD + +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////xe3+/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS + /P/0+/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6/n//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAA + AABCw/tDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////x+3+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/atD8//f8//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0MAAAAAAAAAAAAA + AAAAAAAAQsP7DELD+/xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////3PT+/0nF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+A1/z//v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+O2/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/sMAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//13M/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/67l/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7kkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3vX+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////5zg/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////3vX+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7kgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1dCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6nk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+z5//9Ixfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/etX8/7Pn + /f/b9P7/9/z///////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + ///////////////////+////7vr//8nu/v+c4P3/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////6nk/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+a3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9x0vz/4vb+//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////z+//+z5/3/S8b7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/7fn///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+9lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7//L7 + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////+////Usj7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////930/v9RyPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6rk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////y+///RcT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/uQQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+26P3///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////0vH+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz//P7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////zu/+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////tuj9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/d9T8//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////57g + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1/L+//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//X8 + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3fU/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/v2QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0XE+//v+v////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //951Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Y878//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//R8P7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9FxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/ZCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7tELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/suf9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Td + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////j9//9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/sOb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/u0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+o4/3///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////Usj7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6Ti/f////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/seQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/tuj9//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////1zL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+X3v3///////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////4PX+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+8hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5be/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6jj/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////5be + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/twQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+U3f3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////4/f//Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD+/5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Y878//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+86v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////btH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Y8/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4HX/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xe3+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Tx + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/bND8//z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+b3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xRCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9/1vz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////970/v9RyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/sUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7qULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7/+T3/v////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/j9v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////P7//7Pn/f9Lxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+E2Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+T3/v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+R3P3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9pz/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/3vV + /P+z5/3/3fT+//j9//////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + /////////////////////////v///+76///K7v7/nOD9/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP73ULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/+n4//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////sOb9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/ScX7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7//r9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////p+P//R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////b8 + //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////jtv9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3oAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//z+/////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+6VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//9jzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+46P3///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/ulAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7/+H1/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////3PT+/0jF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz//v////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+H1/v9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+96v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/9fz///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tKQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8ju + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7Pn///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////I7v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+9RCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9ezPz/+/7///////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ver+/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lN39//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////5/f//QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz/7/r///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9RCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6zl/f////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////c9P7/YM38/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////2TO/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/+Z3/3/+/7///// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7BELD+9xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////v+ + //+m4/3/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ + +//3/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2zQ/P/Y8/7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vcQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tYQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//+i4v3/WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD + +//I7v7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////f7//3XT + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/edT8/8zv/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD + +9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7////Q8P7/l979/2TO/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ + +//J7v7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///4/f//itr9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/3rV/P+x5v3/6/n///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1LI+//y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9/z//1bJ+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/a9D8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4DX/P+U3f3/lN39/5Td/f+U3f3/m9/9/7/r + /v/4/f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////h9v7/qeT9/5Xd/f+U3f3/lN39/5Td/f+U3f3/Vsn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4/b/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f910/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////L7//9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AULD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/htn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////Wcr7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////// + //+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/+j4 + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////1nK + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+/////////////////////////////// + ////////oOH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// + //+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/uyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz//f7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv///////////////////////// + /////////////6Dh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////// + ////////uOj9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////9/v//btH8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6Li/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////// + //////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////// + /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ouL9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP76ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Dw/v/y+/+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////2DM/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P////////////// + ////////////////////////peP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Xy + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7//z+//////////////// + ///////////////////B6/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/uOj9//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////y+/+/0PD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2BCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//n9/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+B1/z///////// + /////////////////////////////8ru/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +//1/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////6Lh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO/P////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/970 + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0/H+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Z8/8//n9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////2PP+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1PH+//// + ///////////////////////////////////9/v//Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+Q3P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////s+f//Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+56f7///////// + //////////////////////////////////991vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT + /P////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//2fP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yNCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+u5f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/q+T9//// + /////////////////////////////////////////////+H2/v9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/+P3///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////8ft/v9Ixfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+R3P3///////// + ////////////////////////////////////////8fv//2PO/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M + /P/s+f////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4jZ/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7dELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////9Tx/v9/1vz/Vsn7/1bJ+/991vz/0vH+//// + ////////////////////////////////////////////////////////8Pr//5nf/f9gzfz/Usj7/2rQ + /P+t5f3/+/7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4fb+/4jZ/P9ay/z/U8j7/3TT/P/B6/7///////// + ///////////////////////////////////////////////////3/P//peL9/2bO/P9SyPv/ZM78/6Dh + /f/1/P////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/vMQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ver+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////73q/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7MELD+/pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +//S8f7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Lx/v9GxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t3QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/T8f7/+H1/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v9Px/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+T3/v9Wyfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP77kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P/q+P////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9ay/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1RCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcz8/+/6//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9dzPz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9jzfz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +whCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P/q+P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9dzPz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sIAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7IELD++1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wsv8/+T3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+T3/v9ay/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Wyfv/4fX+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v9Wyfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0/H+//S8f7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Lx/v9Px/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t7AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7rULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/73q/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////73q/v9GxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7AQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD++NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz/+f3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//4jZ/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP78ULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2fP/P/n9/7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/2fP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7LgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7VULD+/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/ouL9//3+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////9/v//ouL9/0PD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7VQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tlQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9u0fz/6Pj///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//btH8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ZQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////++6v7/Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7eELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4bZ/P/y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////L7//+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t4QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7/7/r/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7/r/v9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7dULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Mxvv/rOX9//v+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//rOX9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tlQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9ezPz/ye7+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////J7v7/Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7ZQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+H1/v931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7QULD+/FCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/+I2fz/5/f+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/4jZ/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7QQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP740LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/+O2/3/6fj///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////p+P//jtv9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7LgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0jF + +/+R3P3/5ff+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+X3/v+R3P3/SMX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CkLD+61Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0PD+/9/1vz/1PH+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////1PH+/3/W/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7e0LD + +/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz/ver+//r9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + //+96v7/bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/t7QsP7AQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/lt79/+D1/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////4PX+/5be + /f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+yBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/btH8/7Ln + /f/v+v////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//+y5/3/btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7CULD+51Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RcT7/3fU/P+26P3/8vv///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////y+///tuj9/3fU/P9FxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+51Cw/sJAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP7v0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7/47b/f+/6/7/7Pn///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////7Pn//7/r/v+O2/3/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/t4QsP7+kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9ay/z/hdj8/7Hm/f/b8/7/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/f//2/P+/7Hm/f+F2Pz/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7eELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +zBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/9hzfz/g9j8/6Xj/f/G7f7/4PX+//j9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//+D1/v/G7f7/peP9/4PY + /P9hzfz/RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7BELD+3RCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/U8j7/2vQ + /P+D2Pz/l979/6Xj/f+z5/3/wev+/9Hw/v/b9P7/5/f+/+f3/v/t+f//8/v///T7///0+///8/v//+35 + ///n9/7/5/f+/9v0/v/R8P7/wev+/7Pn/f+l4/3/l979/4PY/P9r0Pz/U8j7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/t0QsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7I0LD+71Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP7i0LD+/pCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7i0LD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7skLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/uyQsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wFCw/tTQsP71kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP71kLD+1NCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/tYQsP73ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vcQsP7WELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/tKQsP7vELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vELD + +0pCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sxQsP7pULD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/ulQsP7MQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+3pCw/sYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7Q0LD+6pCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/uqQsP7Q0LD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7FELD+21Cw/vDQsP7/kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7w0LD+21Cw/sUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +xpCw/txQsP7yELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8hCw/txQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/seQsP7bkLD+7VCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/ZCw/u1QsP7bkLD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+0dCw/uQQsP72ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vZQsP7kELD+0dCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD + +5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD + +1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wxCw/tDQsP7ekLD+6lCw/vWQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+9ZCw/upQsP7ekLD+0NCw/sMAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/syQsP7YELD+41Cw/uuQsP70ELD + +/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/BCw/vQQsP7rkLD+41Cw/tgQsP7MkLD+wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7EELD+zFCw/tSQsP7akLD+31Cw/uTQsP7pkLD+7hCw/vLQsP73kLD++BCw/vwQsP78ELD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/vwQsP74ELD+95Cw/vLQsP7uELD+6ZCw/uTQsP7fULD + +2pCw/tSQsP7MULD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////4AAAf + ////////////////////////////////////8AAAAAAP//////////////////////////////////4A + AAAAAAB/////////////////////////////////wAAAAAAAAAP///////////////////////////// + //wAAAAAAAAAAD//////////////////////////////4AAAAAAAAAAAB/////////////////////// + //////8AAAAAAAAAAAAA////////////////////////////+AAAAAAAAAAAAAAf//////////////// + ///////////AAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAAP////////// + ///////////////4AAAAAAAAAAAAAAAAH////////////////////////+AAAAAAAAAAAAAAAAAH//// + ////////////////////gAAAAAAAAAAAAAAAAAH///////////////////////4AAAAAAAAAAAAAAAAA + AH//////////////////////+AAAAAAAAAAAAAAAAAAAH//////////////////////gAAAAAAAAAAAA + AAAAAAAH/////////////////////4AAAAAAAAAAAAAAAAAAAAH////////////////////+AAAAAAAA + AAAAAAAAAAAAAH////////////////////wAAAAAAAAAAAAAAAAAAAAAP///////////////////8AAA + AAAAAAAAAAAAAAAAAAAP///////////////////gAAAAAAAAAAAAAAAAAAAAAAf///////////////// + /4AAAAAAAAAAAAAAAAAAAAAAAf//////////////////AAAAAAAAAAAAAAAAAAAAAAAA//////////// + //////wAAAAAAAAAAAAAAAAAAAAAAAA/////////////////+AAAAAAAAAAAAAAAAAAAAAAAAB////// + ///////////gAAAAAAAAAAAAAAAAAAAAAAAAB////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAD + ////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH///////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////4AAAAAAAAAAAAAAAA + AAAAAAAAAAAf//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////4AAAAAAAAAAA + AAAAAAAAAAAAAAAAB//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////4AAAAAA + AAAAAAAAAAAAAAAAAAAAAAH/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////4A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAf////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////// + ///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/// + ////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAP//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////////AAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAD/////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////////gAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////gAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAB////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////gAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/ + //////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAP//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////gAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAB//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAA/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////4AAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + P////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAB////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//4AAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + Af//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAD///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///+AAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////wAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAf////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAP/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////+AAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////wAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAD///////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////+AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/ + ///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAH////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAH/////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////AAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAD/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////wAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAD///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////////AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////// + ///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAA + Af/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAf/////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////4AAAAAAAAAAAAAAAA + AAAAAAAAAAAf//////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH////////////////AAAAA + AAAAAAAAAAAAAAAAAAAAA////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAH//////////////// + +AAAAAAAAAAAAAAAAAAAAAAAAB/////////////////8AAAAAAAAAAAAAAAAAAAAAAAAP/////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAD//////////////////4AAAAAAAAAAAAAAAAAAAAAAAf////// + ////////////4AAAAAAAAAAAAAAAAAAAAAAH///////////////////wAAAAAAAAAAAAAAAAAAAAAA// + //////////////////wAAAAAAAAAAAAAAAAAAAAAP////////////////////gAAAAAAAAAAAAAAAAAA + AAB/////////////////////gAAAAAAAAAAAAAAAAAAAAf/////////////////////gAAAAAAAAAAAA + AAAAAAAH//////////////////////gAAAAAAAAAAAAAAAAAAB///////////////////////gAAAAAA + AAAAAAAAAAAAf///////////////////////gAAAAAAAAAAAAAAAAAH////////////////////////g + AAAAAAAAAAAAAAAAB/////////////////////////gAAAAAAAAAAAAAAAAf//////////////////// + /////wAAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAD//////////////// + ///////////4AAAAAAAAAAAAAB////////////////////////////8AAAAAAAAAAAAA//////////// + /////////////////+AAAAAAAAAAAAf//////////////////////////////AAAAAAAAAAAP/////// + ////////////////////////wAAAAAAAAAP////////////////////////////////+AAAAAAAAf/// + ///////////////////////////////wAAAAAA/////////////////////////////////////4AAAf + //////////////////8oAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xNCw/tiQsP7pELD+9JCw/vzQsP7/0LD + +/9Cw/vzQsP70kLD+6RCw/tiQsP7EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytCw/unQ8P7+kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7p0LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+w1Dw/uWQ8P7/kLD+/9Cw/v/QsP7/0bE + +/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ/P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srR8X74ULD+/9Cw/v/QsP7/3XT + /P/A6/7/+P3///////////////////////////////////j9///A6/7/ddP8/0LD+/9Cw/v/QsP7/0LD + +9tCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7N0bE+/RCw/v/QsP7/2PO + /P/S8f7/////////////////////////////////////////////////////////////////0vH+/2PO + /P9Cw/v/QsP7/0LD++9Cw/s3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytGxPv1QsP7/0LD + +/+O2/3/+v3///////////////////j9///K7v7/peP9/5Td/f+W3v3/p+P9/87v/v/6/f////////// + ////////+v3//47b/f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sNS8b75kLD + +/9Cw/v/n+D9//////////////////P7//+X3v3/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H + +/+d4P3/9vz//////////////////5/g/f9Cw/v/QsP7/0LD+9tCw/sNAAAAAAAAAAAAAAAAAAAAAFDH + +6FCw/v/QsP7/47b/f/////////////////V8v7/Vcn7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Yyvv/2vP+/////////////////47b/f9Cw/v/QsP7/0LD+5UAAAAAAAAAAAAA + AABCw/srQ8P7/kLD+/9jzvz/+v3/////////////1PH+/0nF+/9Cw/v/QsP7/2LN/P+05/3/6Pj///7/ + ///8/v//5Pf+/6/m/f9dzPz/QsP7/0LD+/9Kxvv/2PP+////////////+v3//2PO/P9Cw/v/QsP7/ULD + +ysAAAAAAAAAAFXJ+7lCw/v/QsP7/9Lx/v////////////z+//9Xyvv/QsP7/0LD+/+f4P3//P7///// + //////////////////////////////v+//+Z3/3/QsP7/0LD+/9Xyvv//P7/////////////0vH+/0LD + +/9Cw/v/QsP7pwAAAABCw/sTRcT7/ULD+/910/z/////////////////+v3//0/H+/9Cw/v/nuD9//// + //////////////////////////////////////////////////+c4P3/QsP7/0/H+//7/v////////// + ////////ddP8/0LD+/9Cw/v5QsP7E0/H+2lCw/v/QsP7/8Dr/v//////////////////////5ff+/83v + /v/+//////////////////////////////////////////////////////////7////N7/7/5ff+//// + ///////////////////A6/7/QsP7/0LD+/9Cw/tiXMv8vkLD+/9GxPv/+P3///////////////////// + ////////7fn////////v+v/////////////////////////////////////////////v+v///////+76 + ///+//////////////////////////j9//9GxPv/QsP7/0LD+6RUyfvoQsP7/2rQ/P////////////// + /////////////9Xy/v9GxPv/9fz//0PD+//h9v7/////////////////////////////////7Pn//0LD + +//k9/7/Usj7/8ft/v///////////////////////////2rQ/P9Cw/v/QsP70kjF+/tCw/v/h9n8//// + ///////////////////V8v7/fdb8/0LD+/951Pz/QsP7/3HS/P/T8f7//////////////////////9v0 + /v910/z/QsP7/3HS/P9FxPv/d9T8/9Dw/v//////////////////////h9n8/0LD+/9Cw/vzQsP7/0LD + +/+U3f3/////////////////3vX+/0bE+/9Cw/v/Vcn7/1nK+/9TyPv/QsP7/6Dh/f////////////// + ////////rOX9/0LD+/9SyPv/Wcr7/1XJ+/9Cw/v/Q8P7/9Px/v////////////////+U3f3/QsP7/0LD + +/9Cw/v/QsP7/5Td/f////////////////+l4/3/QsP7/7Tn/f///////////9Dw/v9Cw/v/oOH9//// + //////////////////+s5f3/QsP7/8Ts/v///////////8Dr/v9Cw/v/md/9/////////////////5Td + /f9Cw/v/QsP7/0jF+/tCw/v/h9n8/////////////////6fj/f9Cw/v/vOr+////////////0PD+/0LD + +/+g4f3//////////////////////6zl/f9Cw/v/xOz+////////////x+3+/0LD+/+Z3/3///////// + ////////h9n8/0LD+/9Cw/vzVcn76ULD+/9q0Pz/////////////////7Pn//1TJ+/9Dw/v/WMr7/1nK + +/9TyPv/QsP7/6Dh/f//////////////////////rOX9/0LD+/9SyPv/Wcr7/1nK+/9Dw/v/T8f7/+T3 + /v////////////////9q0Pz/QsP7/0LD+9JezPzBQsP7/0bE+//4/f/////////////z+///Wcr7/0TE + +/9s0Pz/cdL8/2XO/P9Cw/v/oOH9//////////////////////+s5f3/QsP7/2LN/P9x0vz/bND8/0fF + +/9SyPv/7Pn/////////////+P3//0bE+/9Cw/v/QsP7pFTJ+2xCw/v/QsP7/8Dr/v///////////73q + /v9Cw/v/reX9////////////0PD+/0LD+/+g4f3//////////////////////6zl/f9Cw/v/xOz+//// + ////////uun+/0LD+/+v5v3////////////A6/7/QsP7/0LD+/9Cw/tiQsP7E0XE+/1Cw/v/ddP8//// + ////////xOz+/0LD+/+C1/z/4vb+/+f3/v++6v7/QsP7/6Dh/f//////////////////////rOX9/0LD + +/+z5/3/5/f+/+P2/v+M2/3/QsP7/7np/v///////////3XT/P9Cw/v/QsP7+ULD+xMAAAAAWcr7vkLD + +/9Cw/v/0vH+///////4/f//ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////// + //+u5f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/9Pv////////S8f7/QsP7/0LD+/9Cw/unAAAAAAAA + AABCw/srQ8P7/0LD+/9jzvz/+v3////////4/f//peL9/0LD+/+a3/3/QsP7/5Hc/f/o+P////////// + /////////////+76//+X3v3/QsP7/47b/f9Hxfv/m9/9//b8////////+v3//2PO/P9Cw/v/QsP7/ULD + +ysAAAAAAAAAAAAAAABWyfunQsP7/0LD+/+O2/3////////////n9/7/f9b8//r9//961fz/7/r///// + //////////////////////////////b8//961fz/8vv//4fZ/P/e9f7///////////+O2/3/QsP7/0LD + +/9Cw/uVAAAAAAAAAAAAAAAAAAAAAELD+w1Nx/vpQsP7/0LD+/+f4P3///////////////////////// + ////////////////////////////////////////////////////////////////////////n+D9/0LD + +/9Cw/v/QsP720LD+w0AAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytIxfv3QsP7/0LD+/+O2/3/+v3///// + ////////////////////////////////////////////////////////////////////////+v3//47b + /f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zdHxfv2QsP7/0LD + +/9jzvz/0vH+/////////////////////////////////////////////////////////////////9Lx + /v9jzvz/QsP7/0LD+/9Cw/vvQsP7NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +ytKxvvlQsP7/0LD+/9Cw/v/dtP8/8Dr/v/4/f//////////////////////////////////+P3//8Dr + /v920/z/QsP7/0LD+/9Cw/v/QsP720LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+w1IxfuaQ8P7/kLD+/9Cw/v/QsP7/0bE+/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ + /P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srRcT7qkPD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ULD+6dCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7E0LD+2JCw/ukQ8P71EPD + +/VCw/v/QsP7/0LD+/NCw/vSQsP7pELD+2JCw/sTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP/wD///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABgAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gA + AB/8AAA//gAAf/+AAf//8A//KAAAADAAAABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD+/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD + +yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7GELD+3ZCw/vSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vSQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sIQsP7gELD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG + +/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD + +4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y1Cw/vXQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td + /f/E7P7/6vj//////////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/33W + /P/Q8P7//v////////////////////////////////////////////////////////////////////7/ + ///Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// + /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD + +/9Cw/v/R8X7/7Hm/f/+//////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkLD + +/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////7////S8f7/oOH9/3zV + /P9mzvz/Wcr7/1rL/P9pz/z/gNf8/6Xj/f/Z8/7//////////////////////////////////////9vz + /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/stQ8P7+ULD+/9Cw/v/QsP7/1zL/P/p+P/////////////////////////////4/f//quT9/1jK + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8/7Ln/f/7/v////////// + ///////////////////p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+whGxPvbQsP7/0LD+/9Cw/v/Vsn7/+n4/////////////////////////////8/w + /v9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9izfz/1/L+////////////////////////////6fj//1bJ+/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4BCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// + ////////p+P9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/SMX7/0zG+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/7Dm/f///////////////////////////9vz/v9Hxfv/QsP7/0LD + +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////// + //////////////////+c3/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9cy/z/pOL9/9by/v/3/P////////// + ///3/P//0PD+/53g/f9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4v3///////////////////////// + //+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD+x8AAAAAAAAAAAAAAAAAAAAAR8X7nELD+/9Cw/v/QsP7/27R + /P/+/////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/Ucj7/7np/v/+//////////// + ///////////////////////////////////7/v//sOb9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/uen+//// + ///////////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAAAABCw/sYQ8P7/ELD + +/9Cw/v/QsP7/9rz/v//////////////////////+/7//07H+/9Cw/v/QsP7/0LD+/9lzvz/6vj///// + /////////////////////////////////////////////////////////////+X3/v9gzPz/QsP7/0LD + +/9Cw/v/Tsf7//v+////////////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAA + AABDw/t3QsP7/0LD+/9Cw/v/fdb8////////////////////////////+P3//0bE+/9Cw/v/QsP7/1zL + /P/v+v////////////////////////////////////////////////////////////////////////// + ///v+v//Wsv8/0LD+/9Cw/v/RsT7//j9/////////////////////////////33W/P9Cw/v/QsP7/0LD + +/9Cw/t2AAAAAAAAAABMxvvdQsP7/0LD+/9Cw/v/0PD+/////////////////////////////////63l + /f9Lxvv/Yc38/9/1/v////////////////////////////////////////////////////////////// + ////////////////////////3/X+/2HN/P9Lxvv/reX9/////////////////////////////////9Dw + /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAELD+yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7///9Zyvv/QsP7/0LD+/9Cw/v/QsP7IELD+2BCw/v/QsP7/0LD+/+U3f3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YE/H+6RCw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////+s5f3/md/9///////N7/7/gtf8//X8 + ////////////////////////////////////////////////////////+/7//4ra/f/A6/7//////6jj + /f+c4P3////////////////////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mVLI + +9FCw/v/QsP7/0LD+//q+P////////////////////////////////////////////9Zyvv/QsP7//// + //+J2v3/QsP7/9Dw/v//////////////////////////////////////////////////////3vT+/0LD + +/9z0/z//////0/H+/9Dw/v////////////////////////////////////////////q+P//QsP7/0LD + +/9Cw/v/QsP7wEvG+/FCw/v/QsP7/0rG+///////////////////////////////////////9fz//7np + /v9Nx/v/QsP7/5Td/f9gzfz/QsP7/4DX/P+t5f3//v////////////////////////////////////// + //+36P3/hdj8/0LD+/9Wyfv/lN39/0bE+/9Cw/v/s+f9//H7//////////////////////////////// + ////////Ssb7/0LD+/9Cw/v/QsP75kbE+/pCw/v/QsP7/1vL/P////////////////////////////// + ///Y8/7/VMn7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3/X+//////////////////// + /////////////+76//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//P8P7///////// + ////////////////////////W8v8/0LD+/9Cw/v/QsP79ELD+/9Cw/v/QsP7/2XO/P////////////// + //////////////7///9dy/z/QsP7/0LD+/9Nx/v/ZM78/2XO/P9lzvz/V8r7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/1XJ+/9lzvz/Zc78/2XO/P9Px/v/QsP7/0LD + +/9RyPv/9/z/////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO + /P///////////////////////////9vz/v9Cw/v/QsP7/4DX/P/7/v//////////////////uOj9/0LD + +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl/f////////////// + ///+////kdz9/0LD+/9Cw/v/yO7+////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0bE + +/pCw/v/QsP7/1vL/P///////////////////////////8vv/v9Cw/v/QsP7/8Hr/v////////////// + ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl + /f//////////////////////1fL+/0LD+/9Cw/v/uen+////////////////////////////W8v8/0LD + +/9Cw/v/QsP79EvG+/FCw/v/QsP7/0rG+////////////////////////////+X3/v9Cw/v/QsP7/4va + /f/+////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 + /v9Cw/v/QsP7/6zl/f//////////////////////nOD9/0LD+/9Cw/v/0/H+//////////////////// + ////////Ssb7/0LD+/9Cw/v/QsP75lPI+9NCw/v/QsP7/0LD+//q+P////////////////////////// + //971fz/QsP7/0LD+/9Yyvv/cdL8/3HS/P9x0vz/X8z8/0LD+/9Cw/v/2/T+//////////////////// + /////////////+f3/v9Cw/v/QsP7/1zL/P9x0vz/cdL8/3HS/P9dy/z/QsP7/0LD+/9pz/z//v////// + ///////////////////q+P//QsP7/0LD+/9Cw/v/QsP7wFPI+6hCw/v/QsP7/0LD+//E7P7///////// + ///////////////////w+v//T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +//m9/7////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mUTE+2FCw/v/QsP7/0LD + +/+U3f3///////////////////////////+R3P3/QsP7/0LD+/9mzvz/htn8/4jZ/P+I2fz/btH8/0LD + +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/2nP/P+I2fz/iNn8/4jZ + /P9s0Pz/QsP7/0LD+/991vz///////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YELD + +yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////z+//9Hxfv/QsP7/3zV/P////////////// + ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl + /f//////////////////////j9v9/0LD+/9Cw/v/7/r///////////////////7///9Zyvv/QsP7/0LD + +/9Cw/v/QsP7IAAAAABOx/vgQsP7/0LD+/9Cw/v/0PD+//////////////////P7//9Cw/v/QsP7/5je + /f//////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 + /v9Cw/v/QsP7/6zl/f//////////////////////rOX9/0LD+/9Cw/v/3vT+/////////////////9Dw + /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAAAAAABGxPt5QsP7/0LD+/9Cw/v/fdb8//////////////////7/ + //9SyPv/QsP7/0/H+/+56f7/2fP+/9v0/v/b9P7/ouH9/0LD+/9Cw/v/2/T+//////////////////// + /////////////+f3/v9Cw/v/QsP7/5je/f/b9P7/2/T+/9vz/v+/6/7/V8r7/0LD+/9GxPv/9vz///// + /////////////33W/P9Cw/v/QsP7/0LD+/9Cw/t2AAAAAAAAAABCw/sYRMT7/ULD+/9Cw/v/QsP7/9rz + /v////////////////+n4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+V3f3/////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAAAAAAAAAATMb7oELD + +/9Cw/v/QsP7/27R/P/+///////////////+////peP9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Hxfv/7Pn///////////////////////////////////f8//9Ox/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Ssb7/5vf/f/9/v/////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAA + AAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////////////////////z+//9Wyfv/QsP7/9v0 + /v971fz/QsP7/7Xn/f/s+f/////////////////////////////////////////////v+v//v+v+/0LD + +/9oz/z/2/T+/0vG+/9Cw/v/+/7///////////////////////+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD + +x8AAAAAAAAAAAAAAAAAAAAAAAAAAEbE+4NCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// + //9u0fz/Vcn7//////+d4P3/Q8P7/+D1/v////////////////////////////////////////////// + ////////7fn//0jF+/+J2v3//////2bO/P9Zyvv//////////////////////9vz/v9Hxfv/QsP7/0LD + +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whJxfvfQsP7/0LD+/9Cw/v/Vsn7/+n4 + ///////////////////4/f//9fz////////+////8Pr///////////////////////////////////// + //////////////////////////////H7///9/v////////j9///1/P//////////////////6fj//1bJ + +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/stRMT7+kLD + +/9Cw/v/QsP7/1zL/P/p+P////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7WkLD+/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9vz/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD+/9Cw/v/R8X7/7Hm/f/+//////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// + /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD + +/lCw/v/QsP7/0LD+/9Cw/v/QsP7/33W/P/Q8P7//v////////////////////////////////////// + //////////////////////////////7////Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD + +1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+y1Dw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td/f/E7P7/6vj///// + /////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7gEPD+/lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0rG+/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7+ELD+4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7GELD+3ZCw/vTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vTQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD + +/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//4Af//wAA//8AAP//AAD/+AAAH/8AAP/g + AAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAP + AADgAAAAAAcAAOAAAAAABwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAA + AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAA + AAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/gAAAAB/ + AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/AAD/4AAAB/8AAP/4AAAf/wAA//8AAP//AAD//+AH//8AAA== \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Main.resx b/NiceHashMiner/Forms/Form_Main.resx index 6ac5fe2..4de6aaa 100644 --- a/NiceHashMiner/Forms/Form_Main.resx +++ b/NiceHashMiner/Forms/Form_Main.resx @@ -126,1206 +126,4764 @@ - AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAGd4AAK4EAAAgIAAAAQAgAKgQAADH4gAAMDAAAAEA - IACoJQAAb/MAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAQQFGhdFVoMogKHNMZvE8DGawu4ofZ3JFD9PfAECAxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACFkRWhz6/6/xCyv7/QMr+/0HK/v9Dyv7/RMv+/0XL/v8/uOb6FDpIeAAAAAAAAAAAAAAAAAAA - AAAAAAACImqFtEHK/f9Gz/7/Qcr+/0HF9/85p9D/O6nS/0fI+P9KzP7/S8z+/0vM/f8iW3CjAAAAAAAA - AAAAAAAAGk1gi0XO/f9Gz/7/RMXw/yFec/8mZn7/NpCx/ziQsf8uaYD/MGqB/0/H9P9Tzv7/Us79/xk/ - TXgAAAAAAwoMJDu87PxByv7/Pr3s/0Z4gf9Pzfb/Tc/+/1DO/v9Tz/7/V8/+/1bI9P88c4r/Wcn0/1zR - /v9QueL3AgQFFhpSZ4tAyv7/NqjR/yt8mf9Jzfz/TtT+/1PU/v9X0P7/XNH+/2DS/v9j0/7/ZdH6/1GR - rf9dud3/ZdP+/yFGVHgrh6rNQsr+/0XL/f85n8T/Ts7+/1TS/v9e1f7/X9L+/2XT/v9r1f7/b9b+/3LW - /v9ntNP/c9f9/3HW/v9CgJi6NKHK7EPL/v9HzP7/TM39/2XT/P9x0vX/bM/1/2jU/v9w1v7/fNPz/4PY - 9/+C2fz/gtr9/4Ha/v9/2v7/WJ242TWhyutFy/7/T8z7/3DP9P9sxe3/WbXm/0iq4/9Zuuv/VLPm/0yr - 4/9fuef/csjv/4LV9f+R3v3/jt7+/2Oft9gth6nJSMz+/1bE9P9FpeD/Io3Z/y+X3P87qeX/edb6/3/U - 9v8zpOX/KpLa/yiQ2f9HqOP/l9v5/57i/v9ahZe3G1BkhEnM/v9Qyfr/Nqfm/zqx6/9CvPH/V8z3/4Xb - /v+S3/7/Tcn3/0G47v84sOv/UK/m/7Xn/v+x5///N0pTcwMJCx5Gvev6Vs/7/0zK+f8qpej/W8Ty/4nb - +P+M3f7/nOH+/5De+P9IuO7/M6ro/07N/P/J7P3/rNDg9AMEBBIAAAAAHElaflnQ/f+D2ff/l932/6fm - +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 - AAAHETRBlzq04f5Bzf7/R8/+/0HL/v9Ayv7/Qcr+/0HK/v9Cyv7/Qsr+/0PL/v9Ey/7/RMv+/0XL/v9F - y/7/Rsv+/0bL/v9Gy/7/OaXO+AwjLHsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAADxtVasRAx/r/Qcr+/0HM/v9J0f7/Qcr+/0HK/v9Cyv7/Q8r+/0PL/v9Ey/7/Rcv+/0bL/v9G - y/7/R8z+/0jM/v9IzP7/Scz+/0nM/v9JzP7/RcHw/xY9TKUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAocWW/HQMr9/0HK/v9By/7/Ss7+/0PQ/v9Byv7/Qsr+/0PL/f89uOX/MpW5/y6Eo/8w - hqX/N5q+/0S+7P9KzP7/S8z+/0vN/v9Mzf7/TM3+/03N/v9Mzf7/Ssf2/xc+TaYAAAABAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAFEBOp0DM/P9BzP7/Q8v+/0rO/v9Ez/7/Qs7+/0HG+P8qfZv/EjA6/wkND/8T - KjP/Gj1K/xs9Sv8WKzP/EhUZ/x9ATf85jq7/Tsz7/0/O/v9Qzv7/UM7+/1DO/v9Qzv7/TMTx/w8nMH4A - AAAAAAAAAAAAAAAAAAAAAAAAAAgUGl1Bvu3/R8/+/0nQ/v9I0P7/Qs/+/0TP/v9Ircz/Eysu/xc8Sf8y - ja7/RcTz/0rM/v9Lzf7/Tc3+/07N/v9KwOz/Ooqo/yM9Sf8lQU3/SrTc/1TP/v9Uz/7/VM/+/1TP/v9U - z/7/Rq3U+QMHCTcAAAAAAAAAAAAAAAAAAAAMK4Wm6ELL/v9By/7/Qcz+/0HM/v9Cy/7/QZqy/3NSNv9M - p7z/SM/9/0rO/v9Lzf7/Tc3+/0/N/v9Qzv7/Us7+/1PP/v9Vz/7/Vc36/0GPrf8mN0H/SqfL/1nQ/v9Z - 0P7/WdD+/1jQ/v9Y0P7/K2Z8ygAAAAEAAAAAAAAAAAsjK3c/yPz/QMr+/0DK/v9Byv7/Qsr+/zObwf8Y - OD3/WMfp/1LT/v9L0P7/TdH+/0/R/v9Qzv7/Us7+/1TP/v9Wz/7/V9D+/1nQ/v9a0P7/XNH+/1O33P8w - RlL/VLbc/17R/v9e0f7/XdH+/13R/v9WxO7/Bg4RTgAAAAAAAAABJnmY30DK/v9Ayv7/Qcr+/0LK/v9A - wPD/FDVA/0G86f9K0P7/TND+/07W/v9Q1P7/UtP+/1TQ/v9Wz/7/WND+/1rQ/v9c0f7/XtH+/1/S/v9h - 0v7/YtL+/1m53f87WWj/YtH6/2PT/v9j0/7/YtL+/2HS/v8rXHC4AAAAAAEDBDo7vOz/QMr+/0HK/v8w - mLz/K4Sj/yFfdf83n8T/Scz+/0zR/v9O0v7/Udb+/1PV/v9W1f7/V9H+/1rQ/v9c0f7/X9H+/2HS/v9j - 0/7/ZdP+/2bT/v9n1P7/aNT+/1abt/9Qi6T/VJm1/1yy1P9o1P7/ZtP+/0+mx/kAAAAUDi46fkDK/v9B - yv7/Qsr+/0PL/v9BwvP/J2yE/0K45P9LzP7/TtD+/1HS/v9U1f7/V9b+/1zV/v9b0f7/XtH+/2HS/v9k - 0/7/ZtP+/2jU/v9q1P7/bNX+/23V/v9u1f7/Zbnb/1iPqP9u0/v/b9b+/27V/v9s1f7/adH5/wgPElQb - VmyvQMr+/0HK/v9Dy/7/RMv+/0bL/v9Hyfr/MH+a/03N/v9Qzv7/U9H+/1bS/v9a0/7/adX+/1/S/v9j - 0/7/ZtP+/2nU/v9s1f7/btX+/3DW/v9y1/7/dNf+/3XX/v9hm7T/dtj+/3bY/v911/7/dNf+/3PX/v9x - 1v7/HTlDhiRxj9BByv3/Qsr+/0TL/v9Gy/7/SMz+/0rM/v9KxvP/T87+/23T9/9yz/H/Y9H6/3PQ8v9g - 0v3/ZNP+/2fU/v9r1f7/btX+/3TS9v+C1/X/dNH1/4zb9v981/r/fNn+/3vT9v992f7/fdn+/3zZ/v97 - 2f7/edj+/3fY/v8vVmWnKX+g4UHK/v9Dy/7/Rcv+/0fM/v9JzP7/TM3+/0/O/v9Szv7/etn6/3LQ8v9x - 1fr/ccrt/2TT/f9o1P7/bNX+/3DW/v901/7/cs3x/4TX9/930fX/it/6/4ja+v+E2/7/hdv+/4Xb/v+F - 2/7/hNv+/4Lb/v+A2v7/ftn+/zpmd7gpgKHhQsr+/0TL/v9Gy/7/SMz+/0vM/v9ZzPj/b9L2/3LR9f92 - 0PT/bMjv/2jF7v9cuOf/Zcjx/2rN9P9w0vn/c9H2/3PN8v9sw+r/Y73s/3PI7v9yzPL/gNPz/4bX9f+L - 2fb/i9v6/43d/v+M3f7/it3+/4jc/v+F2/7/Pmd4uCZ1k9JDy/7/Rcv+/0fL/v9KzP7/Xsv1/3vT9f9u - y/P/Z8Hs/2C55/9Ur+L/RaTf/zmd3/80md3/NZre/2K+6v9Hpd3/M5jd/zaa3f89oOD/S6jf/1iz5P9k - vOj/aMXw/3LO9f+D1PP/ktz6/5Tf/v+S3/7/kN7+/4zd/v85XGqqHl10s0TL/v9Gy/7/SMz+/0vM/v9q - xe7/Wbjq/06r4P8xltv/IYzZ/yKN2f88ndv/Lpfe/z2j3/9kw+//dtL3/3HK8f9lvuj/MZrg/zab3/8w - lNj/IYzZ/yOO2v89ndn/VLLo/1687P+P1/X/neH+/5vh/v+Y4P7/lN/+/ytBS4oSNkSDRMv+/0fL/v9J - zP7/TM39/1q16P87nt//Pp7c/yGM2f8hjdn/IY7a/z2k4f8uqOr/Tbnr/3rZ/v+A2v7/htv+/4XX9/80 - rOj/Mafp/zWb3P8hjtr/IY3Z/yyT2f88nt3/P6Hg/4nR9P+m5P//o+P//6Di//+c4f7/EBgbWgMKDEFD - w/T/R8z+/0rM/v9Ozf7/Urnr/zCX3v84oOL/OqHe/y+Y2f8lktj/QbXr/znB+v9cx/H/f9r+/4Xb/v+L - 3f7/kd79/0S/8P83v/j/OaPf/yqV2P8zm9v/Qafi/y6Y3/86nN3/pd/6/7Dm//+t5f//qeT//4m91P0A - AAAaAAAABi+IquZIzP7/S83+/0/O/v9Szfz/RrLl/y+v7/8zuPT/QMP4/07M+/9Nz/7/UtL+/23O8v+D - 2/7/itz+/5De/v+X4P7/Yczz/07Q/v9Qz/3/SMn6/zq/9/8xtPL/Na7t/5TQ7f+96v//uur//7fp//+y - 6P//WHWBwQAAAAAAAAAAEjRBgUnM/f9Mzf7/UM7+/1bJ9f89wvn/P8T4/zyu5/8ypeT/Mafk/3LY+f96 - 3v//e9Hy/4fc/v+O3v7/ld/+/5zh/v+C1fP/c93//1nD7/8wpuT/NKfk/0G47P87xPv/V8f0/8Pq/P/F - 7P//wOv//7fm+v8VGx5aAAAAAAAAAAABAgMUN5m97k3N/v9Rzv7/YNP8/1DR/v9bzPT/JqTp/yen6/8r - qen/nuf9/6Tq/v+A0fL/it3+/5Lf/v+Z4P7/oeP//5vb8/+e6P//c87z/yep7P8mpur/Pa/o/1jU//9Q - 0f7/yO39/9Du///K7f//dIuW2AAAAAQAAAAAAAAAAAAAAAAOJi9sTMj3/1HO/v9t2P3/d97+/4ji/v9y - zPH/R7bq/0q36f+67///v/H+/4LT9P+N3f7/ld/+/53h/v+m5P//q+H1/7zw//+V2/X/PLPq/1S76/+I - 2/j/f+D//4Df/f/e8/7/2/L//8Lc6f4RExVGAAAAAAAAAAAAAAAAAAAAAAAAAAQjXHG3Us7+/1fP/f9t - zO//mNzy/7Xs/f+/8f//w/P//8L0///B9f//suz5/5ve9P+X4P7/nd/7/67m9f+/8/3/wfX//8P0///C - 8///u/D//6zm+P+k3PD/0+r2/+73///m9P3/QkhMkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAxMy - fZrVV8/+/1vR/v9h0f3/qOf5/5fb8f+g4/f/quj1/5nh9v+f5Pb/ltzz/5ng/v+e3/v/p+Ty/7Dn9v+s - 4fH/wPf+/8Tm9P+16PX/3PH5//f6///6/P//+Pv+/2xvcrwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAIEBRs0fJjTXNH+/2HS/v+t7Pr/g9by/5jl+v+S3vH/gdr+/4nc/v+R3v7/muH+/6Pj//+t - 5f//uOj//7Dg9P+x8/v/1e/7/7Dn8v/e9Pr//f3///39/f91dXW9AAAACwAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAECAxEoWm2xXsz2/3jV9v9y0/j/hdv3/4TX8/+B2v7/idz+/5He/v+a - 4f7/o+P//63m//+46f//vej7/7Dl8v/V7/v/zuv1/+j0+v/r6+z+UFBQlwAAAAYAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQIypiSpe16GzV/f9z1/7/etj+/4Ha/v+J - 3P7/kd7+/5ng/v+i4/7/rOX//7fp///B7P//zO7//9jx///j8vz/mp+i3BkZGUkAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEOGC43ckeGnthx - yu3/gNr+/4fc/v+P3v7/mOD+/6Di//+q5f7/tOj+/77r//+01eX+eIiRyyIlJ2MAAAAFAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAwQGBy8cMDdvN1lmnkt0hb1YgpTMXIOTy1Z1g7pEWWKZIywwaAICAyMAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///AAH//gAAf/gAAB/wAAAP4AAAB+AAAAfA - AAADgAAAAYAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGA - AAABgAAAAcAAAAPAAAAH4AAAB/AAAA/4AAAf/AAAf/8AAP//wAf/KAAAADAAAABgAAAAAQAgAAAAAAAA - JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIFBgUPMDwKBQ8TOAQMDmQDCg2AAwoNjQMKDYsD - Cw18BAwPWwYSFysOKzYIAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEJHyZmHVlwpSRxjtwpgaL/MZnB/ziw3P88 - vu//PsT2/z7E9v89u+z/N6vY/y+Tuv8pfp7/I2yI0RpRZZcBAwNYAAAAEgAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkCBogvTKLrPg9wPD+PsX4/0DK/v9A - y///QMr//0HK/v9Byv7/Qcr+/0HK/v9Byv7/Qcr+/0LK//9Cy///Qsv9/0HF9v8+v+/8JXKO8wEGB5gA - AAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFBQAAAAAAAAAAJBVDUpspg6D/Q9P//03S//9A - y/7/QMr+/0DK/v9Ayv7/Qcr+/0HK/v9Byv7/Qcr+/0HK/v9Cy/7/Qsv+/0PL/v9Dy/7/Q8v+/0TL/v9E - y/7/R9L//0PJ+/8lbIf/EjZDeAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAEDA95LY6x7z3B7v9C - 0///RM/+/0nN/v9Ayv7/Qcr+/0HK/v9Byv7/Qcr+/0LK/v9Cy/7/Q8v+/0PL/v9Dy/7/RMv+/0TL/v9E - y/7/Rcv+/0XL/v9Gy/7/Rsv+/0bM/v9Hzv//QLnm/yp4lt8AAABQAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwwnML84 - r9z/Qs///0HN/v9Azv7/TtL+/0PN/v9Byv7/Qcr+/0HK/v9Byv7/Qsv+/0LL/v9Dy/7/RMv+/0TL/v9E - y/7/RMv+/0XL/v9Gy/7/Rsv+/0fM/v9HzP7/R8z+/0fM/v9HzP7/R8z+/0nP//8zkbT/CyAofAAAAAEA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAbHl111T/D9f9Czf//Qcv+/0HM/v9Gzv7/TNT+/0HM/v9Byv7/Qcr+/0LL/v9Dy/7/Q8v+/0TL/v9E - y/7/RMv+/0XL/v9Gy/7/R8z+/0fM/v9HzP7/R8z+/0jM/v9JzP7/Scz+/0nM/v9KzP7/Ss3+/0rN/v9M - 0///P6/Z/xtKXLEAAAAHGEFRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAABkaUmb4Q8///0HK/v9Byv7/Qcv+/0LM/v9O0f7/Q9L+/0HL/v9Cyv7/Qsv+/0PL/v9E - y/7/RMv+/0XL/v9Fy/7/Rsz+/0fM/v9HzP7/SMz+/0jM/v9JzP7/Ssz+/0rN/v9Kzf7/S83+/0vN/v9L - zf7/TM3+/0zN/v9Mzf7/TM3+/0jC8f8TMz/IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAFx9geN9E1f//Qcv+/0HL/v9By/7/Qcz+/03O/v9H0f7/QtH+/0LL/v9C - y/7/Rc3//0bU//8+vOn/NJzB/y6Gpf8oc4z/Jmh//yZpgf8reJL/M4qr/zyjyf9GxfP/TtX//03O//9M - zf7/Ts3+/03N/v9Ozf7/Ts7+/07O/v9Ozv7/Ts7+/07Q//9KxPL/GD9OugAAAAcAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAQOEgAAAAAAFD9NyD/H9/9Bzf7/Qcz+/0HM/v9DzP7/Uc/+/0bR/v9C - 0P7/Q8/+/0PL/v9H0///NqrS/xY+S/8MFxz/CgsO/wgDAv8IAAD/CQAA/wsCAf8MAwP/DgkK/xIUGP8W - ICb/JFZm/0a85v9Q0///UM7+/1DO/v9Qzv7/UM7+/1HO/v9Rzv7/Uc7+/1HO/v9Rz///Sbvn/xY5RocA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFBqRO7/p/0HR//9Bzv7/Q87+/0nO/v9P - 0P7/RND+/0PQ/v9D0P7/Q83//zir1P8VP0z/AgAA/wwVGf8VMTv/JGN4/zSSs/8+sNf/Qr/o/0O95/8/ - rNP/No6r/yhfcf8eNT//Fxsg/xEJCv8sYnX/S73n/1PR//9Tz/7/U8/+/1TP/v9Uz/7/VM/+/1TP/v9U - z/7/VNH//zqQsf8CBgdAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAEA9ocn7TND//0zQ/v9N - 0/7/S9P+/0jS/v9D0f7/Q9L+/0PQ/v9U1f//RH6C/xMaEP8KFBf/K32Z/z6y3P9Jzv//TNL//0zQ//9N - z///Ts///07P//9Q0P//UdH//1PU//9QzPr/R6/W/zR1jP8YFRf/HiUr/z6Oq/9Z2v//VtD+/1bQ/v9W - 0P7/VtD+/1bQ/v9W0P7/VdD+/1jW//8vcovxAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyBheb1C - yvr/Q87+/0LN/v9AzP7/Qs7+/0LP/v9Cz/7/Q8v+/0XH9/9qcGT/hEEZ/0Nzbf9Jz/7/Sc///0rM/v9K - zf7/TM3+/03N/v9Nzv7/UM7+/1DO/v9Sz/7/Us/+/1TP/v9Uz/7/Vc/+/1fT//9Uy/f/LE1c/x8YHP84 - c4r/WdH//1nR/v9Z0P7/WdD+/1nQ/v9Z0P7/WdD+/1jQ/v9Z0v//GDxImQAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAARDOfyP9Ay///QMr+/0HK/v9Byv7/Qcr+/0LK/v9Dy/7/RM///x1OW/9APiP/c6m2/2Tf//9M - 0v//S9L+/0zS/v9N0f7/Ts/+/0/O/v9Qzv7/Us7+/1PP/v9Uz/7/VdD+/1bQ/v9X0P7/WND+/1nR/v9a - 0f//W9P//0KIpP8kIif/P3qR/1/Y//9c0f7/XdL+/1zS/v9c0v7/XNH+/1zR/v9b0f7/P5Cv8gsaHxkA - AAAAAAAAAAAAAAAAAAAAF0ZX50LR//9Ayv7/QMr+/0HK/v9Byv7/Qsr+/0PL/v9F0P//HFFj/woQE/9D - stb/Wtf+/1LT/v9L0P7/TdD+/07R/v9P0v7/UdL+/1HO/v9Sz/7/VM/+/1XP/v9W0P7/WND+/1nQ/v9a - 0f7/W9H+/1zR/v9d0f7/XdL+/1/S/v9Qqcr/KSct/0iSrf9i1///YNL+/2DS/v9g0v7/YNL+/1/S/v9f - 0v7/Wcjy/xAlLIwAAAAAAgECAAAAAAAAAABJN6/c/0HM//9Ayv7/Qcr+/0HK/v9Cyv7/Q8v+/0TL/v8y - l7v/ChIV/zimzP9K1P//SdH+/0vQ/v9N0/7/T9b+/1DU/v9R0/7/U9P+/1TQ/v9Vz/7/VtD+/1jQ/v9Z - 0P7/W9H+/1zR/v9d0f7/XtH+/1/S/v9g0v7/YdL+/2LT/v9k1///TZSv/y4sMv9aut7/ZNT+/2TT/v9j - 0/7/Y9P+/2LT/v9i0/7/ZNn//zJuhf8AAAADAAAAAAAAAAAYSFyjQc3//0DK/v9Byv7/Qcr+/0TR//9G - 1f//RtD//0fS//8PKC//M5Gz/0nP//9Kz/7/TNL+/03R/v9O2P7/Udj+/1LV/v9U1v7/VdT+/1fR/v9X - 0P7/WdH+/1vR/v9c0f7/XtL+/1/S/v9g0/7/YtP+/2LT/v9k0/7/ZdT+/2XU/v9m1P7/aNj//0yIov9C - ZHX/Z9P9/2nZ//9q3f//aNf//2bU/v9l1P7/ZdX//2DM9v8AAABrAAAAAAAAABAriKvUQMr//0HK/v9B - yv7/Q87//yNyi/8VQk//KHyW/yp8mP8YOkf/R8r7/0nM/v9L0P7/TdL+/0/S/v9R1f7/Utb+/1TV/v9V - 1v7/WNb+/1jR/v9a0P7/XNH+/17R/v9f0v7/YNL+/2LT/v9j0/7/ZdP+/2bU/v9o1P7/aNT+/2nV/v9q - 1f7/atX+/2vS+/9BVGL/X7TU/1CHnv9DYG7/WanH/2vY//9q1f7/aNT+/2vb//8oU2PGAAAAAA8uOiAx - nMT7Qcr+/0HK/v9Byv7/Qsv+/0XP//9DzP//OqzV/yFcb/8mZ33/StD//0vN/v9Mzv7/T9P+/1HS/v9S - 1f7/VNb+/1bW/v9Y1/7/WNT+/1vR/v9d0f7/X9L+/2DT/v9i0/7/ZNT+/2bU/v9o1P7/adX+/2vV/v9r - 1f7/bNb+/27W/v9u1v7/b9b+/2/W/v9RfJH/V4+o/2nD5v9v2f//cNj//27W/v9t1v7/bdb+/2zX//9N - mrjiAAAAFxQ+TUg3q9f/Qcr+/0HK/v9Cy/7/Q8v+/0TL/v9Fy/7/R8v+/0jP//8qc4v/QrPd/0zN/v9O - zv7/UM/+/1PU/v9U1P7/VtX+/1jW/v9l2P7/ctr+/17S/v9f0v7/YtP+/2PT/v9m1P7/Z9T+/2rV/v9r - 1f7/bNX+/27W/v9v1v7/cdb+/3LX/v9y1/7/dNj//2q+3/9ck6z/dNj+/3TY/v9z1/7/c9f+/3PX/v9x - 1/7/cNb+/2/W/v9fudzzBQkLMhE2Q30+wfP/Qcr+/0HK/v9Dy/7/RMv+/0TL/v9GzP7/R8z+/0nM/v9A - rtf/MYGa/0/R//9Qzv7/Ts7//1HQ//9V0v7/WNP+/1nT//9e0/7/Y9T+/2DS/v9i0/7/ZNP+/2fU/v9p - 1P7/a9X+/23W/v9u1v//cNf//3LX/v9z2P//c9j//3bY/v932f7/euD//1V0hP920/b/edj+/3nY/v94 - 2P7/d9j+/3fZ/v922P7/dNf+/3TY/v9ju97/JkdUSBM8SqVCzv//Qcr+/0LL/v9EzP7/RMz+/0bM/v9H - zP7/SM3+/0rN/v9Lzfz/Ssfz/0/P//9Oz///g9Hs/4DP6v9cz/v/Xs/6/2rH6/9mz/f/YNP+/2TT/v9l - 1P7/Z9T+/2rV/v9s1v7/b9b+/3LV/P92ze7/fM/u/3XZ//+CzOf/jdTs/3zY/P982f7/fdv//3nR8/9+ - 2///ftr+/37a/v992v7/fNr+/3vZ/v972f7/edn+/3jY/v9rxOf/MFdmYxlPY75Cz///Qsr+/0PL/v9E - y/7/Rcv+/0fM/v9HzP7/Ss3+/0vO/v9Nzv7/T87+/1HO/v9Ozf7/meP4/4HY9f9c0Pv/cNb7/5jo//9o - w+b/Y9T//2bU/v9p1P7/a9X+/27V/v9w1v7/c9f+/3HP9P+G3fr/mef//3vZ/v92yeb/lef+/4Ha/f+A - 2v7/gdv+/4Lb/v+C2/7/gtv+/4Lb/v+C2/7/gdv+/4Da/v9/2v7/fdr+/3zZ/v9zzO//M1tqehxYb8xD - z///Q8v+/0PL/v9Fy/7/Rsv+/0fM/v9JzP7/Ss3+/03N/v9Ozv7/UM7//1HP//9Nyvv/n+j9/3nT8v9b - z/v/eNb4/33V+f9cveX/Z9X//2nV/v9s1f7/btb+/3DX/v901/7/dtj+/3LP9P91z/P/gtf5/4be//9z - xeT/lef//4HW+P+G3f//h93//4fd/v+H3f7/iN3+/4fd/v+H3P7/htz+/4Xc/v+E3P7/gtv+/4Hb/v95 - 0fP/Nl1thB1ZcM1Dz///Q8v+/0TL/v9Fy/7/R8z+/0jM/v9KzP7/TM3+/03N/f9Uzvz/XMny/23O8f9u - y+7/h9v6/3HM8f9dyvT/dM/0/2W/7f9bv+j/atT9/2zU/P9u1f3/ddj+/3jY/f931/z/etf8/3bQ9f9k - ver/a8Xw/4HU9f92x+n/ftj7/4bS7/+J1PH/h9Pw/4jY+P+M3f3/jd7+/4ze/v+M3v7/i93+/4rd/v+I - 3f7/h9z+/4bc/v9+0vT/OF9uhRtUacFE0P//RMv+/0TL/v9Gy/7/R8z+/0nM/v9Lzf7/UMr4/3fT9P+E - 2fb/hdr6/3nU+P9xzfX/ZsTy/2LA7/9guen/VbHm/0mq5f9SruP/T6zh/1Gv4/9XtOT/c9P6/2K54v9U - sOT/Uq3h/1Ot4v9KquT/Tq7m/1y25/9hvu//Y8Hw/2zJ9P900Pf/ftj6/4Xa+P+L2fX/jNXy/5Ph//+R - 4P7/kd/+/5Df/v+O3/7/jN7+/4rd/v+B0PD/Ol5tfBZDVKlE0P//RMv+/0XL/v9HzP7/Scz+/0rN/v9N - zP3/ddDy/3fT9/9wzPT/aMXy/2TA7v9ft+P/XbPg/1Sr3P9Kp93/QKLh/zec3/8zmN3/L5fd/y6W3f84 - m9z/c9L4/0yn2P8tlt7/L5bc/zGX3P82m97/O57g/0al3/9Pqdr/W7Lf/2C14f9hu+n/ZsTx/2zK8/9y - 0Pb/h9n3/5DX8/+X4f//l+D+/5Xg/v+U4P7/kd/+/4/f/v+CzOn/PF5saBI3RINCx/n/RMv+/0bL/v9I - zP7/Sc3+/0vN/v9Ry/r/dcnv/2G/7/9auez/VrHi/0Og2v8tlN3/JpDb/yeQ2/8okNj/S6Ta/y6W3f8u - l97/QKPf/1i35/9evOj/e9f7/27G7P9euuf/VrLh/y+X3v8ult3/N5rc/ziZ2P8pktv/JI7b/yeR3P84 - mtz/Uard/1e36/9evO7/ZcPx/4zU8v+d4v//nOL//5vh//+Z4P7/l+D+/5Tf/v+BxeD/OVViTBVBUU87 - st//Rcv+/0bM/v9IzP7/Ssz+/0vN/v9hzvj/XLbp/0ys5f9IqOT/MZDO/yCM2v8hjNn/IY3Z/yGN2v8e - jNn/U63g/y2c4/8uoeb/Vbno/3nZ/v982/7/f9v+/4Tc/v+I3v//iN76/zGe3f8un+X/N5/h/zWa3P8h - jdr/IY3Z/yGM2f8gjNr/JYnN/0up4v9IqeX/T7Dn/3nJ8f+k5P7/ouT//6Hj//+e4///nOL//5rh//+E - xN72GSQoNhdEViI2oMn/Rsv+/0fM/v9JzP7/S83+/0vN/v9q0/v/Sabj/zmc3/83m97/S6fi/x6L2f8h - jtr/IY7a/yKQ2/8fjtr/VLfp/y2r7v8wsvD/XcLt/3vZ/v9/2v7/g9v+/4fc/v+L3f7/kOD//zet4/8u - r/D/N63r/zef3/8ikNv/Io/b/yGO2v8fjNr/P6Df/zye3/83m97/O5/h/3PC7v+s5v//qOX//6bk//+k - 5P//ouP//6Dk//99tMzlAAAAHAAAABMzlbvZR8z+/0jM/v9KzP7/S83+/03O/v9Uzv3/UKzl/y6W3f8t - lt7/R6nm/0ak2/8kjtX/H4/c/x+R3v8fjtf/WMr4/zO9+P87w/r/Zsnv/37a/v+C2/7/htz+/4rd/v+O - 3v7/k9/+/0m96/82wPr/O773/zml4v8gkd7/H5Dd/x+M1/83mNb/T63l/y6X3v8uld3/M5ne/5HT9P+y - 6P//r+f//63m//+r5v//p+X//6jp//9QcX7MAAAAAAAAAAAhYXqtSM7//0jM/v9Kzf7/TM3+/07O/v9Q - zv7/Tr7r/z2h3v8voOX/LaXp/zKs7v9LvO7/S7bj/0uz4v9Kr97/S87//0PL//9Mz/7/b8zw/4Hb/v+F - 2/7/id3+/47e/v+S3/7/l+D+/1zG7f9Gzf//Qsr+/0y86v9KseD/TLTj/1G86v87tfH/Lafq/y6h5v81 - oOH/abPb/73s//+46f//tuj//7Po//+x5///ref//6zq//8NERN8AAAAAAAAAAAAAABWRMLx/0nN//9L - zf7/Tc3+/0/O/v9Sz/7/VND//1O75f84tPH/MLb0/zW++f89wfb/SMj4/0rK+P9L0P7/TtL//1fU//9k - 2P7/dc3v/4Tc/v+I3P7/jd7+/5Df/v+V4P7/muH//3DL7f9b1v//UtP//0zR//9LzPn/Scn4/0LD9v84 - v/j/Mrn2/zGz8v9cvOj/vuj8/8Hs//+/7P//vev//7rr//+36v//uO7//3OYqP8AAAAQAAAAAAAAAAAA - AAAAJGR99EzU//9Mzf7/Ts3+/1DO/v9Sz/7/W8ny/zu+9v83wfr/QMn//1G75/89rOf/L6Xn/zGp6f9Z - vun/atz//3Dd//+B4P7/ds3w/4fc/v+L3f7/kN/+/5Tg/v+Z4f//nuL//4HQ7f933v//bNz//2XM8v82 - rOr/LqXn/zWo6P9Ks+b/R8f4/zrE+/81v/n/bcjs/8rt///G7f//w+3//8Ls//++6///uev//zM/RqMA - AAAAAAAAAAAAAAAAAAAAAwgKW0K44/9Mzf//Ts7+/1DO/v9Uz/3/V834/0LL//9Iz///Srvl/yWg5/8k - ouf/JqTp/yOl6v9pxOz/heT//47l//+U3vb/e9L1/4jc/v+N3v7/kt/+/5fg/v+c4v//ouP//5LW8P+S - 5f7/iOT//3/W9P8lpuv/Jqbp/yWj6P8joOf/Pqze/0rR//9DzP//Rcv//7zl9v/O7///y+7//8ft///D - 7P//krTC/DU/RiEAAAAAAAAAAAAAAAAAAAAABAoLAyx4lM5MzP3/Ts7+/1HP/v9X0P7/Ztj+/1XU//9c - 1///ctT1/x+i6v8oqez/Kavt/ySr7/+C0u//oer//6vt//+Z1ur/gdn9/4rd/v+Q3v7/leD+/5rh//+f - 4///pOT//5/b9P+p6Pv/pOv//57h9v8nre7/Kazu/yiq7P8kpuv/W8Lv/2HZ//9X1f//T9L//8Lu/v/W - 8f//0vD//87u///M8P//XnJ6qQAAAAISERUAAAAAAAAAAAAAAAAAAAAAAA4mL1BGuub8UM///1HP/v9X - 0P7/ed7+/2/c//933v//j+f//2rF7f8xsO3/LrDu/ySv7/+f3fP/t/D//7/y//+Z0ub/ht3//43e/v+R - 3/7/luD+/5zh//+i5P//p+X//6bd9f+57fv/ufD//77t+f8or+7/LbHv/zGx7v9Etuz/juH7/3vf//9x - 3f//b93//9z1///e8///2fH//9n0//+etcL5AAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ - Q1OsT87+/1LP/v9Vz/7/ZdL7/4HT7/+c7P//nun//6zt//+l4vb/l9rz/4/W8v+97vv/wfP//8P1//+5 - 6/j/jNb1/4PR8v+V4P//mOH//5/j//+c3Pj/otrz/7bn9//C9P7/wvT//8f0//+Q1vL/lNrz/57e9f+u - 6vv/o+v//5vq//+G3Pf/tub3/+34///n9f//4/b//7nM1/8mKS1lAAAAAAMGBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAJWB34FPR//9Vz/7/WND+/1jL+P9wvt7/p+Dx/77y///A8v//wvP//8L0///C - 9v//wvb//8L3///B9///wPj//8L0+v+N1/b/muH//5/i/v+v5/b/wPj//8D3///C9///wvb//8L2///C - 9f//wvP//8Hy//+/8f//tOr5/5bP4//D3ev/9Pr///H6///u+P//4e72/2hvdaEAAAAAFhUZAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAABxMWJDmPr+tY1v//WND+/1zR/v9d1P//Xcz4/5LX8P/L - +v//hM3o/53g9f+/9v7/sOr2/6bn9/+p6ff/q+z4/5/e6v+R3fz/nOL//6Hj//+d3O//rOz2/7Ds9/+1 - 6/f/tOn2/7z0/f++6/b/tt7u/8Dy/P/E8fv/1+nz//r8///9/v//+/3///r8///3/f//iIyR0gAAABIX - FxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAADA4h6X/XNj//1zR/v9g - 0v7/X9L//6Di9//F9Pv/Zsju/4re/P+59///jdTn/3/Z/f+H2/z/jN38/5He+/+W4P7/nOL//6Pj//+n - 5P3/rub9/7Xn/f+86f3/uOb5/6jr9f/D7vf/0ur5/7bp8//I9v7/7vj9//v8///+/f////7///7///91 - d3jiCAUKDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAAAAAAAA - AAAsPI6t61zR/v9g0///XtL//6rm9v+v6PD/bNL6/43g+/+y+f//g8/n/4Hb//+G3P7/jN3+/5Hf/v+X - 4P7/neL//6Pj//+p5v//sOf//7fp//++6///vOj6/6Hq9f+78Pj/4PL//6Hb6P+68/z/7fj8//79//// - ////9vb2/5qZmtEAAAASAAAAAEE/RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAEAAQAAAAAACA8TIixjd9Zez/v/YtT//33Y+P+C1fD/b9b+/4PZ9/+c4/H/gs7p/4Hb//+G - 3P7/jN3+/5Lf/v+X4P7/neL//6Pk//+p5v//sOf//7jp//+/7P//v+n7/6Df7P+x5PD/4fP//7/j8P/Q - 7/f/8/n9///////f3+D/b29vpAAAABAAAAAAQUBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQIAAAAAAAAAAAAcO0idWLzi+2XT/P9r1v//b9b+/3PX/v92 - 2f//fNr//4Hb/v+G3P7/i93+/5Hf/v+W4P7/neL//6Pj//+p5v//sOf//7fp//++7P//xe3//8/v///W - 8f//3vP//+j2///x+f//8/f7/9LT1vQ3Nzd0AAAAABAQEAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGACl0kQAAAAAADBofRj19lr5b - ttn/ct3//3TZ//932P7/fNn+/4Hb/v+G3P7/i93+/5Df/v+W4P7/m+L//6Lj//+o5f//ruf//7Xp//+9 - 6///xO3//8vu///S8P//3fX//+v9//+3wMb/hIiLpgAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAkLDwMEBwk/MF5v3WW/4v942///e9r//4Db/v+F3P7/it7+/5Df/v+V4P7/m+L//6Hj//+n - 5f//reb//7Tp//+66///wez//8nv///R8f//rcPO/0xSV7wlISglAAIAAAAAAAAAAAAAS0lMAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAATEwAAAAAAAAAAAAAAADoyWmqZV5u1y2exzu5vuNb/f8zs/47e/v+X - 5P//nOX//6Lm//+o6f//qOL7/6DS5/+ZwtT/mb3N6IOdqcRIUliIAAAAJQAAAAAAAAAAHRogAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgHiMAAAAAAAAAAAAAAAAAAAAACx8zPBw+ - ZHQwM05aXi5GUIM4Ul2cPlpmpkFbaKU8UVuXOkxVfUdaZVRWanQqISgsGQAAAAcAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//gAH/ - /wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAB/AAD4 - AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAMAAAAAABwAAwAAAAAADAADAAAAAAAMAAIAAAAAA - AQAAgAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA8AAAAAAPAAD4 - AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD+AAAAAH8AAP8AAAAA/wAA/8AAAAP/AAD/4AAAB/8AAP/wAAAf - /wAA//4AAH//AAD//4AB//8AAA== + AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAKCAEAK4EAAAgIAAAAQAgAKgQAADWJAQAMDAAAAEA + IACoJQAAfjUEACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7NVTJ+6pMxvvsQ8P7/EPD+/xJxfvoRMT7nELD+zUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sOV8r7ukLD+/9mz/z/o+L9/7/r/v+/6/7/o+L9/2XO/PxCw/v/Q8P7pkLD+w4AAAAAAAAAAAAA + AABCw/sOVcn730/H+//D7P7//////+z5///K7v7/yu7+/+/6////////w+z+/0zG+/pExPvLQsP7DgAA + AAAAAAAAXcz8wU/H+//j9v7/9Pv//4TY/P9Dw/v/QsP7/0LD+/9Dw/v/iNn8//T7///j9v7/S8b7+ULD + +6UAAAAAYMz8P0LD+//D7P7//v///2zQ/P9Vyfv/ver+//b8///1/P//ver+/1TJ+/9s0Pz//v///8Ps + /v9Cw/v/QsP7NWvQ/MRmz/z///////z+//+L2v3/4/b+///////////////////////i9v7/i9r9//3+ + ////////YMz89ELD+5pTyPv1o+L9////////////v+v+/8bt/v/1/P/////////////7/v//wev+/73q + /v///////////6Pi/f5Dw/vhRcT7/r/r/v//////vOr+/1PI+/9Wyfv/hdj8////////////i9r9/1TJ + +/9Qx/v/t+j9//////+/6/7/Q8P7+0XE+/6/6/7//////3HS/P/Y8/7/5/f+/3HS/P///////////3HS + /P/b9P7/2/T+/2zQ/P//////v+v+/0PD+/tTyPv1o+L9//////+f4f3/T8f7/2DN/P9x0vz///////// + //9x0vz/Xsz8/0/H+/+Z3/3//////6Pi/f9Dw/vhbND8xmbP/P//////gNf8/77q/v/d9P7/cdL8//// + ////////cdL8/9Lx/v/B6/7/eNT8//////9gzfz2QsP7mmfP/EJCw/v/w+z+/9Px/v9Yyvv/Vsn7/5Td + /f///////////5rf/f9TyPv/Vcn7/9Dw/v/D7P7/QsP7/0LD+zUAAAAAYM38xU/H+//j9v7/1/L+/9v0 + /v/6/f/////////////9/v//2PP+/9fy/v/j9v7/TMb7+kLD+6UAAAAAAAAAAELD+w5XyvviT8f7/8Ps + /v/////////////////////////////////D7P7/TMb7+0XE+8xCw/sOAAAAAAAAAAAAAAAAQsP7DlvL + /L5Cw/v/Zs/8/6Pi/f+/6/7/v+v+/6Pi/f9lzvz9QsP7/0TE+6dCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAARsT7N1nK+69Nx/vtRMT7/UPD+/xLxvvqSMX7n0LD+zYAAAAAAAAAAAAAAAAAAAAA+B8AAOAH + AADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAADgBwAA+B8AACgA + AAAAAQAAAAIAAAEAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7EELD+zBCw/tSQsP7akLD+31Cw/uRQsP7pULD+7hCw/vLQsP73kLD++BCw/vvQsP78ELD + +/dCw/v/QsP7/0LD+/9Cw/v/QsP790LD+/BCw/vvQsP74ELD+95Cw/vLQsP7uELD+6VCw/uRQsP7fULD + +2pCw/tSQsP7MELD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+zFCw/tgQsP7jULD + +65Cw/vOQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD+85Cw/uuQsP7jULD+2BCw/sxQsP7CAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7Q0LD+3pCw/upQsP71kLD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vWQsP7qULD + +3pCw/tDQsP7DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD+5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD+1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sIQsP7R0LD+5BCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9lCw/uQQsP7R0LD+wgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD + +21Cw/u0QsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7tELD + +21Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/twQsP7yELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+8hCw/twQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7bULD+8NCw/v+QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/5Cw/vDQsP7bULD+xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+0NCw/upQsP7+ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7qULD+0NCw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD + +3pCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/ulQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7+0LD+6VCw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sBQsP7SULD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7xCw/tJQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AkLD+1hCw/vbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9tCw/tYQsP7AgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sBQsP7UkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9ZCw/tSQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yRCw/uxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7FCw/skAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD + +4tCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD+4pCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD + ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vULD + +yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/t0QsP79kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9r0Pz/gtf8/5fe/f+l4/3/s+f9/8Hr + /v/Q8P7/2/T+/+b3/v/n9/7/7Pn///P7///z+///8/v///P7///s+f//5/f+/+b3/v/b9P7/0PD+/8Hr + /v+z5/3/peP9/5fe/f+C1/z/a9D8/1PI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v2QsP7dELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/vMQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0TE+/9gzfz/g9j8/6Xi/f/G7f7/4PX+//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+P3//+D1/v/G7f7/peL9/4PY/P9gzfz/RMT7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vMQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+3dCw/v6QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1jK + +/+F2Pz/seb9/9rz/v/6/f////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + ///a8/7/seb9/4XY/P9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/t3QsP7AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD+79Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/+O2/3/v+v+/+v5 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+v5//+/6/7/jtv9/1fK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+79Cw/scAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7nULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/d9T8/7bo/f/y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////L7 + //+26P3/d9T8/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7nULD + +wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP7zULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P+y5/3/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////v+v//suf9/27R/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vNQsP7IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Qx/v/ld39/+D1/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4PX+/5Xd/f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/t7QsP7/ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/2zQ/P+86v7/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+v3//7zq/v9s0Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ULD+3tCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/utQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/f9b8/9Tx/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////9Tx + /v9/1vz/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rULD+woAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +/+R3P3/5Pb+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+T2/v+R3P3/R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vjQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/47b + /f/p+P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+n4//+O2/3/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++NCw/suAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/vxQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/iNn8/+f3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+b3/v+I2fz/RMT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ULD + +0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v931Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/I7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////8ju + /v9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/1Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/6vk/f/7/v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+/7//6vk/f9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////v+v+/1LI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz/8fv///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////x+///hdj8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3gAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////++6v7/Tcf7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/o+P////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+j4 + //9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/6Lh/f/9/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////f7//6Lh/f9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/ULD+1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vxQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////v///+35///W8v7/x+3+/7rp/v+t5f3/oeH9/5rf/f+U3f3/lN39/4zb + /f+U3f3/lN39/5fe/f+g4f3/qeT9/7bo/f/D7P7/0/H+/+f3/v/7/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/FCw/suAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vjQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////j9 + ///T8f7/s+f9/5Td/f931Pz/Wsv8/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9u0fz/i9r9/6vk + /f/I7v7/7vr///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////j9//+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP740LD+xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//+76f7/i9r9/2PO + /P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Xyvv/ftb8/6nk/f/Y8/7//f7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Ti/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/utQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/vOr+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r9///K7v7/kdz9/1zL/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/991vz/tuj9/+35//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////vOr+/0bE + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+61Cw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t7QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/0vH+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////6/f//xOz+/4LX/P9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/a9D8/6zl + /f/s+f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///S8f7/T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ewAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9nz/v+Q3P3/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7/3PT/P+86v7/+f3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+D1/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP77ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/5Pf+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////7/v//uOj9/2fP/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+/+W3v3/5/f+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5Pf+/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP77ULD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7zULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//+j4v3/U8j7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/991vz/1fL+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////q+P//Xcv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8/v//6Dh/f9Nx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/900/z/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+/6//9jzfz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///4/f//qOP9/03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/920/z/2/P+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////7/r//13L/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD++5Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+/6/7/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+G2fz/6/n///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////q+P//Wsv8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++5Cw/scAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+H1 + /v9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG+/+n4/3/+/7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+T3 + /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3dCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////+/7//6Hh + /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/U8f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////4PX+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t3AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/v6QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/0vH+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////3fT+/2XO + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5be/f/5/f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////S8f7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD + +zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/vNQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/vOr+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////+////qeT9/0bE + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/X8z8/9vz + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7zq/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t0QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////w+v//d9T8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9GxPv/q+T9//7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////pOL9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP79kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////Y8/7/V8r7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+A1/z/9vz///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v2QsP7IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+66f7/R8X7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2LN/P/k9/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//2bP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7YELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+b3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7/8ru/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/T8f7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD + ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8vv/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////z+//+I2fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/tuj9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////8vv + /v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++lCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Lh/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//961fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/9ay/z/btH8/4DX + /P+L2v3/mN79/6Dh/f+g4f3/qOP9/6Dh/f+g4f3/nN/9/4/b/f+C1/z/dNP8/1/M/P9Jxfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4f3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////ouH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yRCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/9/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////T7//9u0fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/4LX/P+o4/3/ye7+/+f3/v/9/v////////// + /////////////////////////////////////////////////////////////////////////////+/6 + ///R8P7/s+f9/47b/f9pz/z/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Hc + /f/+//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////3+//9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/skAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/uyQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//o+P////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////T7//9q0Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Vsn7/47b/f/A6/7/7fn///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////j9///Q8P7/n+H9/2nP/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/j9v9//7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6Pj//03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7sgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//9y0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/1rL/P+a3/3/2fP+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////7vr//7Ln/f9z0/z/Q8P7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+P2/3//v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sBQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////v+//900/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Hxfv/iNn8/9Hw/v/+//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+v5 + //+l4/3/W8v8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4XY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7z0LD+wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7U0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/8fv///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+E2Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH + +/+k4v3/7/r///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7////G7f7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/n+D9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////x+///Usj7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+Z3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7/6bj + /f/2/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////Q8P7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+1hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+56f7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Ixfv/oOH9//b8 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Q8P7/bND8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8nu/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////e9X8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/vcQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+r4//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////Y8/7/R8X7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz/5/f+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+56f7/Usj7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+r4 + //9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6vk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////y+///V8r7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ+//J7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////X8 + //+U3f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1/M + /P/1/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////q+T9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sBQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/7/v////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////f9b8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////8/w/v9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP71ELD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7SkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//I7v7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////uen+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/7zq/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9fz//4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////yO7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////8fv//07H + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////s+f9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7//H7//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////57g + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//T7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////X8v7/Vsn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+e4P3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4fX+/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/ulQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////7/ + //9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//v+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9kzvz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//7///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///h9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//7///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////9Pv//3LS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//i9v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7ekLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////xe3+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///7/v//e9X8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+O2/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +//p+P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7jo/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////6fj//0fF + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+91Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+R3P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////H7f7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/i9r9//7///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//3LS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//K7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/5Pf+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5Pb+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//3+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////1/P//Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4/b+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5Pf+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7+ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/f9b8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7///9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8//P7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+v5//9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//7/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9/1vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7FAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/9Tx/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////mN79/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/970/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////1fL+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+8NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/23R/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+z5//9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+p5P3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0vG + +//s+f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vDAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/v+QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////s+f9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT/P/+//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v///3TT + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+y5/3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////vOr+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/kLD + +xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/twQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+W3v3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///y+///Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+W3v3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r9//9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7yELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/ld39//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////6rk + /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3rV/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +/+q5P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ld39/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////4fX+/4HX/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zc78/8Dr/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////8Dr/v9mzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7/4HX + /P/h9f7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////8vv//8Dr/v+i4f3/lN39/5/g/f+56f7/4fX+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+H2/v+36P3/oOH9/5Td/f+h4f3/wOv+//L7 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/u0QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+y5/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////7Ln + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sIQsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///v+v//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/d9T8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3fU/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+5BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7bo/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uQAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+//y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////8vv//0XE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP72QAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sbAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7V0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qeT9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+5JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////971/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vNAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/ELD+wwAAAAAAAAAAAAAAAAAAAAAQsP7Q0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+/6/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tDAAAAAAAAAAAAAAAAAAAAAELD+3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7////+//////////////////////////////////////////// + //////////////////////////////////////////////z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////v+//////////////////////////////////////////////// + ////////////////////////////////////////+/7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////6/n//0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK + +/////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/2rQ/P9ExPv/RMT7/2nP/P+/6/7///////////////////////// + ///////////////////////////////////k9/7/hNj8/0zG+/9Cw/v/V8r7/5nf/f/1/P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////R8P7/dNP8/0bE+/9Cw/v/YM38/63l/f/9/v////////////////////////// + /////////////////////////////+/6//+R3P3/Ucj7/0LD+/9Px/v/i9r9/+z5//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAQsP71kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+F2Pz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////neD9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5je/f////////////// + ///////////////////////////////////W8v7/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YM38//L7 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+26P3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ftb8//3+//////////////// + /////////////////////////////+j4//9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9TyPv/4vb+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////hdj8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vWAAAAAAAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////ze/+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/yu7+//// + ///////////////////////////////////7/v//Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+F2Pz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////l9/7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+t5f3///////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2nP + /P/+//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAELD+zFCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/9rz/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV + /P//////////////////////////////////////xOz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7//H7//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////nN/9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8//// + ///////////////////////////////////i9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/2PP+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////a8/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sxAAAAAAAAAABCw/tgQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0TE+//6/f////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9cy/z//////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//U8f7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3rV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//7/v//////////////////////////////////v+v+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/7bo/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+v3//0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAQsP7jULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9hzfz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD + +65Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////g9j8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uuAAAAAAAA + AABCw/vPQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7zwAA + AAAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////G7f7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/AAAAAAQsP7EELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////4PX+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7EELD+zBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+zBCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////3+///k9v7/U8j7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/6Dh + /f9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8/6Dh/f+g4f3/oOH9/6Dh + /f+m4/3/y+/+//z+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+v5//+15/3/oeH9/6Dh/f+g4f3/oOH9/6Dh/f9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/33W + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+W3v3/8/v///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////U8j7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tSQsP7akLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Y8/7/neD9/27R/P9Hxfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9dy/z/0vH+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//5be/f9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Xyvv/hdj8/7fo + /f/y+/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////2vQ + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7akLD+31Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9Pv//6nk/f9cy/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//Q8P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////v///33W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RcT7/33W/P/R8P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+D2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+31Cw/uSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//quT9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//n9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/a8/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uSQsP7pULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+l4/3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////d9P7/ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5zf/f/7/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////6Xj/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7pULD+7hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/s+f9//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////A6/7/ScX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////6/f//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cNL8//H7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7hCw/vLQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP73kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//Q8P7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////B6/7/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO + /P/3/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73kLD++BCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/2/T+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////f9f7/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////b9P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++BCw/vvQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/+f3/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////9/v//ac/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP78ELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//n9/7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////seb9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//b8//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/7fn///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+P3//1TJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+m4/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////s+f//QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Vcn7//z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////8/v//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P+Z3/3/x+3+/+j4 + ///3/P////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////3+///v+v//3vX+/7Ln/f9+1vz/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//H7f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////P7//9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////u+v//Q8P7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/7bo/f/+//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+n4//+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/itr9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////z+///QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////uen+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/XMv8/+f3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6rk/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ+/////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////8/v//0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//t+f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////5Hc/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+X3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////lt79/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/6fj///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+35 + //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/5/f+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9t0fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////n9 + //9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/BCw/vvQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+f3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////Vcn7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+//4/f////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+t5f3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP74ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//b9P7///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v///0PD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+C1/z///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/md/9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9v0/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP74ELD+95Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////P7 + //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qOP9//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////Q8P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+95Cw/vLQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///v+v//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7np + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////2DN/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP7uELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+z5/3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8/v//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//A6/7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7Pn/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7uELD+6VCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/peP9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5nf/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+l4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6VCw/uTQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5fe/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5nf/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+f3//0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+o4/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uTQsP7fULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+D2Pz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3DS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9mz/z///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////8zv/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4PY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7fULD + +2pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/a9D8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9jz/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+r4//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9r0Pz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +2pCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////wuz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9v0fz//f7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////T8f7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13L/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////U8j7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tSQsP7MELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/+P3///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////b8//9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//Vcn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+X3v3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7MELD+xBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////gtf8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//X8//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Q8P7/Vcn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2vP+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+xAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9jz/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Uyfv/p+P9/+f3 + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+f3//83v/v9+1vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cdL8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////G7f7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/AAAAAAAAAAAELD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////dtP8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/V8r7/3fU/P+F2Pz/k939/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td + /f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/1bJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/etX8/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td + /f+U3f3/lN39/5Td/f+U3f3/lN39/43b/f+A1/z/bND8/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/87v/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////peL9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vPAAAAAAAAAABCw/uuQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4PY/P////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+T3 + /v9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////4PY + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rgAAAAAAAAAAQsP7jULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9hzfz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////qOP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+//v+v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD+2BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7//r9 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7///+C1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF+//T8f7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/f//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tgAAAAAAAAAABCw/syQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//a8/7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//F7f7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////2vP+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//i9r9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+//Q8P7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAAAAAABCw/vWQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4XY/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+46P3/Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3PT/P/q+P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9YAAAAAAAAAAAAAAAAAAAAAQsP7qULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9ay/z///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////2/T+/1vL/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+U3f3/+/7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAELD + +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////xe3+/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS + /P/0+/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6/n//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAA + AABCw/tDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////x+3+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/atD8//f8//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0MAAAAAAAAAAAAA + AAAAAAAAQsP7DELD+/xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////3PT+/0nF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+A1/z//v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+O2/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/sMAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//13M/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/67l/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7kkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3vX+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////5zg/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////3vX+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7kgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1dCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6nk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+z5//9Ixfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/etX8/7Pn + /f/b9P7/9/z///////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + ///////////////////+////7vr//8nu/v+c4P3/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////6nk/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+a3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9x0vz/4vb+//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////z+//+z5/3/S8b7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/7fn///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+9lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7//L7 + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////+////Usj7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////930/v9RyPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6rk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////y+///RcT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/uQQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+26P3///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////0vH+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz//P7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////zu/+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////tuj9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/d9T8//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////57g + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1/L+//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//X8 + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3fU/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/v2QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0XE+//v+v////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //951Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Y878//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//R8P7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9FxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/ZCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7tELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/suf9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Td + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////j9//9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/sOb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/u0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+o4/3///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////Usj7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6Ti/f////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/seQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/tuj9//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////1zL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+X3v3///////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////4PX+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+8hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5be/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6jj/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////5be + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/twQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+U3f3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////4/f//Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD+/5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Y878//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+86v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////btH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Y8/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4HX/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xe3+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Tx + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/bND8//z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+b3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xRCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9/1vz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////970/v9RyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/sUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7qULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7/+T3/v////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/j9v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////P7//7Pn/f9Lxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+E2Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+T3/v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+R3P3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9pz/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/3vV + /P+z5/3/3fT+//j9//////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + /////////////////////////v///+76///K7v7/nOD9/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP73ULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/+n4//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////sOb9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/ScX7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7//r9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////p+P//R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////b8 + //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////jtv9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3oAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//z+/////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+6VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//9jzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+46P3///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/ulAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7/+H1/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////3PT+/0jF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz//v////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+H1/v9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+96v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/9fz///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tKQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8ju + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7Pn///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////I7v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+9RCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9ezPz/+/7///////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ver+/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lN39//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////5/f//QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz/7/r///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9RCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6zl/f////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////c9P7/YM38/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////2TO/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/+Z3/3/+/7///// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7BELD+9xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////v+ + //+m4/3/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ + +//3/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2zQ/P/Y8/7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vcQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tYQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//+i4v3/WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD + +//I7v7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////f7//3XT + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/edT8/8zv/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD + +9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7////Q8P7/l979/2TO/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ + +//J7v7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///4/f//itr9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/3rV/P+x5v3/6/n///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1LI+//y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9/z//1bJ+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/a9D8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4DX/P+U3f3/lN39/5Td/f+U3f3/m9/9/7/r + /v/4/f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////h9v7/qeT9/5Xd/f+U3f3/lN39/5Td/f+U3f3/Vsn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4/b/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f910/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////L7//9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AULD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/htn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////Wcr7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////// + //+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/+j4 + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////1nK + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+/////////////////////////////// + ////////oOH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// + //+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/uyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz//f7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv///////////////////////// + /////////////6Dh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////// + ////////uOj9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////9/v//btH8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6Li/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////// + //////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////// + /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ouL9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP76ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Dw/v/y+/+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////2DM/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P////////////// + ////////////////////////peP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Xy + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7//z+//////////////// + ///////////////////B6/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/uOj9//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////y+/+/0PD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2BCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//n9/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+B1/z///////// + /////////////////////////////8ru/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +//1/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////6Lh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO/P////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/970 + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0/H+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Z8/8//n9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////2PP+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1PH+//// + ///////////////////////////////////9/v//Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+Q3P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////s+f//Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+56f7///////// + //////////////////////////////////991vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT + /P////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//2fP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yNCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+u5f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/q+T9//// + /////////////////////////////////////////////+H2/v9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/+P3///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////8ft/v9Ixfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+R3P3///////// + ////////////////////////////////////////8fv//2PO/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M + /P/s+f////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4jZ/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7dELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////9Tx/v9/1vz/Vsn7/1bJ+/991vz/0vH+//// + ////////////////////////////////////////////////////////8Pr//5nf/f9gzfz/Usj7/2rQ + /P+t5f3/+/7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4fb+/4jZ/P9ay/z/U8j7/3TT/P/B6/7///////// + ///////////////////////////////////////////////////3/P//peL9/2bO/P9SyPv/ZM78/6Dh + /f/1/P////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/vMQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ver+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////73q/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7MELD+/pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +//S8f7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Lx/v9GxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t3QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/T8f7/+H1/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v9Px/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+T3/v9Wyfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP77kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P/q+P////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9ay/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1RCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcz8/+/6//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9dzPz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9jzfz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +whCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P/q+P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9dzPz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sIAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7IELD++1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wsv8/+T3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+T3/v9ay/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Wyfv/4fX+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v9Wyfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0/H+//S8f7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Lx/v9Px/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t7AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7rULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/73q/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////73q/v9GxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7AQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD++NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz/+f3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//4jZ/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP78ULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2fP/P/n9/7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/2fP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7LgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7VULD+/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/ouL9//3+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////9/v//ouL9/0PD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7VQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tlQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9u0fz/6Pj///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//btH8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ZQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////++6v7/Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7eELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4bZ/P/y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////L7//+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t4QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7/7/r/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7/r/v9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7dULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Mxvv/rOX9//v+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//rOX9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tlQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9ezPz/ye7+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////J7v7/Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7ZQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+H1/v931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7QULD+/FCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/+I2fz/5/f+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/4jZ/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7QQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP740LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/+O2/3/6fj///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////p+P//jtv9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7LgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0jF + +/+R3P3/5ff+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+X3/v+R3P3/SMX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CkLD+61Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0PD+/9/1vz/1PH+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////1PH+/3/W/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7e0LD + +/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz/ver+//r9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + //+96v7/bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/t7QsP7AQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/lt79/+D1/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////4PX+/5be + /f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+yBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/btH8/7Ln + /f/v+v////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//+y5/3/btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7CULD+51Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RcT7/3fU/P+26P3/8vv///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////y+///tuj9/3fU/P9FxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+51Cw/sJAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP7v0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7/47b/f+/6/7/7Pn///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////7Pn//7/r/v+O2/3/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/t4QsP7+kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9ay/z/hdj8/7Hm/f/b8/7/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/f//2/P+/7Hm/f+F2Pz/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7eELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +zBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/9hzfz/g9j8/6Xj/f/G7f7/4PX+//j9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//+D1/v/G7f7/peP9/4PY + /P9hzfz/RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7BELD+3RCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/U8j7/2vQ + /P+D2Pz/l979/6Xj/f+z5/3/wev+/9Hw/v/b9P7/5/f+/+f3/v/t+f//8/v///T7///0+///8/v//+35 + ///n9/7/5/f+/9v0/v/R8P7/wev+/7Pn/f+l4/3/l979/4PY/P9r0Pz/U8j7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/t0QsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7I0LD+71Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP7i0LD+/pCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7i0LD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7skLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/uyQsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wFCw/tTQsP71kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP71kLD+1NCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/tYQsP73ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vcQsP7WELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/tKQsP7vELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vELD + +0pCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sxQsP7pULD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/ulQsP7MQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+3pCw/sYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7Q0LD+6pCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/uqQsP7Q0LD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7FELD+21Cw/vDQsP7/kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7w0LD+21Cw/sUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +xpCw/txQsP7yELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8hCw/txQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/seQsP7bkLD+7VCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/ZCw/u1QsP7bkLD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+0dCw/uQQsP72ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vZQsP7kELD+0dCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD + +5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD + +1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wxCw/tDQsP7ekLD+6lCw/vWQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+9ZCw/upQsP7ekLD+0NCw/sMAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/syQsP7YELD+41Cw/uuQsP70ELD + +/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/BCw/vQQsP7rkLD+41Cw/tgQsP7MkLD+wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7EELD+zFCw/tSQsP7akLD+31Cw/uTQsP7pkLD+7hCw/vLQsP73kLD++BCw/vwQsP78ELD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/vwQsP74ELD+95Cw/vLQsP7uELD+6ZCw/uTQsP7fULD + +2pCw/tSQsP7MULD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////4AAAf + ////////////////////////////////////8AAAAAAP//////////////////////////////////4A + AAAAAAB/////////////////////////////////wAAAAAAAAAP///////////////////////////// + //wAAAAAAAAAAD//////////////////////////////4AAAAAAAAAAAB/////////////////////// + //////8AAAAAAAAAAAAA////////////////////////////+AAAAAAAAAAAAAAf//////////////// + ///////////AAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAAP////////// + ///////////////4AAAAAAAAAAAAAAAAH////////////////////////+AAAAAAAAAAAAAAAAAH//// + ////////////////////gAAAAAAAAAAAAAAAAAH///////////////////////4AAAAAAAAAAAAAAAAA + AH//////////////////////+AAAAAAAAAAAAAAAAAAAH//////////////////////gAAAAAAAAAAAA + AAAAAAAH/////////////////////4AAAAAAAAAAAAAAAAAAAAH////////////////////+AAAAAAAA + AAAAAAAAAAAAAH////////////////////wAAAAAAAAAAAAAAAAAAAAAP///////////////////8AAA + AAAAAAAAAAAAAAAAAAAP///////////////////gAAAAAAAAAAAAAAAAAAAAAAf///////////////// + /4AAAAAAAAAAAAAAAAAAAAAAAf//////////////////AAAAAAAAAAAAAAAAAAAAAAAA//////////// + //////wAAAAAAAAAAAAAAAAAAAAAAAA/////////////////+AAAAAAAAAAAAAAAAAAAAAAAAB////// + ///////////gAAAAAAAAAAAAAAAAAAAAAAAAB////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAD + ////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH///////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////4AAAAAAAAAAAAAAAA + AAAAAAAAAAAf//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////4AAAAAAAAAAA + AAAAAAAAAAAAAAAAB//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////4AAAAAA + AAAAAAAAAAAAAAAAAAAAAAH/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////4A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAf////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////// + ///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/// + ////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAP//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////////AAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAD/////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////////gAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////gAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAB////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////gAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/ + //////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAP//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////gAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAB//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAA/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////4AAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + P////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAB////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//4AAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + Af//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAD///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///+AAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////wAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAf////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAP/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////+AAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////wAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAD///////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////+AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/ + ///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAH////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAH/////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////AAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAD/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////wAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAD///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////////AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////// + ///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAA + Af/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAf/////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////4AAAAAAAAAAAAAAAA + AAAAAAAAAAAf//////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH////////////////AAAAA + AAAAAAAAAAAAAAAAAAAAA////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAH//////////////// + +AAAAAAAAAAAAAAAAAAAAAAAAB/////////////////8AAAAAAAAAAAAAAAAAAAAAAAAP/////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAD//////////////////4AAAAAAAAAAAAAAAAAAAAAAAf////// + ////////////4AAAAAAAAAAAAAAAAAAAAAAH///////////////////wAAAAAAAAAAAAAAAAAAAAAA// + //////////////////wAAAAAAAAAAAAAAAAAAAAAP////////////////////gAAAAAAAAAAAAAAAAAA + AAB/////////////////////gAAAAAAAAAAAAAAAAAAAAf/////////////////////gAAAAAAAAAAAA + AAAAAAAH//////////////////////gAAAAAAAAAAAAAAAAAAB///////////////////////gAAAAAA + AAAAAAAAAAAAf///////////////////////gAAAAAAAAAAAAAAAAAH////////////////////////g + AAAAAAAAAAAAAAAAB/////////////////////////gAAAAAAAAAAAAAAAAf//////////////////// + /////wAAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAD//////////////// + ///////////4AAAAAAAAAAAAAB////////////////////////////8AAAAAAAAAAAAA//////////// + /////////////////+AAAAAAAAAAAAf//////////////////////////////AAAAAAAAAAAP/////// + ////////////////////////wAAAAAAAAAP////////////////////////////////+AAAAAAAAf/// + ///////////////////////////////wAAAAAA/////////////////////////////////////4AAAf + //////////////////8oAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xNCw/tiQsP7pELD+9JCw/vzQsP7/0LD + +/9Cw/vzQsP70kLD+6RCw/tiQsP7EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytCw/unQ8P7+kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7p0LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+w1Dw/uWQ8P7/kLD+/9Cw/v/QsP7/0bE + +/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ/P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srR8X74ULD+/9Cw/v/QsP7/3XT + /P/A6/7/+P3///////////////////////////////////j9///A6/7/ddP8/0LD+/9Cw/v/QsP7/0LD + +9tCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7N0bE+/RCw/v/QsP7/2PO + /P/S8f7/////////////////////////////////////////////////////////////////0vH+/2PO + /P9Cw/v/QsP7/0LD++9Cw/s3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytGxPv1QsP7/0LD + +/+O2/3/+v3///////////////////j9///K7v7/peP9/5Td/f+W3v3/p+P9/87v/v/6/f////////// + ////////+v3//47b/f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sNS8b75kLD + +/9Cw/v/n+D9//////////////////P7//+X3v3/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H + +/+d4P3/9vz//////////////////5/g/f9Cw/v/QsP7/0LD+9tCw/sNAAAAAAAAAAAAAAAAAAAAAFDH + +6FCw/v/QsP7/47b/f/////////////////V8v7/Vcn7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Yyvv/2vP+/////////////////47b/f9Cw/v/QsP7/0LD+5UAAAAAAAAAAAAA + AABCw/srQ8P7/kLD+/9jzvz/+v3/////////////1PH+/0nF+/9Cw/v/QsP7/2LN/P+05/3/6Pj///7/ + ///8/v//5Pf+/6/m/f9dzPz/QsP7/0LD+/9Kxvv/2PP+////////////+v3//2PO/P9Cw/v/QsP7/ULD + +ysAAAAAAAAAAFXJ+7lCw/v/QsP7/9Lx/v////////////z+//9Xyvv/QsP7/0LD+/+f4P3//P7///// + //////////////////////////////v+//+Z3/3/QsP7/0LD+/9Xyvv//P7/////////////0vH+/0LD + +/9Cw/v/QsP7pwAAAABCw/sTRcT7/ULD+/910/z/////////////////+v3//0/H+/9Cw/v/nuD9//// + //////////////////////////////////////////////////+c4P3/QsP7/0/H+//7/v////////// + ////////ddP8/0LD+/9Cw/v5QsP7E0/H+2lCw/v/QsP7/8Dr/v//////////////////////5ff+/83v + /v/+//////////////////////////////////////////////////////////7////N7/7/5ff+//// + ///////////////////A6/7/QsP7/0LD+/9Cw/tiXMv8vkLD+/9GxPv/+P3///////////////////// + ////////7fn////////v+v/////////////////////////////////////////////v+v///////+76 + ///+//////////////////////////j9//9GxPv/QsP7/0LD+6RUyfvoQsP7/2rQ/P////////////// + /////////////9Xy/v9GxPv/9fz//0PD+//h9v7/////////////////////////////////7Pn//0LD + +//k9/7/Usj7/8ft/v///////////////////////////2rQ/P9Cw/v/QsP70kjF+/tCw/v/h9n8//// + ///////////////////V8v7/fdb8/0LD+/951Pz/QsP7/3HS/P/T8f7//////////////////////9v0 + /v910/z/QsP7/3HS/P9FxPv/d9T8/9Dw/v//////////////////////h9n8/0LD+/9Cw/vzQsP7/0LD + +/+U3f3/////////////////3vX+/0bE+/9Cw/v/Vcn7/1nK+/9TyPv/QsP7/6Dh/f////////////// + ////////rOX9/0LD+/9SyPv/Wcr7/1XJ+/9Cw/v/Q8P7/9Px/v////////////////+U3f3/QsP7/0LD + +/9Cw/v/QsP7/5Td/f////////////////+l4/3/QsP7/7Tn/f///////////9Dw/v9Cw/v/oOH9//// + //////////////////+s5f3/QsP7/8Ts/v///////////8Dr/v9Cw/v/md/9/////////////////5Td + /f9Cw/v/QsP7/0jF+/tCw/v/h9n8/////////////////6fj/f9Cw/v/vOr+////////////0PD+/0LD + +/+g4f3//////////////////////6zl/f9Cw/v/xOz+////////////x+3+/0LD+/+Z3/3///////// + ////////h9n8/0LD+/9Cw/vzVcn76ULD+/9q0Pz/////////////////7Pn//1TJ+/9Dw/v/WMr7/1nK + +/9TyPv/QsP7/6Dh/f//////////////////////rOX9/0LD+/9SyPv/Wcr7/1nK+/9Dw/v/T8f7/+T3 + /v////////////////9q0Pz/QsP7/0LD+9JezPzBQsP7/0bE+//4/f/////////////z+///Wcr7/0TE + +/9s0Pz/cdL8/2XO/P9Cw/v/oOH9//////////////////////+s5f3/QsP7/2LN/P9x0vz/bND8/0fF + +/9SyPv/7Pn/////////////+P3//0bE+/9Cw/v/QsP7pFTJ+2xCw/v/QsP7/8Dr/v///////////73q + /v9Cw/v/reX9////////////0PD+/0LD+/+g4f3//////////////////////6zl/f9Cw/v/xOz+//// + ////////uun+/0LD+/+v5v3////////////A6/7/QsP7/0LD+/9Cw/tiQsP7E0XE+/1Cw/v/ddP8//// + ////////xOz+/0LD+/+C1/z/4vb+/+f3/v++6v7/QsP7/6Dh/f//////////////////////rOX9/0LD + +/+z5/3/5/f+/+P2/v+M2/3/QsP7/7np/v///////////3XT/P9Cw/v/QsP7+ULD+xMAAAAAWcr7vkLD + +/9Cw/v/0vH+///////4/f//ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////// + //+u5f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/9Pv////////S8f7/QsP7/0LD+/9Cw/unAAAAAAAA + AABCw/srQ8P7/0LD+/9jzvz/+v3////////4/f//peL9/0LD+/+a3/3/QsP7/5Hc/f/o+P////////// + /////////////+76//+X3v3/QsP7/47b/f9Hxfv/m9/9//b8////////+v3//2PO/P9Cw/v/QsP7/ULD + +ysAAAAAAAAAAAAAAABWyfunQsP7/0LD+/+O2/3////////////n9/7/f9b8//r9//961fz/7/r///// + //////////////////////////////b8//961fz/8vv//4fZ/P/e9f7///////////+O2/3/QsP7/0LD + +/9Cw/uVAAAAAAAAAAAAAAAAAAAAAELD+w1Nx/vpQsP7/0LD+/+f4P3///////////////////////// + ////////////////////////////////////////////////////////////////////////n+D9/0LD + +/9Cw/v/QsP720LD+w0AAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytIxfv3QsP7/0LD+/+O2/3/+v3///// + ////////////////////////////////////////////////////////////////////////+v3//47b + /f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zdHxfv2QsP7/0LD + +/9jzvz/0vH+/////////////////////////////////////////////////////////////////9Lx + /v9jzvz/QsP7/0LD+/9Cw/vvQsP7NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +ytKxvvlQsP7/0LD+/9Cw/v/dtP8/8Dr/v/4/f//////////////////////////////////+P3//8Dr + /v920/z/QsP7/0LD+/9Cw/v/QsP720LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+w1IxfuaQ8P7/kLD+/9Cw/v/QsP7/0bE+/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ + /P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srRcT7qkPD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ULD+6dCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7E0LD+2JCw/ukQ8P71EPD + +/VCw/v/QsP7/0LD+/NCw/vSQsP7pELD+2JCw/sTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP/wD///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABgAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gA + AB/8AAA//gAAf/+AAf//8A//KAAAADAAAABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD+/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD + +yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7GELD+3ZCw/vSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vSQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sIQsP7gELD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG + +/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD + +4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y1Cw/vXQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td + /f/E7P7/6vj//////////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/33W + /P/Q8P7//v////////////////////////////////////////////////////////////////////7/ + ///Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// + /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD + +/9Cw/v/R8X7/7Hm/f/+//////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkLD + +/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////7////S8f7/oOH9/3zV + /P9mzvz/Wcr7/1rL/P9pz/z/gNf8/6Xj/f/Z8/7//////////////////////////////////////9vz + /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/stQ8P7+ULD+/9Cw/v/QsP7/1zL/P/p+P/////////////////////////////4/f//quT9/1jK + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8/7Ln/f/7/v////////// + ///////////////////p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+whGxPvbQsP7/0LD+/9Cw/v/Vsn7/+n4/////////////////////////////8/w + /v9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9izfz/1/L+////////////////////////////6fj//1bJ+/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4BCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// + ////////p+P9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/SMX7/0zG+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/7Dm/f///////////////////////////9vz/v9Hxfv/QsP7/0LD + +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////// + //////////////////+c3/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9cy/z/pOL9/9by/v/3/P////////// + ///3/P//0PD+/53g/f9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4v3///////////////////////// + //+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD+x8AAAAAAAAAAAAAAAAAAAAAR8X7nELD+/9Cw/v/QsP7/27R + /P/+/////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/Ucj7/7np/v/+//////////// + ///////////////////////////////////7/v//sOb9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/uen+//// + ///////////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAAAABCw/sYQ8P7/ELD + +/9Cw/v/QsP7/9rz/v//////////////////////+/7//07H+/9Cw/v/QsP7/0LD+/9lzvz/6vj///// + /////////////////////////////////////////////////////////////+X3/v9gzPz/QsP7/0LD + +/9Cw/v/Tsf7//v+////////////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAA + AABDw/t3QsP7/0LD+/9Cw/v/fdb8////////////////////////////+P3//0bE+/9Cw/v/QsP7/1zL + /P/v+v////////////////////////////////////////////////////////////////////////// + ///v+v//Wsv8/0LD+/9Cw/v/RsT7//j9/////////////////////////////33W/P9Cw/v/QsP7/0LD + +/9Cw/t2AAAAAAAAAABMxvvdQsP7/0LD+/9Cw/v/0PD+/////////////////////////////////63l + /f9Lxvv/Yc38/9/1/v////////////////////////////////////////////////////////////// + ////////////////////////3/X+/2HN/P9Lxvv/reX9/////////////////////////////////9Dw + /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAELD+yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7///9Zyvv/QsP7/0LD+/9Cw/v/QsP7IELD+2BCw/v/QsP7/0LD+/+U3f3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YE/H+6RCw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////+s5f3/md/9///////N7/7/gtf8//X8 + ////////////////////////////////////////////////////////+/7//4ra/f/A6/7//////6jj + /f+c4P3////////////////////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mVLI + +9FCw/v/QsP7/0LD+//q+P////////////////////////////////////////////9Zyvv/QsP7//// + //+J2v3/QsP7/9Dw/v//////////////////////////////////////////////////////3vT+/0LD + +/9z0/z//////0/H+/9Dw/v////////////////////////////////////////////q+P//QsP7/0LD + +/9Cw/v/QsP7wEvG+/FCw/v/QsP7/0rG+///////////////////////////////////////9fz//7np + /v9Nx/v/QsP7/5Td/f9gzfz/QsP7/4DX/P+t5f3//v////////////////////////////////////// + //+36P3/hdj8/0LD+/9Wyfv/lN39/0bE+/9Cw/v/s+f9//H7//////////////////////////////// + ////////Ssb7/0LD+/9Cw/v/QsP75kbE+/pCw/v/QsP7/1vL/P////////////////////////////// + ///Y8/7/VMn7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3/X+//////////////////// + /////////////+76//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//P8P7///////// + ////////////////////////W8v8/0LD+/9Cw/v/QsP79ELD+/9Cw/v/QsP7/2XO/P////////////// + //////////////7///9dy/z/QsP7/0LD+/9Nx/v/ZM78/2XO/P9lzvz/V8r7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/1XJ+/9lzvz/Zc78/2XO/P9Px/v/QsP7/0LD + +/9RyPv/9/z/////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO + /P///////////////////////////9vz/v9Cw/v/QsP7/4DX/P/7/v//////////////////uOj9/0LD + +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl/f////////////// + ///+////kdz9/0LD+/9Cw/v/yO7+////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0bE + +/pCw/v/QsP7/1vL/P///////////////////////////8vv/v9Cw/v/QsP7/8Hr/v////////////// + ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl + /f//////////////////////1fL+/0LD+/9Cw/v/uen+////////////////////////////W8v8/0LD + +/9Cw/v/QsP79EvG+/FCw/v/QsP7/0rG+////////////////////////////+X3/v9Cw/v/QsP7/4va + /f/+////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 + /v9Cw/v/QsP7/6zl/f//////////////////////nOD9/0LD+/9Cw/v/0/H+//////////////////// + ////////Ssb7/0LD+/9Cw/v/QsP75lPI+9NCw/v/QsP7/0LD+//q+P////////////////////////// + //971fz/QsP7/0LD+/9Yyvv/cdL8/3HS/P9x0vz/X8z8/0LD+/9Cw/v/2/T+//////////////////// + /////////////+f3/v9Cw/v/QsP7/1zL/P9x0vz/cdL8/3HS/P9dy/z/QsP7/0LD+/9pz/z//v////// + ///////////////////q+P//QsP7/0LD+/9Cw/v/QsP7wFPI+6hCw/v/QsP7/0LD+//E7P7///////// + ///////////////////w+v//T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +//m9/7////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mUTE+2FCw/v/QsP7/0LD + +/+U3f3///////////////////////////+R3P3/QsP7/0LD+/9mzvz/htn8/4jZ/P+I2fz/btH8/0LD + +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/2nP/P+I2fz/iNn8/4jZ + /P9s0Pz/QsP7/0LD+/991vz///////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YELD + +yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////z+//9Hxfv/QsP7/3zV/P////////////// + ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl + /f//////////////////////j9v9/0LD+/9Cw/v/7/r///////////////////7///9Zyvv/QsP7/0LD + +/9Cw/v/QsP7IAAAAABOx/vgQsP7/0LD+/9Cw/v/0PD+//////////////////P7//9Cw/v/QsP7/5je + /f//////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 + /v9Cw/v/QsP7/6zl/f//////////////////////rOX9/0LD+/9Cw/v/3vT+/////////////////9Dw + /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAAAAAABGxPt5QsP7/0LD+/9Cw/v/fdb8//////////////////7/ + //9SyPv/QsP7/0/H+/+56f7/2fP+/9v0/v/b9P7/ouH9/0LD+/9Cw/v/2/T+//////////////////// + /////////////+f3/v9Cw/v/QsP7/5je/f/b9P7/2/T+/9vz/v+/6/7/V8r7/0LD+/9GxPv/9vz///// + /////////////33W/P9Cw/v/QsP7/0LD+/9Cw/t2AAAAAAAAAABCw/sYRMT7/ULD+/9Cw/v/QsP7/9rz + /v////////////////+n4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+V3f3/////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAAAAAAAAAATMb7oELD + +/9Cw/v/QsP7/27R/P/+///////////////+////peP9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Hxfv/7Pn///////////////////////////////////f8//9Ox/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Ssb7/5vf/f/9/v/////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAA + AAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////////////////////z+//9Wyfv/QsP7/9v0 + /v971fz/QsP7/7Xn/f/s+f/////////////////////////////////////////////v+v//v+v+/0LD + +/9oz/z/2/T+/0vG+/9Cw/v/+/7///////////////////////+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD + +x8AAAAAAAAAAAAAAAAAAAAAAAAAAEbE+4NCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// + //9u0fz/Vcn7//////+d4P3/Q8P7/+D1/v////////////////////////////////////////////// + ////////7fn//0jF+/+J2v3//////2bO/P9Zyvv//////////////////////9vz/v9Hxfv/QsP7/0LD + +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whJxfvfQsP7/0LD+/9Cw/v/Vsn7/+n4 + ///////////////////4/f//9fz////////+////8Pr///////////////////////////////////// + //////////////////////////////H7///9/v////////j9///1/P//////////////////6fj//1bJ + +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/stRMT7+kLD + +/9Cw/v/QsP7/1zL/P/p+P////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7WkLD+/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9vz/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD+/9Cw/v/R8X7/7Hm/f/+//////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// + /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD + +/lCw/v/QsP7/0LD+/9Cw/v/QsP7/33W/P/Q8P7//v////////////////////////////////////// + //////////////////////////////7////Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD + +1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+y1Dw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td/f/E7P7/6vj///// + /////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7gEPD+/lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0rG+/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7+ELD+4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7GELD+3ZCw/vTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vTQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD + +/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//4Af//wAA//8AAP//AAD/+AAAH/8AAP/g + AAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAP + AADgAAAAAAcAAOAAAAAABwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAA + AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAA + AAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/gAAAAB/ + AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/AAD/4AAAB/8AAP/4AAAf/wAA//8AAP//AAD//+AH//8AAA== \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 14127ff..c23aa6b 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -121,19 +121,19 @@ private void InitializeComponent() { this.textBox_MinerRestartDelayMS = new System.Windows.Forms.TextBox(); this.textBox_MinerAPIQueryInterval = new System.Windows.Forms.TextBox(); this.groupBoxBenchmarkTimeLimits = new System.Windows.Forms.GroupBox(); + this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.tabPageDevicesAlgos = new System.Windows.Forms.TabPage(); + this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); + this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); this.groupBoxAlgorithmSettings = new System.Windows.Forms.GroupBox(); + this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.buttonAllProfit = new System.Windows.Forms.Button(); this.buttonSelectedProfit = new System.Windows.Forms.Button(); this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); - this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); - this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); @@ -1226,6 +1226,36 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.TabStop = false; this.groupBoxBenchmarkTimeLimits.Text = "Benchmark Time Limits:"; // + // benchmarkLimitControlNVIDIA + // + this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; + this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); + this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; + this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlNVIDIA.TabIndex = 4; + this.benchmarkLimitControlNVIDIA.TimeLimits = null; + // + // benchmarkLimitControlCPU + // + this.benchmarkLimitControlCPU.GroupName = "CPU"; + this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); + this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; + this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlCPU.TabIndex = 3; + this.benchmarkLimitControlCPU.TimeLimits = null; + // + // benchmarkLimitControlAMD + // + this.benchmarkLimitControlAMD.GroupName = "AMD"; + this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); + this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; + this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlAMD.TabIndex = 5; + this.benchmarkLimitControlAMD.TimeLimits = null; + // // tabPageDevicesAlgos // this.tabPageDevicesAlgos.Controls.Add(this.devicesListViewEnableControl1); @@ -1241,6 +1271,27 @@ private void InitializeComponent() { this.tabPageDevicesAlgos.Text = "Devices/Algorithms"; this.tabPageDevicesAlgos.UseVisualStyleBackColor = true; // + // devicesListViewEnableControl1 + // + this.devicesListViewEnableControl1.AutoSaveChange = true; + this.devicesListViewEnableControl1.BenchmarkCalculation = null; + this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; + this.devicesListViewEnableControl1.IsInBenchmark = false; + this.devicesListViewEnableControl1.IsMining = false; + this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); + this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; + this.devicesListViewEnableControl1.SaveToGeneralConfig = false; + this.devicesListViewEnableControl1.SetAllEnabled = false; + this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); + this.devicesListViewEnableControl1.TabIndex = 397; + // + // algorithmSettingsControl1 + // + this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); + this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; + this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); + this.algorithmSettingsControl1.TabIndex = 396; + // // groupBoxAlgorithmSettings // this.groupBoxAlgorithmSettings.Controls.Add(this.algorithmsListView1); @@ -1251,6 +1302,16 @@ private void InitializeComponent() { this.groupBoxAlgorithmSettings.TabStop = false; this.groupBoxAlgorithmSettings.Text = "Algorithm settings for selected device:"; // + // algorithmsListView1 + // + this.algorithmsListView1.BenchmarkCalculation = null; + this.algorithmsListView1.ComunicationInterface = null; + this.algorithmsListView1.IsInBenchmark = false; + this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); + this.algorithmsListView1.Name = "algorithmsListView1"; + this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); + this.algorithmsListView1.TabIndex = 2; + // // buttonAllProfit // this.buttonAllProfit.Location = new System.Drawing.Point(364, 6); @@ -1304,67 +1365,6 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // benchmarkLimitControlNVIDIA - // - this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; - this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); - this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; - this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlNVIDIA.TabIndex = 4; - this.benchmarkLimitControlNVIDIA.TimeLimits = null; - // - // benchmarkLimitControlCPU - // - this.benchmarkLimitControlCPU.GroupName = "CPU"; - this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); - this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; - this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlCPU.TabIndex = 3; - this.benchmarkLimitControlCPU.TimeLimits = null; - // - // benchmarkLimitControlAMD - // - this.benchmarkLimitControlAMD.GroupName = "AMD"; - this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); - this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; - this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlAMD.TabIndex = 5; - this.benchmarkLimitControlAMD.TimeLimits = null; - // - // devicesListViewEnableControl1 - // - this.devicesListViewEnableControl1.AutoSaveChange = true; - this.devicesListViewEnableControl1.BenchmarkCalculation = null; - this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; - this.devicesListViewEnableControl1.IsInBenchmark = false; - this.devicesListViewEnableControl1.IsMining = false; - this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); - this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; - this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.SetAllEnabled = false; - this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); - this.devicesListViewEnableControl1.TabIndex = 397; - // - // algorithmSettingsControl1 - // - this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); - this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; - this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); - this.algorithmSettingsControl1.TabIndex = 396; - // - // algorithmsListView1 - // - this.algorithmsListView1.BenchmarkCalculation = null; - this.algorithmsListView1.ComunicationInterface = null; - this.algorithmsListView1.IsInBenchmark = false; - this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); - this.algorithmsListView1.Name = "algorithmsListView1"; - this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); - this.algorithmsListView1.TabIndex = 2; - // // Form_Settings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/NiceHashMiner/Forms/Form_Settings.resx b/NiceHashMiner/Forms/Form_Settings.resx index 4c08298..e04c2be 100644 --- a/NiceHashMiner/Forms/Form_Settings.resx +++ b/NiceHashMiner/Forms/Form_Settings.resx @@ -126,1206 +126,4764 @@ - AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAGd4AAK4EAAAgIAAAAQAgAKgQAADH4gAAMDAAAAEA - IACoJQAAb/MAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAQQFGhdFVoMogKHNMZvE8DGawu4ofZ3JFD9PfAECAxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACFkRWhz6/6/xCyv7/QMr+/0HK/v9Dyv7/RMv+/0XL/v8/uOb6FDpIeAAAAAAAAAAAAAAAAAAA - AAAAAAACImqFtEHK/f9Gz/7/Qcr+/0HF9/85p9D/O6nS/0fI+P9KzP7/S8z+/0vM/f8iW3CjAAAAAAAA - AAAAAAAAGk1gi0XO/f9Gz/7/RMXw/yFec/8mZn7/NpCx/ziQsf8uaYD/MGqB/0/H9P9Tzv7/Us79/xk/ - TXgAAAAAAwoMJDu87PxByv7/Pr3s/0Z4gf9Pzfb/Tc/+/1DO/v9Tz/7/V8/+/1bI9P88c4r/Wcn0/1zR - /v9QueL3AgQFFhpSZ4tAyv7/NqjR/yt8mf9Jzfz/TtT+/1PU/v9X0P7/XNH+/2DS/v9j0/7/ZdH6/1GR - rf9dud3/ZdP+/yFGVHgrh6rNQsr+/0XL/f85n8T/Ts7+/1TS/v9e1f7/X9L+/2XT/v9r1f7/b9b+/3LW - /v9ntNP/c9f9/3HW/v9CgJi6NKHK7EPL/v9HzP7/TM39/2XT/P9x0vX/bM/1/2jU/v9w1v7/fNPz/4PY - 9/+C2fz/gtr9/4Ha/v9/2v7/WJ242TWhyutFy/7/T8z7/3DP9P9sxe3/WbXm/0iq4/9Zuuv/VLPm/0yr - 4/9fuef/csjv/4LV9f+R3v3/jt7+/2Oft9gth6nJSMz+/1bE9P9FpeD/Io3Z/y+X3P87qeX/edb6/3/U - 9v8zpOX/KpLa/yiQ2f9HqOP/l9v5/57i/v9ahZe3G1BkhEnM/v9Qyfr/Nqfm/zqx6/9CvPH/V8z3/4Xb - /v+S3/7/Tcn3/0G47v84sOv/UK/m/7Xn/v+x5///N0pTcwMJCx5Gvev6Vs/7/0zK+f8qpej/W8Ty/4nb - +P+M3f7/nOH+/5De+P9IuO7/M6ro/07N/P/J7P3/rNDg9AMEBBIAAAAAHElaflnQ/f+D2ff/l932/6fm - +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 - AAAHETRBlzq04f5Bzf7/R8/+/0HL/v9Ayv7/Qcr+/0HK/v9Cyv7/Qsr+/0PL/v9Ey/7/RMv+/0XL/v9F - y/7/Rsv+/0bL/v9Gy/7/OaXO+AwjLHsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAADxtVasRAx/r/Qcr+/0HM/v9J0f7/Qcr+/0HK/v9Cyv7/Q8r+/0PL/v9Ey/7/Rcv+/0bL/v9G - y/7/R8z+/0jM/v9IzP7/Scz+/0nM/v9JzP7/RcHw/xY9TKUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAocWW/HQMr9/0HK/v9By/7/Ss7+/0PQ/v9Byv7/Qsr+/0PL/f89uOX/MpW5/y6Eo/8w - hqX/N5q+/0S+7P9KzP7/S8z+/0vN/v9Mzf7/TM3+/03N/v9Mzf7/Ssf2/xc+TaYAAAABAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAFEBOp0DM/P9BzP7/Q8v+/0rO/v9Ez/7/Qs7+/0HG+P8qfZv/EjA6/wkND/8T - KjP/Gj1K/xs9Sv8WKzP/EhUZ/x9ATf85jq7/Tsz7/0/O/v9Qzv7/UM7+/1DO/v9Qzv7/TMTx/w8nMH4A - AAAAAAAAAAAAAAAAAAAAAAAAAAgUGl1Bvu3/R8/+/0nQ/v9I0P7/Qs/+/0TP/v9Ircz/Eysu/xc8Sf8y - ja7/RcTz/0rM/v9Lzf7/Tc3+/07N/v9KwOz/Ooqo/yM9Sf8lQU3/SrTc/1TP/v9Uz/7/VM/+/1TP/v9U - z/7/Rq3U+QMHCTcAAAAAAAAAAAAAAAAAAAAMK4Wm6ELL/v9By/7/Qcz+/0HM/v9Cy/7/QZqy/3NSNv9M - p7z/SM/9/0rO/v9Lzf7/Tc3+/0/N/v9Qzv7/Us7+/1PP/v9Vz/7/Vc36/0GPrf8mN0H/SqfL/1nQ/v9Z - 0P7/WdD+/1jQ/v9Y0P7/K2Z8ygAAAAEAAAAAAAAAAAsjK3c/yPz/QMr+/0DK/v9Byv7/Qsr+/zObwf8Y - OD3/WMfp/1LT/v9L0P7/TdH+/0/R/v9Qzv7/Us7+/1TP/v9Wz/7/V9D+/1nQ/v9a0P7/XNH+/1O33P8w - RlL/VLbc/17R/v9e0f7/XdH+/13R/v9WxO7/Bg4RTgAAAAAAAAABJnmY30DK/v9Ayv7/Qcr+/0LK/v9A - wPD/FDVA/0G86f9K0P7/TND+/07W/v9Q1P7/UtP+/1TQ/v9Wz/7/WND+/1rQ/v9c0f7/XtH+/1/S/v9h - 0v7/YtL+/1m53f87WWj/YtH6/2PT/v9j0/7/YtL+/2HS/v8rXHC4AAAAAAEDBDo7vOz/QMr+/0HK/v8w - mLz/K4Sj/yFfdf83n8T/Scz+/0zR/v9O0v7/Udb+/1PV/v9W1f7/V9H+/1rQ/v9c0f7/X9H+/2HS/v9j - 0/7/ZdP+/2bT/v9n1P7/aNT+/1abt/9Qi6T/VJm1/1yy1P9o1P7/ZtP+/0+mx/kAAAAUDi46fkDK/v9B - yv7/Qsr+/0PL/v9BwvP/J2yE/0K45P9LzP7/TtD+/1HS/v9U1f7/V9b+/1zV/v9b0f7/XtH+/2HS/v9k - 0/7/ZtP+/2jU/v9q1P7/bNX+/23V/v9u1f7/Zbnb/1iPqP9u0/v/b9b+/27V/v9s1f7/adH5/wgPElQb - VmyvQMr+/0HK/v9Dy/7/RMv+/0bL/v9Hyfr/MH+a/03N/v9Qzv7/U9H+/1bS/v9a0/7/adX+/1/S/v9j - 0/7/ZtP+/2nU/v9s1f7/btX+/3DW/v9y1/7/dNf+/3XX/v9hm7T/dtj+/3bY/v911/7/dNf+/3PX/v9x - 1v7/HTlDhiRxj9BByv3/Qsr+/0TL/v9Gy/7/SMz+/0rM/v9KxvP/T87+/23T9/9yz/H/Y9H6/3PQ8v9g - 0v3/ZNP+/2fU/v9r1f7/btX+/3TS9v+C1/X/dNH1/4zb9v981/r/fNn+/3vT9v992f7/fdn+/3zZ/v97 - 2f7/edj+/3fY/v8vVmWnKX+g4UHK/v9Dy/7/Rcv+/0fM/v9JzP7/TM3+/0/O/v9Szv7/etn6/3LQ8v9x - 1fr/ccrt/2TT/f9o1P7/bNX+/3DW/v901/7/cs3x/4TX9/930fX/it/6/4ja+v+E2/7/hdv+/4Xb/v+F - 2/7/hNv+/4Lb/v+A2v7/ftn+/zpmd7gpgKHhQsr+/0TL/v9Gy/7/SMz+/0vM/v9ZzPj/b9L2/3LR9f92 - 0PT/bMjv/2jF7v9cuOf/Zcjx/2rN9P9w0vn/c9H2/3PN8v9sw+r/Y73s/3PI7v9yzPL/gNPz/4bX9f+L - 2fb/i9v6/43d/v+M3f7/it3+/4jc/v+F2/7/Pmd4uCZ1k9JDy/7/Rcv+/0fL/v9KzP7/Xsv1/3vT9f9u - y/P/Z8Hs/2C55/9Ur+L/RaTf/zmd3/80md3/NZre/2K+6v9Hpd3/M5jd/zaa3f89oOD/S6jf/1iz5P9k - vOj/aMXw/3LO9f+D1PP/ktz6/5Tf/v+S3/7/kN7+/4zd/v85XGqqHl10s0TL/v9Gy/7/SMz+/0vM/v9q - xe7/Wbjq/06r4P8xltv/IYzZ/yKN2f88ndv/Lpfe/z2j3/9kw+//dtL3/3HK8f9lvuj/MZrg/zab3/8w - lNj/IYzZ/yOO2v89ndn/VLLo/1687P+P1/X/neH+/5vh/v+Y4P7/lN/+/ytBS4oSNkSDRMv+/0fL/v9J - zP7/TM39/1q16P87nt//Pp7c/yGM2f8hjdn/IY7a/z2k4f8uqOr/Tbnr/3rZ/v+A2v7/htv+/4XX9/80 - rOj/Mafp/zWb3P8hjtr/IY3Z/yyT2f88nt3/P6Hg/4nR9P+m5P//o+P//6Di//+c4f7/EBgbWgMKDEFD - w/T/R8z+/0rM/v9Ozf7/Urnr/zCX3v84oOL/OqHe/y+Y2f8lktj/QbXr/znB+v9cx/H/f9r+/4Xb/v+L - 3f7/kd79/0S/8P83v/j/OaPf/yqV2P8zm9v/Qafi/y6Y3/86nN3/pd/6/7Dm//+t5f//qeT//4m91P0A - AAAaAAAABi+IquZIzP7/S83+/0/O/v9Szfz/RrLl/y+v7/8zuPT/QMP4/07M+/9Nz/7/UtL+/23O8v+D - 2/7/itz+/5De/v+X4P7/Yczz/07Q/v9Qz/3/SMn6/zq/9/8xtPL/Na7t/5TQ7f+96v//uur//7fp//+y - 6P//WHWBwQAAAAAAAAAAEjRBgUnM/f9Mzf7/UM7+/1bJ9f89wvn/P8T4/zyu5/8ypeT/Mafk/3LY+f96 - 3v//e9Hy/4fc/v+O3v7/ld/+/5zh/v+C1fP/c93//1nD7/8wpuT/NKfk/0G47P87xPv/V8f0/8Pq/P/F - 7P//wOv//7fm+v8VGx5aAAAAAAAAAAABAgMUN5m97k3N/v9Rzv7/YNP8/1DR/v9bzPT/JqTp/yen6/8r - qen/nuf9/6Tq/v+A0fL/it3+/5Lf/v+Z4P7/oeP//5vb8/+e6P//c87z/yep7P8mpur/Pa/o/1jU//9Q - 0f7/yO39/9Du///K7f//dIuW2AAAAAQAAAAAAAAAAAAAAAAOJi9sTMj3/1HO/v9t2P3/d97+/4ji/v9y - zPH/R7bq/0q36f+67///v/H+/4LT9P+N3f7/ld/+/53h/v+m5P//q+H1/7zw//+V2/X/PLPq/1S76/+I - 2/j/f+D//4Df/f/e8/7/2/L//8Lc6f4RExVGAAAAAAAAAAAAAAAAAAAAAAAAAAQjXHG3Us7+/1fP/f9t - zO//mNzy/7Xs/f+/8f//w/P//8L0///B9f//suz5/5ve9P+X4P7/nd/7/67m9f+/8/3/wfX//8P0///C - 8///u/D//6zm+P+k3PD/0+r2/+73///m9P3/QkhMkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAxMy - fZrVV8/+/1vR/v9h0f3/qOf5/5fb8f+g4/f/quj1/5nh9v+f5Pb/ltzz/5ng/v+e3/v/p+Ty/7Dn9v+s - 4fH/wPf+/8Tm9P+16PX/3PH5//f6///6/P//+Pv+/2xvcrwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAIEBRs0fJjTXNH+/2HS/v+t7Pr/g9by/5jl+v+S3vH/gdr+/4nc/v+R3v7/muH+/6Pj//+t - 5f//uOj//7Dg9P+x8/v/1e/7/7Dn8v/e9Pr//f3///39/f91dXW9AAAACwAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAECAxEoWm2xXsz2/3jV9v9y0/j/hdv3/4TX8/+B2v7/idz+/5He/v+a - 4f7/o+P//63m//+46f//vej7/7Dl8v/V7/v/zuv1/+j0+v/r6+z+UFBQlwAAAAYAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQIypiSpe16GzV/f9z1/7/etj+/4Ha/v+J - 3P7/kd7+/5ng/v+i4/7/rOX//7fp///B7P//zO7//9jx///j8vz/mp+i3BkZGUkAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEOGC43ckeGnthx - yu3/gNr+/4fc/v+P3v7/mOD+/6Di//+q5f7/tOj+/77r//+01eX+eIiRyyIlJ2MAAAAFAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAwQGBy8cMDdvN1lmnkt0hb1YgpTMXIOTy1Z1g7pEWWKZIywwaAICAyMAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///AAH//gAAf/gAAB/wAAAP4AAAB+AAAAfA - AAADgAAAAYAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGA - AAABgAAAAcAAAAPAAAAH4AAAB/AAAA/4AAAf/AAAf/8AAP//wAf/KAAAADAAAABgAAAAAQAgAAAAAAAA - JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIFBgUPMDwKBQ8TOAQMDmQDCg2AAwoNjQMKDYsD - Cw18BAwPWwYSFysOKzYIAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEJHyZmHVlwpSRxjtwpgaL/MZnB/ziw3P88 - vu//PsT2/z7E9v89u+z/N6vY/y+Tuv8pfp7/I2yI0RpRZZcBAwNYAAAAEgAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkCBogvTKLrPg9wPD+PsX4/0DK/v9A - y///QMr//0HK/v9Byv7/Qcr+/0HK/v9Byv7/Qcr+/0LK//9Cy///Qsv9/0HF9v8+v+/8JXKO8wEGB5gA - AAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFBQAAAAAAAAAAJBVDUpspg6D/Q9P//03S//9A - y/7/QMr+/0DK/v9Ayv7/Qcr+/0HK/v9Byv7/Qcr+/0HK/v9Cy/7/Qsv+/0PL/v9Dy/7/Q8v+/0TL/v9E - y/7/R9L//0PJ+/8lbIf/EjZDeAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAEDA95LY6x7z3B7v9C - 0///RM/+/0nN/v9Ayv7/Qcr+/0HK/v9Byv7/Qcr+/0LK/v9Cy/7/Q8v+/0PL/v9Dy/7/RMv+/0TL/v9E - y/7/Rcv+/0XL/v9Gy/7/Rsv+/0bM/v9Hzv//QLnm/yp4lt8AAABQAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwwnML84 - r9z/Qs///0HN/v9Azv7/TtL+/0PN/v9Byv7/Qcr+/0HK/v9Byv7/Qsv+/0LL/v9Dy/7/RMv+/0TL/v9E - y/7/RMv+/0XL/v9Gy/7/Rsv+/0fM/v9HzP7/R8z+/0fM/v9HzP7/R8z+/0nP//8zkbT/CyAofAAAAAEA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAbHl111T/D9f9Czf//Qcv+/0HM/v9Gzv7/TNT+/0HM/v9Byv7/Qcr+/0LL/v9Dy/7/Q8v+/0TL/v9E - y/7/RMv+/0XL/v9Gy/7/R8z+/0fM/v9HzP7/R8z+/0jM/v9JzP7/Scz+/0nM/v9KzP7/Ss3+/0rN/v9M - 0///P6/Z/xtKXLEAAAAHGEFRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAABkaUmb4Q8///0HK/v9Byv7/Qcv+/0LM/v9O0f7/Q9L+/0HL/v9Cyv7/Qsv+/0PL/v9E - y/7/RMv+/0XL/v9Fy/7/Rsz+/0fM/v9HzP7/SMz+/0jM/v9JzP7/Ssz+/0rN/v9Kzf7/S83+/0vN/v9L - zf7/TM3+/0zN/v9Mzf7/TM3+/0jC8f8TMz/IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAFx9geN9E1f//Qcv+/0HL/v9By/7/Qcz+/03O/v9H0f7/QtH+/0LL/v9C - y/7/Rc3//0bU//8+vOn/NJzB/y6Gpf8oc4z/Jmh//yZpgf8reJL/M4qr/zyjyf9GxfP/TtX//03O//9M - zf7/Ts3+/03N/v9Ozf7/Ts7+/07O/v9Ozv7/Ts7+/07Q//9KxPL/GD9OugAAAAcAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAQOEgAAAAAAFD9NyD/H9/9Bzf7/Qcz+/0HM/v9DzP7/Uc/+/0bR/v9C - 0P7/Q8/+/0PL/v9H0///NqrS/xY+S/8MFxz/CgsO/wgDAv8IAAD/CQAA/wsCAf8MAwP/DgkK/xIUGP8W - ICb/JFZm/0a85v9Q0///UM7+/1DO/v9Qzv7/UM7+/1HO/v9Rzv7/Uc7+/1HO/v9Rz///Sbvn/xY5RocA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFBqRO7/p/0HR//9Bzv7/Q87+/0nO/v9P - 0P7/RND+/0PQ/v9D0P7/Q83//zir1P8VP0z/AgAA/wwVGf8VMTv/JGN4/zSSs/8+sNf/Qr/o/0O95/8/ - rNP/No6r/yhfcf8eNT//Fxsg/xEJCv8sYnX/S73n/1PR//9Tz/7/U8/+/1TP/v9Uz/7/VM/+/1TP/v9U - z/7/VNH//zqQsf8CBgdAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAEA9ocn7TND//0zQ/v9N - 0/7/S9P+/0jS/v9D0f7/Q9L+/0PQ/v9U1f//RH6C/xMaEP8KFBf/K32Z/z6y3P9Jzv//TNL//0zQ//9N - z///Ts///07P//9Q0P//UdH//1PU//9QzPr/R6/W/zR1jP8YFRf/HiUr/z6Oq/9Z2v//VtD+/1bQ/v9W - 0P7/VtD+/1bQ/v9W0P7/VdD+/1jW//8vcovxAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyBheb1C - yvr/Q87+/0LN/v9AzP7/Qs7+/0LP/v9Cz/7/Q8v+/0XH9/9qcGT/hEEZ/0Nzbf9Jz/7/Sc///0rM/v9K - zf7/TM3+/03N/v9Nzv7/UM7+/1DO/v9Sz/7/Us/+/1TP/v9Uz/7/Vc/+/1fT//9Uy/f/LE1c/x8YHP84 - c4r/WdH//1nR/v9Z0P7/WdD+/1nQ/v9Z0P7/WdD+/1jQ/v9Z0v//GDxImQAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAARDOfyP9Ay///QMr+/0HK/v9Byv7/Qcr+/0LK/v9Dy/7/RM///x1OW/9APiP/c6m2/2Tf//9M - 0v//S9L+/0zS/v9N0f7/Ts/+/0/O/v9Qzv7/Us7+/1PP/v9Uz/7/VdD+/1bQ/v9X0P7/WND+/1nR/v9a - 0f//W9P//0KIpP8kIif/P3qR/1/Y//9c0f7/XdL+/1zS/v9c0v7/XNH+/1zR/v9b0f7/P5Cv8gsaHxkA - AAAAAAAAAAAAAAAAAAAAF0ZX50LR//9Ayv7/QMr+/0HK/v9Byv7/Qsr+/0PL/v9F0P//HFFj/woQE/9D - stb/Wtf+/1LT/v9L0P7/TdD+/07R/v9P0v7/UdL+/1HO/v9Sz/7/VM/+/1XP/v9W0P7/WND+/1nQ/v9a - 0f7/W9H+/1zR/v9d0f7/XdL+/1/S/v9Qqcr/KSct/0iSrf9i1///YNL+/2DS/v9g0v7/YNL+/1/S/v9f - 0v7/Wcjy/xAlLIwAAAAAAgECAAAAAAAAAABJN6/c/0HM//9Ayv7/Qcr+/0HK/v9Cyv7/Q8v+/0TL/v8y - l7v/ChIV/zimzP9K1P//SdH+/0vQ/v9N0/7/T9b+/1DU/v9R0/7/U9P+/1TQ/v9Vz/7/VtD+/1jQ/v9Z - 0P7/W9H+/1zR/v9d0f7/XtH+/1/S/v9g0v7/YdL+/2LT/v9k1///TZSv/y4sMv9aut7/ZNT+/2TT/v9j - 0/7/Y9P+/2LT/v9i0/7/ZNn//zJuhf8AAAADAAAAAAAAAAAYSFyjQc3//0DK/v9Byv7/Qcr+/0TR//9G - 1f//RtD//0fS//8PKC//M5Gz/0nP//9Kz/7/TNL+/03R/v9O2P7/Udj+/1LV/v9U1v7/VdT+/1fR/v9X - 0P7/WdH+/1vR/v9c0f7/XtL+/1/S/v9g0/7/YtP+/2LT/v9k0/7/ZdT+/2XU/v9m1P7/aNj//0yIov9C - ZHX/Z9P9/2nZ//9q3f//aNf//2bU/v9l1P7/ZdX//2DM9v8AAABrAAAAAAAAABAriKvUQMr//0HK/v9B - yv7/Q87//yNyi/8VQk//KHyW/yp8mP8YOkf/R8r7/0nM/v9L0P7/TdL+/0/S/v9R1f7/Utb+/1TV/v9V - 1v7/WNb+/1jR/v9a0P7/XNH+/17R/v9f0v7/YNL+/2LT/v9j0/7/ZdP+/2bU/v9o1P7/aNT+/2nV/v9q - 1f7/atX+/2vS+/9BVGL/X7TU/1CHnv9DYG7/WanH/2vY//9q1f7/aNT+/2vb//8oU2PGAAAAAA8uOiAx - nMT7Qcr+/0HK/v9Byv7/Qsv+/0XP//9DzP//OqzV/yFcb/8mZ33/StD//0vN/v9Mzv7/T9P+/1HS/v9S - 1f7/VNb+/1bW/v9Y1/7/WNT+/1vR/v9d0f7/X9L+/2DT/v9i0/7/ZNT+/2bU/v9o1P7/adX+/2vV/v9r - 1f7/bNb+/27W/v9u1v7/b9b+/2/W/v9RfJH/V4+o/2nD5v9v2f//cNj//27W/v9t1v7/bdb+/2zX//9N - mrjiAAAAFxQ+TUg3q9f/Qcr+/0HK/v9Cy/7/Q8v+/0TL/v9Fy/7/R8v+/0jP//8qc4v/QrPd/0zN/v9O - zv7/UM/+/1PU/v9U1P7/VtX+/1jW/v9l2P7/ctr+/17S/v9f0v7/YtP+/2PT/v9m1P7/Z9T+/2rV/v9r - 1f7/bNX+/27W/v9v1v7/cdb+/3LX/v9y1/7/dNj//2q+3/9ck6z/dNj+/3TY/v9z1/7/c9f+/3PX/v9x - 1/7/cNb+/2/W/v9fudzzBQkLMhE2Q30+wfP/Qcr+/0HK/v9Dy/7/RMv+/0TL/v9GzP7/R8z+/0nM/v9A - rtf/MYGa/0/R//9Qzv7/Ts7//1HQ//9V0v7/WNP+/1nT//9e0/7/Y9T+/2DS/v9i0/7/ZNP+/2fU/v9p - 1P7/a9X+/23W/v9u1v//cNf//3LX/v9z2P//c9j//3bY/v932f7/euD//1V0hP920/b/edj+/3nY/v94 - 2P7/d9j+/3fZ/v922P7/dNf+/3TY/v9ju97/JkdUSBM8SqVCzv//Qcr+/0LL/v9EzP7/RMz+/0bM/v9H - zP7/SM3+/0rN/v9Lzfz/Ssfz/0/P//9Oz///g9Hs/4DP6v9cz/v/Xs/6/2rH6/9mz/f/YNP+/2TT/v9l - 1P7/Z9T+/2rV/v9s1v7/b9b+/3LV/P92ze7/fM/u/3XZ//+CzOf/jdTs/3zY/P982f7/fdv//3nR8/9+ - 2///ftr+/37a/v992v7/fNr+/3vZ/v972f7/edn+/3jY/v9rxOf/MFdmYxlPY75Cz///Qsr+/0PL/v9E - y/7/Rcv+/0fM/v9HzP7/Ss3+/0vO/v9Nzv7/T87+/1HO/v9Ozf7/meP4/4HY9f9c0Pv/cNb7/5jo//9o - w+b/Y9T//2bU/v9p1P7/a9X+/27V/v9w1v7/c9f+/3HP9P+G3fr/mef//3vZ/v92yeb/lef+/4Ha/f+A - 2v7/gdv+/4Lb/v+C2/7/gtv+/4Lb/v+C2/7/gdv+/4Da/v9/2v7/fdr+/3zZ/v9zzO//M1tqehxYb8xD - z///Q8v+/0PL/v9Fy/7/Rsv+/0fM/v9JzP7/Ss3+/03N/v9Ozv7/UM7//1HP//9Nyvv/n+j9/3nT8v9b - z/v/eNb4/33V+f9cveX/Z9X//2nV/v9s1f7/btb+/3DX/v901/7/dtj+/3LP9P91z/P/gtf5/4be//9z - xeT/lef//4HW+P+G3f//h93//4fd/v+H3f7/iN3+/4fd/v+H3P7/htz+/4Xc/v+E3P7/gtv+/4Hb/v95 - 0fP/Nl1thB1ZcM1Dz///Q8v+/0TL/v9Fy/7/R8z+/0jM/v9KzP7/TM3+/03N/f9Uzvz/XMny/23O8f9u - y+7/h9v6/3HM8f9dyvT/dM/0/2W/7f9bv+j/atT9/2zU/P9u1f3/ddj+/3jY/f931/z/etf8/3bQ9f9k - ver/a8Xw/4HU9f92x+n/ftj7/4bS7/+J1PH/h9Pw/4jY+P+M3f3/jd7+/4ze/v+M3v7/i93+/4rd/v+I - 3f7/h9z+/4bc/v9+0vT/OF9uhRtUacFE0P//RMv+/0TL/v9Gy/7/R8z+/0nM/v9Lzf7/UMr4/3fT9P+E - 2fb/hdr6/3nU+P9xzfX/ZsTy/2LA7/9guen/VbHm/0mq5f9SruP/T6zh/1Gv4/9XtOT/c9P6/2K54v9U - sOT/Uq3h/1Ot4v9KquT/Tq7m/1y25/9hvu//Y8Hw/2zJ9P900Pf/ftj6/4Xa+P+L2fX/jNXy/5Ph//+R - 4P7/kd/+/5Df/v+O3/7/jN7+/4rd/v+B0PD/Ol5tfBZDVKlE0P//RMv+/0XL/v9HzP7/Scz+/0rN/v9N - zP3/ddDy/3fT9/9wzPT/aMXy/2TA7v9ft+P/XbPg/1Sr3P9Kp93/QKLh/zec3/8zmN3/L5fd/y6W3f84 - m9z/c9L4/0yn2P8tlt7/L5bc/zGX3P82m97/O57g/0al3/9Pqdr/W7Lf/2C14f9hu+n/ZsTx/2zK8/9y - 0Pb/h9n3/5DX8/+X4f//l+D+/5Xg/v+U4P7/kd/+/4/f/v+CzOn/PF5saBI3RINCx/n/RMv+/0bL/v9I - zP7/Sc3+/0vN/v9Ry/r/dcnv/2G/7/9auez/VrHi/0Og2v8tlN3/JpDb/yeQ2/8okNj/S6Ta/y6W3f8u - l97/QKPf/1i35/9evOj/e9f7/27G7P9euuf/VrLh/y+X3v8ult3/N5rc/ziZ2P8pktv/JI7b/yeR3P84 - mtz/Uard/1e36/9evO7/ZcPx/4zU8v+d4v//nOL//5vh//+Z4P7/l+D+/5Tf/v+BxeD/OVViTBVBUU87 - st//Rcv+/0bM/v9IzP7/Ssz+/0vN/v9hzvj/XLbp/0ys5f9IqOT/MZDO/yCM2v8hjNn/IY3Z/yGN2v8e - jNn/U63g/y2c4/8uoeb/Vbno/3nZ/v982/7/f9v+/4Tc/v+I3v//iN76/zGe3f8un+X/N5/h/zWa3P8h - jdr/IY3Z/yGM2f8gjNr/JYnN/0up4v9IqeX/T7Dn/3nJ8f+k5P7/ouT//6Hj//+e4///nOL//5rh//+E - xN72GSQoNhdEViI2oMn/Rsv+/0fM/v9JzP7/S83+/0vN/v9q0/v/Sabj/zmc3/83m97/S6fi/x6L2f8h - jtr/IY7a/yKQ2/8fjtr/VLfp/y2r7v8wsvD/XcLt/3vZ/v9/2v7/g9v+/4fc/v+L3f7/kOD//zet4/8u - r/D/N63r/zef3/8ikNv/Io/b/yGO2v8fjNr/P6Df/zye3/83m97/O5/h/3PC7v+s5v//qOX//6bk//+k - 5P//ouP//6Dk//99tMzlAAAAHAAAABMzlbvZR8z+/0jM/v9KzP7/S83+/03O/v9Uzv3/UKzl/y6W3f8t - lt7/R6nm/0ak2/8kjtX/H4/c/x+R3v8fjtf/WMr4/zO9+P87w/r/Zsnv/37a/v+C2/7/htz+/4rd/v+O - 3v7/k9/+/0m96/82wPr/O773/zml4v8gkd7/H5Dd/x+M1/83mNb/T63l/y6X3v8uld3/M5ne/5HT9P+y - 6P//r+f//63m//+r5v//p+X//6jp//9QcX7MAAAAAAAAAAAhYXqtSM7//0jM/v9Kzf7/TM3+/07O/v9Q - zv7/Tr7r/z2h3v8voOX/LaXp/zKs7v9LvO7/S7bj/0uz4v9Kr97/S87//0PL//9Mz/7/b8zw/4Hb/v+F - 2/7/id3+/47e/v+S3/7/l+D+/1zG7f9Gzf//Qsr+/0y86v9KseD/TLTj/1G86v87tfH/Lafq/y6h5v81 - oOH/abPb/73s//+46f//tuj//7Po//+x5///ref//6zq//8NERN8AAAAAAAAAAAAAABWRMLx/0nN//9L - zf7/Tc3+/0/O/v9Sz/7/VND//1O75f84tPH/MLb0/zW++f89wfb/SMj4/0rK+P9L0P7/TtL//1fU//9k - 2P7/dc3v/4Tc/v+I3P7/jd7+/5Df/v+V4P7/muH//3DL7f9b1v//UtP//0zR//9LzPn/Scn4/0LD9v84 - v/j/Mrn2/zGz8v9cvOj/vuj8/8Hs//+/7P//vev//7rr//+36v//uO7//3OYqP8AAAAQAAAAAAAAAAAA - AAAAJGR99EzU//9Mzf7/Ts3+/1DO/v9Sz/7/W8ny/zu+9v83wfr/QMn//1G75/89rOf/L6Xn/zGp6f9Z - vun/atz//3Dd//+B4P7/ds3w/4fc/v+L3f7/kN/+/5Tg/v+Z4f//nuL//4HQ7f933v//bNz//2XM8v82 - rOr/LqXn/zWo6P9Ks+b/R8f4/zrE+/81v/n/bcjs/8rt///G7f//w+3//8Ls//++6///uev//zM/RqMA - AAAAAAAAAAAAAAAAAAAAAwgKW0K44/9Mzf//Ts7+/1DO/v9Uz/3/V834/0LL//9Iz///Srvl/yWg5/8k - ouf/JqTp/yOl6v9pxOz/heT//47l//+U3vb/e9L1/4jc/v+N3v7/kt/+/5fg/v+c4v//ouP//5LW8P+S - 5f7/iOT//3/W9P8lpuv/Jqbp/yWj6P8joOf/Pqze/0rR//9DzP//Rcv//7zl9v/O7///y+7//8ft///D - 7P//krTC/DU/RiEAAAAAAAAAAAAAAAAAAAAABAoLAyx4lM5MzP3/Ts7+/1HP/v9X0P7/Ztj+/1XU//9c - 1///ctT1/x+i6v8oqez/Kavt/ySr7/+C0u//oer//6vt//+Z1ur/gdn9/4rd/v+Q3v7/leD+/5rh//+f - 4///pOT//5/b9P+p6Pv/pOv//57h9v8nre7/Kazu/yiq7P8kpuv/W8Lv/2HZ//9X1f//T9L//8Lu/v/W - 8f//0vD//87u///M8P//XnJ6qQAAAAISERUAAAAAAAAAAAAAAAAAAAAAAA4mL1BGuub8UM///1HP/v9X - 0P7/ed7+/2/c//933v//j+f//2rF7f8xsO3/LrDu/ySv7/+f3fP/t/D//7/y//+Z0ub/ht3//43e/v+R - 3/7/luD+/5zh//+i5P//p+X//6bd9f+57fv/ufD//77t+f8or+7/LbHv/zGx7v9Etuz/juH7/3vf//9x - 3f//b93//9z1///e8///2fH//9n0//+etcL5AAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ - Q1OsT87+/1LP/v9Vz/7/ZdL7/4HT7/+c7P//nun//6zt//+l4vb/l9rz/4/W8v+97vv/wfP//8P1//+5 - 6/j/jNb1/4PR8v+V4P//mOH//5/j//+c3Pj/otrz/7bn9//C9P7/wvT//8f0//+Q1vL/lNrz/57e9f+u - 6vv/o+v//5vq//+G3Pf/tub3/+34///n9f//4/b//7nM1/8mKS1lAAAAAAMGBQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAJWB34FPR//9Vz/7/WND+/1jL+P9wvt7/p+Dx/77y///A8v//wvP//8L0///C - 9v//wvb//8L3///B9///wPj//8L0+v+N1/b/muH//5/i/v+v5/b/wPj//8D3///C9///wvb//8L2///C - 9f//wvP//8Hy//+/8f//tOr5/5bP4//D3ev/9Pr///H6///u+P//4e72/2hvdaEAAAAAFhUZAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAABxMWJDmPr+tY1v//WND+/1zR/v9d1P//Xcz4/5LX8P/L - +v//hM3o/53g9f+/9v7/sOr2/6bn9/+p6ff/q+z4/5/e6v+R3fz/nOL//6Hj//+d3O//rOz2/7Ds9/+1 - 6/f/tOn2/7z0/f++6/b/tt7u/8Dy/P/E8fv/1+nz//r8///9/v//+/3///r8///3/f//iIyR0gAAABIX - FxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAADA4h6X/XNj//1zR/v9g - 0v7/X9L//6Di9//F9Pv/Zsju/4re/P+59///jdTn/3/Z/f+H2/z/jN38/5He+/+W4P7/nOL//6Pj//+n - 5P3/rub9/7Xn/f+86f3/uOb5/6jr9f/D7vf/0ur5/7bp8//I9v7/7vj9//v8///+/f////7///7///91 - d3jiCAUKDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAAAAAAAA - AAAsPI6t61zR/v9g0///XtL//6rm9v+v6PD/bNL6/43g+/+y+f//g8/n/4Hb//+G3P7/jN3+/5Hf/v+X - 4P7/neL//6Pj//+p5v//sOf//7fp//++6///vOj6/6Hq9f+78Pj/4PL//6Hb6P+68/z/7fj8//79//// - ////9vb2/5qZmtEAAAASAAAAAEE/RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAEAAQAAAAAACA8TIixjd9Zez/v/YtT//33Y+P+C1fD/b9b+/4PZ9/+c4/H/gs7p/4Hb//+G - 3P7/jN3+/5Lf/v+X4P7/neL//6Pk//+p5v//sOf//7jp//+/7P//v+n7/6Df7P+x5PD/4fP//7/j8P/Q - 7/f/8/n9///////f3+D/b29vpAAAABAAAAAAQUBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQIAAAAAAAAAAAAcO0idWLzi+2XT/P9r1v//b9b+/3PX/v92 - 2f//fNr//4Hb/v+G3P7/i93+/5Hf/v+W4P7/neL//6Pj//+p5v//sOf//7fp//++7P//xe3//8/v///W - 8f//3vP//+j2///x+f//8/f7/9LT1vQ3Nzd0AAAAABAQEAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGACl0kQAAAAAADBofRj19lr5b - ttn/ct3//3TZ//932P7/fNn+/4Hb/v+G3P7/i93+/5Df/v+W4P7/m+L//6Lj//+o5f//ruf//7Xp//+9 - 6///xO3//8vu///S8P//3fX//+v9//+3wMb/hIiLpgAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAkLDwMEBwk/MF5v3WW/4v942///e9r//4Db/v+F3P7/it7+/5Df/v+V4P7/m+L//6Hj//+n - 5f//reb//7Tp//+66///wez//8nv///R8f//rcPO/0xSV7wlISglAAIAAAAAAAAAAAAAS0lMAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAATEwAAAAAAAAAAAAAAADoyWmqZV5u1y2exzu5vuNb/f8zs/47e/v+X - 5P//nOX//6Lm//+o6f//qOL7/6DS5/+ZwtT/mb3N6IOdqcRIUliIAAAAJQAAAAAAAAAAHRogAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgHiMAAAAAAAAAAAAAAAAAAAAACx8zPBw+ - ZHQwM05aXi5GUIM4Ul2cPlpmpkFbaKU8UVuXOkxVfUdaZVRWanQqISgsGQAAAAcAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//gAH/ - /wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAB/AAD4 - AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAMAAAAAABwAAwAAAAAADAADAAAAAAAMAAIAAAAAA - AQAAgAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA8AAAAAAPAAD4 - AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD+AAAAAH8AAP8AAAAA/wAA/8AAAAP/AAD/4AAAB/8AAP/wAAAf - /wAA//4AAH//AAD//4AB//8AAA== + AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAKCAEAK4EAAAgIAAAAQAgAKgQAADWJAQAMDAAAAEA + IACoJQAAfjUEACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7NVTJ+6pMxvvsQ8P7/EPD+/xJxfvoRMT7nELD+zUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sOV8r7ukLD+/9mz/z/o+L9/7/r/v+/6/7/o+L9/2XO/PxCw/v/Q8P7pkLD+w4AAAAAAAAAAAAA + AABCw/sOVcn730/H+//D7P7//////+z5///K7v7/yu7+/+/6////////w+z+/0zG+/pExPvLQsP7DgAA + AAAAAAAAXcz8wU/H+//j9v7/9Pv//4TY/P9Dw/v/QsP7/0LD+/9Dw/v/iNn8//T7///j9v7/S8b7+ULD + +6UAAAAAYMz8P0LD+//D7P7//v///2zQ/P9Vyfv/ver+//b8///1/P//ver+/1TJ+/9s0Pz//v///8Ps + /v9Cw/v/QsP7NWvQ/MRmz/z///////z+//+L2v3/4/b+///////////////////////i9v7/i9r9//3+ + ////////YMz89ELD+5pTyPv1o+L9////////////v+v+/8bt/v/1/P/////////////7/v//wev+/73q + /v///////////6Pi/f5Dw/vhRcT7/r/r/v//////vOr+/1PI+/9Wyfv/hdj8////////////i9r9/1TJ + +/9Qx/v/t+j9//////+/6/7/Q8P7+0XE+/6/6/7//////3HS/P/Y8/7/5/f+/3HS/P///////////3HS + /P/b9P7/2/T+/2zQ/P//////v+v+/0PD+/tTyPv1o+L9//////+f4f3/T8f7/2DN/P9x0vz///////// + //9x0vz/Xsz8/0/H+/+Z3/3//////6Pi/f9Dw/vhbND8xmbP/P//////gNf8/77q/v/d9P7/cdL8//// + ////////cdL8/9Lx/v/B6/7/eNT8//////9gzfz2QsP7mmfP/EJCw/v/w+z+/9Px/v9Yyvv/Vsn7/5Td + /f///////////5rf/f9TyPv/Vcn7/9Dw/v/D7P7/QsP7/0LD+zUAAAAAYM38xU/H+//j9v7/1/L+/9v0 + /v/6/f/////////////9/v//2PP+/9fy/v/j9v7/TMb7+kLD+6UAAAAAAAAAAELD+w5XyvviT8f7/8Ps + /v/////////////////////////////////D7P7/TMb7+0XE+8xCw/sOAAAAAAAAAAAAAAAAQsP7DlvL + /L5Cw/v/Zs/8/6Pi/f+/6/7/v+v+/6Pi/f9lzvz9QsP7/0TE+6dCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAARsT7N1nK+69Nx/vtRMT7/UPD+/xLxvvqSMX7n0LD+zYAAAAAAAAAAAAAAAAAAAAA+B8AAOAH + AADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAADgBwAA+B8AACgA + AAAAAQAAAAIAAAEAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7EELD+zBCw/tSQsP7akLD+31Cw/uRQsP7pULD+7hCw/vLQsP73kLD++BCw/vvQsP78ELD + +/dCw/v/QsP7/0LD+/9Cw/v/QsP790LD+/BCw/vvQsP74ELD+95Cw/vLQsP7uELD+6VCw/uRQsP7fULD + +2pCw/tSQsP7MELD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+zFCw/tgQsP7jULD + +65Cw/vOQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD+85Cw/uuQsP7jULD+2BCw/sxQsP7CAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7Q0LD+3pCw/upQsP71kLD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vWQsP7qULD + +3pCw/tDQsP7DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD+5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD+1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sIQsP7R0LD+5BCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9lCw/uQQsP7R0LD+wgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD + +21Cw/u0QsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7tELD + +21Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/twQsP7yELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+8hCw/twQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7bULD+8NCw/v+QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/5Cw/vDQsP7bULD+xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+0NCw/upQsP7+ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7qULD+0NCw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD + +3pCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/ulQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7+0LD+6VCw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sBQsP7SULD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7xCw/tJQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AkLD+1hCw/vbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9tCw/tYQsP7AgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sBQsP7UkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9ZCw/tSQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yRCw/uxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7FCw/skAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD + +4tCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD+4pCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD + ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vULD + +yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/t0QsP79kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9r0Pz/gtf8/5fe/f+l4/3/s+f9/8Hr + /v/Q8P7/2/T+/+b3/v/n9/7/7Pn///P7///z+///8/v///P7///s+f//5/f+/+b3/v/b9P7/0PD+/8Hr + /v+z5/3/peP9/5fe/f+C1/z/a9D8/1PI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v2QsP7dELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/vMQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0TE+/9gzfz/g9j8/6Xi/f/G7f7/4PX+//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+P3//+D1/v/G7f7/peL9/4PY/P9gzfz/RMT7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vMQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+3dCw/v6QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1jK + +/+F2Pz/seb9/9rz/v/6/f////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + ///a8/7/seb9/4XY/P9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/t3QsP7AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD+79Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/+O2/3/v+v+/+v5 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+v5//+/6/7/jtv9/1fK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+79Cw/scAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7nULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/d9T8/7bo/f/y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////L7 + //+26P3/d9T8/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7nULD + +wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP7zULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P+y5/3/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////v+v//suf9/27R/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vNQsP7IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Qx/v/ld39/+D1/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4PX+/5Xd/f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/t7QsP7/ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/2zQ/P+86v7/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+v3//7zq/v9s0Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ULD+3tCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/utQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/f9b8/9Tx/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////9Tx + /v9/1vz/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rULD+woAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +/+R3P3/5Pb+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+T2/v+R3P3/R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vjQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/47b + /f/p+P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+n4//+O2/3/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++NCw/suAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/vxQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/iNn8/+f3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+b3/v+I2fz/RMT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ULD + +0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v931Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/I7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////8ju + /v9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/1Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/6vk/f/7/v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+/7//6vk/f9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////v+v+/1LI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz/8fv///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////x+///hdj8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3gAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////++6v7/Tcf7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/o+P////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+j4 + //9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/6Lh/f/9/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////f7//6Lh/f9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/ULD+1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vxQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////v///+35///W8v7/x+3+/7rp/v+t5f3/oeH9/5rf/f+U3f3/lN39/4zb + /f+U3f3/lN39/5fe/f+g4f3/qeT9/7bo/f/D7P7/0/H+/+f3/v/7/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/FCw/suAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vjQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////j9 + ///T8f7/s+f9/5Td/f931Pz/Wsv8/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9u0fz/i9r9/6vk + /f/I7v7/7vr///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////j9//+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP740LD+xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//+76f7/i9r9/2PO + /P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Xyvv/ftb8/6nk/f/Y8/7//f7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Ti/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/utQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/vOr+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r9///K7v7/kdz9/1zL/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/991vz/tuj9/+35//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////vOr+/0bE + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+61Cw/sBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t7QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/0vH+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////6/f//xOz+/4LX/P9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/a9D8/6zl + /f/s+f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///S8f7/T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ewAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9nz/v+Q3P3/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7/3PT/P+86v7/+f3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+D1/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP77ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/5Pf+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////7/v//uOj9/2fP/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+/+W3v3/5/f+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5Pf+/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP77ULD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7zULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//+j4v3/U8j7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/991vz/1fL+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////q+P//Xcv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8/v//6Dh/f9Nx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/900/z/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+/6//9jzfz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///4/f//qOP9/03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/920/z/2/P+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////7/r//13L/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD++5Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+/6/7/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+G2fz/6/n///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////q+P//Wsv8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++5Cw/scAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+H1 + /v9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG+/+n4/3/+/7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+T3 + /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3dCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////+/7//6Hh + /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/U8f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////4PX+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t3AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/v6QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/0vH+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////3fT+/2XO + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5be/f/5/f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////S8f7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD + +zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/vNQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/vOr+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////+////qeT9/0bE + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/X8z8/9vz + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7zq/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t0QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////w+v//d9T8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9GxPv/q+T9//7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////pOL9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP79kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////Y8/7/V8r7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+A1/z/9vz///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v2QsP7IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+66f7/R8X7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2LN/P/k9/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//2bP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7YELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+b3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7/8ru/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/T8f7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD + ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8vv/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////z+//+I2fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/tuj9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////8vv + /v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++lCw/sOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Lh/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//961fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/9ay/z/btH8/4DX + /P+L2v3/mN79/6Dh/f+g4f3/qOP9/6Dh/f+g4f3/nN/9/4/b/f+C1/z/dNP8/1/M/P9Jxfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4f3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////ouH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yRCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/9/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////T7//9u0fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/4LX/P+o4/3/ye7+/+f3/v/9/v////////// + /////////////////////////////////////////////////////////////////////////////+/6 + ///R8P7/s+f9/47b/f9pz/z/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Hc + /f/+//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////3+//9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/skAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/uyQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//o+P////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////T7//9q0Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Vsn7/47b/f/A6/7/7fn///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////j9///Q8P7/n+H9/2nP/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/j9v9//7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6Pj//03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7sgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//9y0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/1rL/P+a3/3/2fP+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////7vr//7Ln/f9z0/z/Q8P7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+P2/3//v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sBQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////v+//900/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Hxfv/iNn8/9Hw/v/+//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+v5 + //+l4/3/W8v8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4XY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7z0LD+wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7U0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/8fv///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+E2Pz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH + +/+k4v3/7/r///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7////G7f7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/n+D9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////x+///Usj7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+Z3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7/6bj + /f/2/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////Q8P7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+1hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+56f7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Ixfv/oOH9//b8 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Q8P7/bND8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8nu/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////e9X8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/vcQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+r4//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////Y8/7/R8X7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz/5/f+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////7///+56f7/Usj7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+r4 + //9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6vk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////y+///V8r7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ+//J7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////X8 + //+U3f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1/M + /P/1/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////q+T9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sBQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/7/v////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////f9b8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////8/w/v9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP71ELD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7SkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//I7v7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////uen+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/7zq/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9fz//4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////yO7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////8fv//07H + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////s+f9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7//H7//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/4fX+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////57g + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//T7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////X8v7/Vsn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+e4P3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4fX+/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/ulQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////7/ + //9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//v+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9kzvz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//7///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///h9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//7///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////9Pv//3LS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//i9v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7ekLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////xe3+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///7/v//e9X8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+O2/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +//p+P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7jo/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////6fj//0fF + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+91Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+R3P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////H7f7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/i9r9//7///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//3LS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//K7v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/5Pf+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5Pb+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//3+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////1/P//Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4/b+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5Pf+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7+ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/f9b8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7///9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8//P7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+v5//9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//7/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9/1vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7FAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/9Tx/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////mN79/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/970/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////1fL+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+8NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/23R/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+z5//9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+p5P3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0vG + +//s+f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vDAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/v+QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////s+f9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT/P/+//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v///3TT + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+y5/3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////vOr+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/kLD + +xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/twQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+W3v3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///y+///Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+W3v3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r9//9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7yELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/ld39//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////6rk + /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3rV/P/y+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +/+q5P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ld39/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////4fX+/4HX/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zc78/8Dr/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////8Dr/v9mzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7/4HX + /P/h9f7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////8vv//8Dr/v+i4f3/lN39/5/g/f+56f7/4fX+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+H2/v+36P3/oOH9/5Td/f+h4f3/wOv+//L7 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/u0QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+y5/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////7Ln + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sIQsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/7/r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///v+v//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/d9T8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3fU/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+5BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7bo/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uQAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+//y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////8vv//0XE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP72QAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sbAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7V0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qeT9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+5JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/971/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////971/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vNAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/ELD+wwAAAAAAAAAAAAAAAAAAAAAQsP7Q0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+/6/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tDAAAAAAAAAAAAAAAAAAAAAELD+3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7////+//////////////////////////////////////////// + //////////////////////////////////////////////z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////v+//////////////////////////////////////////////// + ////////////////////////////////////////+/7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////6/n//0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK + +/////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/2rQ/P9ExPv/RMT7/2nP/P+/6/7///////////////////////// + ///////////////////////////////////k9/7/hNj8/0zG+/9Cw/v/V8r7/5nf/f/1/P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////R8P7/dNP8/0bE+/9Cw/v/YM38/63l/f/9/v////////////////////////// + /////////////////////////////+/6//+R3P3/Ucj7/0LD+/9Px/v/i9r9/+z5//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAQsP71kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+F2Pz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////neD9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5je/f////////////// + ///////////////////////////////////W8v7/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YM38//L7 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+26P3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ftb8//3+//////////////// + /////////////////////////////+j4//9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9TyPv/4vb+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////hdj8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vWAAAAAAAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////ze/+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/yu7+//// + ///////////////////////////////////7/v//Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+F2Pz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////l9/7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+t5f3///////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2nP + /P/+//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAELD+zFCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/9rz/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV + /P//////////////////////////////////////xOz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7//H7//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////nN/9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8//// + ///////////////////////////////////i9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/2PP+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////a8/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sxAAAAAAAAAABCw/tgQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0TE+//6/f////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9cy/z//////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//U8f7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3rV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//7/v//////////////////////////////////v+v+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/7bo/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+v3//0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAQsP7jULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9hzfz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD + +65Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////g9j8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uuAAAAAAAA + AABCw/vPQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7zwAA + AAAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////G7f7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/AAAAAAQsP7EELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////4PX+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7EELD+zBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//j9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////j9//9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+zBCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////3+///k9v7/U8j7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/6Dh + /f9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8/6Dh/f+g4f3/oOH9/6Dh + /f+m4/3/y+/+//z+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+v5//+15/3/oeH9/6Dh/f+g4f3/oOH9/6Dh/f9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/33W + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+W3v3/8/v///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////U8j7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tSQsP7akLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Y8/7/neD9/27R/P9Hxfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9dy/z/0vH+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//5be/f9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Xyvv/hdj8/7fo + /f/y+/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////2vQ + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7akLD+31Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9Pv//6nk/f9cy/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//Q8P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////v///33W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RcT7/33W/P/R8P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+D2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+31Cw/uSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//quT9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//n9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/a8/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uSQsP7pULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+l4/3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////d9P7/ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5zf/f/7/v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////6Xj/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7pULD+7hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/s+f9//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////A6/7/ScX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////6/f//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cNL8//H7//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7hCw/vLQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP73kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//Q8P7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////B6/7/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO + /P/3/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73kLD++BCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/2/T+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////f9f7/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////b9P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++BCw/vvQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/+f3/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////9/v//ac/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP78ELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//n9/7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////seb9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//b8//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/7fn///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+P3//1TJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+m4/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////s+f//QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Vcn7//z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////8/v//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P+Z3/3/x+3+/+j4 + ///3/P////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////3+///v+v//3vX+/7Ln/f9+1vz/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//H7f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////P7//9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////u+v//Q8P7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/7bo/f/+//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+n4//+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/itr9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////z+///QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////uen+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/XMv8/+f3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6rk/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ+/////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////8/v//0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//t+f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////5Hc/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+X3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////lt79/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/6fj///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+35 + //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/5/f+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9t0fz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////n9 + //9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/BCw/vvQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+f3/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////Vcn7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+//4/f////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+t5f3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP74ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//b9P7///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v///0PD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+C1/z///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/md/9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9v0/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP74ELD+95Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////P7 + //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qOP9//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////Q8P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+95Cw/vLQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///v+v//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7np + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////2DN/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP7uELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+z5/3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8/v//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//A6/7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7Pn/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7uELD+6VCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/peP9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5nf/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+l4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6VCw/uTQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5fe/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/5nf/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+f3//0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+o4/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uTQsP7fULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+D2Pz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3DS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9mz/z///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////8zv/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4PY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7fULD + +2pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/a9D8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9jz/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+r4//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9r0Pz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +2pCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////wuz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9v0fz//f7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////T8f7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13L/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////U8j7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tSQsP7MELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/+P3///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////b8//9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//Vcn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+X3v3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7MELD+xBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////gtf8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//X8//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////Q8P7/Vcn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2vP+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+xAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9jz/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Uyfv/p+P9/+f3 + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+f3//83v/v9+1vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cdL8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////G7f7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/AAAAAAAAAAAELD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////dtP8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/V8r7/3fU/P+F2Pz/k939/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td + /f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/1bJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/etX8/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td + /f+U3f3/lN39/5Td/f+U3f3/lN39/43b/f+A1/z/bND8/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/87v/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////peL9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vPAAAAAAAAAABCw/uuQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4PY/P////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+T3 + /v9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////4PY + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rgAAAAAAAAAAQsP7jULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9hzfz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////qOP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+//v+v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD+2BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7//r9 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7///+C1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF+//T8f7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/f//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tgAAAAAAAAAABCw/syQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//a8/7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/7//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//F7f7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////2vP+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//i9r9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+//Q8P7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAAAAAABCw/vWQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4XY/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+46P3/Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3PT/P/q+P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9YAAAAAAAAAAAAAAAAAAAAAQsP7qULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9ay/z///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////2/T+/1vL/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+U3f3/+/7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAELD + +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////xe3+/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS + /P/0+/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////6/n//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAA + AABCw/tDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////x+3+/0bE+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/atD8//f8//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0MAAAAAAAAAAAAA + AAAAAAAAQsP7DELD+/xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////3PT+/0nF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+A1/z//v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+O2/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/sMAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//13M/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/67l/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7kkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3vX+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////5zg/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////3vX+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7kgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1dCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6nk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+z5//9Ixfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/etX8/7Pn + /f/b9P7/9/z///////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + ///////////////////+////7vr//8nu/v+c4P3/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////6nk/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+a3/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9x0vz/4vb+//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////z+//+z5/3/S8b7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/7fn///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+9lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7//L7 + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////+////Usj7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////930/v9RyPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6rk/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////y+///RcT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/uQQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+26P3///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////0vH+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz//P7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////zu/+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////tuj9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/d9T8//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////57g + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1/L+//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//X8 + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3fU/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/v2QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0XE+//v+v////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //951Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Y878//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//R8P7///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9FxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/ZCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7tELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/suf9//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Td + /f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////j9//9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/sOb9//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/u0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+o4/3///////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////Usj7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6Ti/f////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/seQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/tuj9//////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////1zL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+X3v3///////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////4PX+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+8hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5be/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6jj/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////5be + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/twQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+U3f3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ + /P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////4/f//Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD+/5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Y878//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+I2fz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //+86v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////btH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Y8/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////4HX/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xe3+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Tx + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/bND8//z+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////5/f+/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+b3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xRCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9/1vz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+f3 + /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////970/v9RyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/sUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7qULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Q8P7/+T3/v////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/j9v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////P7//7Pn/f9Lxvv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+E2Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+T3/v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/+R3P3///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9pz/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/3vV + /P+z5/3/3fT+//j9//////////////////////////////////////////////////////////////// + ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////////////////////////////////// + /////////////////////////v///+76///K7v7/nOD9/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP73ULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/+n4//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////sOb9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/ScX7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H + +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7//r9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////p+P//R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////b8 + //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////jtv9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3oAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//z+/////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+6VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v+//9jzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+46P3///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/ulAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7/+H1/v////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////3PT+/0jF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz//v////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+H1/v9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+96v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/9fz///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tKQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8ju + /v////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7Pn///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////I7v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+9RCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9ezPz/+/7///////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ver+/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lN39//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////5/f//QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz/7/r///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9RCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6zl/f////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////c9P7/YM38/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////2TO/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/+Z3/3/+/7///// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7BELD+9xCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////v+ + //+m4/3/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ + +//3/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2zQ/P/Y8/7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vcQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tYQsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV/P////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////P7//+i4v3/WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD + +//I7v7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////f7//3XT + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/edT8/8zv/v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD + +9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7////Q8P7/l979/2TO/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ + +//J7v7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///4/f//itr9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/3rV/P+x5v3/6/n///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1LI+//y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9/z//1bJ+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/a9D8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4DX/P+U3f3/lN39/5Td/f+U3f3/m9/9/7/r + /v/4/f////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////h9v7/qeT9/5Xd/f+U3f3/lN39/5Td/f+U3f3/Vsn7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4/b/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f910/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////L7//9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7AULD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/htn8//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////Wcr7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////// + //+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo + /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/+j4 + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////1nK + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+/////////////////////////////// + ////////oOH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////cdL8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// + //+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/uyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz//f7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv///////////////////////// + /////////////6Dh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////3HS + /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////// + ////////uOj9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////9/v//btH8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/6Li/f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////// + //////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////// + /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////ouL9/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP76ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Dw/v/y+/+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////2DM/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P////////////// + ////////////////////////peP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Xy + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7//z+//////////////// + ///////////////////B6/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/uOj9//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////y+/+/0PD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2BCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//n9/7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+B1/z///////// + /////////////////////////////8ru/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +//1/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////6Lh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO/P////////////// + ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/970 + /v////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/0/H+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Z8/8//n9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////2PP+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1PH+//// + ///////////////////////////////////9/v//Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+Q3P3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////s+f//Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+56f7///////// + //////////////////////////////////991vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT + /P////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//2fP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +yNCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+u5f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/q+T9//// + /////////////////////////////////////////////+H2/v9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/+P3///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////8ft/v9Ixfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+R3P3///////// + ////////////////////////////////////////8fv//2PO/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M + /P/s+f////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4jZ/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7dELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////9Tx/v9/1vz/Vsn7/1bJ+/991vz/0vH+//// + ////////////////////////////////////////////////////////8Pr//5nf/f9gzfz/Usj7/2rQ + /P+t5f3/+/7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////4fb+/4jZ/P9ay/z/U8j7/3TT/P/B6/7///////// + ///////////////////////////////////////////////////3/P//peL9/2bO/P9SyPv/ZM78/6Dh + /f/1/P////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wRCw/vMQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ver+//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////73q/v9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7MELD+/pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE + +//S8f7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Lx/v9GxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t3QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/T8f7/+H1/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v9Px/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+T3/v9Wyfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP77kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P/q+P////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9ay/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1RCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcz8/+/6//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9dzPz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//9jzfz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +whCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P/q+P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+r4//9dzPz/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sIAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7IELD++1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wsv8/+T3 + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+T3/v9ay/z/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Wyfv/4fX+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+H1/v9Wyfv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0/H+//S8f7///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Lx/v9Px/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t7AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7rULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/73q/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////73q/v9GxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7AQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD++NCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz/+f3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+f3//4jZ/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP78ULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2fP/P/n9/7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////5/f+/2fP/P9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7LgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7VULD+/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Dw/v/ouL9//3+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////9/v//ouL9/0PD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7VQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/tlQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9u0fz/6Pj///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////o+P//btH8/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ZQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////++6v7/Tcf7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7eELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4bZ/P/y+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////L7//+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t4QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7/7/r/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////7/r/v9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7dULD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Mxvv/rOX9//v+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/v//rOX9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tlQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9ezPz/ye7+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////J7v7/Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7ZQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+H1/v931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7QULD+/FCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/+I2fz/5/f+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////5/f+/4jZ/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7QQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP740LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/+O2/3/6fj///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////p+P//jtv9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7LgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0jF + +/+R3P3/5ff+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+X3/v+R3P3/SMX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CkLD+61Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0PD+/9/1vz/1PH+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////1PH+/3/W/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7CgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7e0LD + +/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz/ver+//r9//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////r9 + //+96v7/bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/t7QsP7AQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/lt79/+D1/v////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////4PX+/5be + /f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+yBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/btH8/7Ln + /f/v+v////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+/6//+y5/3/btH8/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7CULD+51Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/RcT7/3fU/P+26P3/8vv///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////y+///tuj9/3fU/P9FxPv/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+51Cw/sJAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP7v0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7/47b/f+/6/7/7Pn///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////7Pn//7/r/v+O2/3/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/t4QsP7+kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9ay/z/hdj8/7Hm/f/b8/7/+v3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/f//2/P+/7Hm/f+F2Pz/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7eELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +zBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/9hzfz/g9j8/6Xj/f/G7f7/4PX+//j9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+P3//+D1/v/G7f7/peP9/4PY + /P9hzfz/RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7BELD+3RCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/U8j7/2vQ + /P+D2Pz/l979/6Xj/f+z5/3/wev+/9Hw/v/b9P7/5/f+/+f3/v/t+f//8/v///T7///0+///8/v//+35 + ///n9/7/5/f+/9v0/v/R8P7/wev+/7Pn/f+l4/3/l979/4PY/P9r0Pz/U8j7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/t0QsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQsP7I0LD+71Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP7i0LD+/pCw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7i0LD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7skLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/uyQsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wFCw/tTQsP71kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP71kLD+1NCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/tYQsP73ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vcQsP7WELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/tKQsP7vELD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vELD + +0pCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/sxQsP7pULD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/ulQsP7MQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+3pCw/sYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7Q0LD+6pCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/uqQsP7Q0LD+wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7FELD+21Cw/vDQsP7/kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7w0LD+21Cw/sUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +xpCw/txQsP7yELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8hCw/txQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/seQsP7bkLD+7VCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/ZCw/u1QsP7bkLD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+0dCw/uQQsP72ULD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vZQsP7kELD+0dCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD + +5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD + +1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+wxCw/tDQsP7ekLD+6lCw/vWQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+9ZCw/upQsP7ekLD+0NCw/sMAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/syQsP7YELD+41Cw/uuQsP70ELD + +/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/BCw/vQQsP7rkLD+41Cw/tgQsP7MkLD+wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7EELD+zFCw/tSQsP7akLD+31Cw/uTQsP7pkLD+7hCw/vLQsP73kLD++BCw/vwQsP78ELD + +/hCw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/vwQsP74ELD+95Cw/vLQsP7uELD+6ZCw/uTQsP7fULD + +2pCw/tSQsP7MULD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////4AAAf + ////////////////////////////////////8AAAAAAP//////////////////////////////////4A + AAAAAAB/////////////////////////////////wAAAAAAAAAP///////////////////////////// + //wAAAAAAAAAAD//////////////////////////////4AAAAAAAAAAAB/////////////////////// + //////8AAAAAAAAAAAAA////////////////////////////+AAAAAAAAAAAAAAf//////////////// + ///////////AAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAAP////////// + ///////////////4AAAAAAAAAAAAAAAAH////////////////////////+AAAAAAAAAAAAAAAAAH//// + ////////////////////gAAAAAAAAAAAAAAAAAH///////////////////////4AAAAAAAAAAAAAAAAA + AH//////////////////////+AAAAAAAAAAAAAAAAAAAH//////////////////////gAAAAAAAAAAAA + AAAAAAAH/////////////////////4AAAAAAAAAAAAAAAAAAAAH////////////////////+AAAAAAAA + AAAAAAAAAAAAAH////////////////////wAAAAAAAAAAAAAAAAAAAAAP///////////////////8AAA + AAAAAAAAAAAAAAAAAAAP///////////////////gAAAAAAAAAAAAAAAAAAAAAAf///////////////// + /4AAAAAAAAAAAAAAAAAAAAAAAf//////////////////AAAAAAAAAAAAAAAAAAAAAAAA//////////// + //////wAAAAAAAAAAAAAAAAAAAAAAAA/////////////////+AAAAAAAAAAAAAAAAAAAAAAAAB////// + ///////////gAAAAAAAAAAAAAAAAAAAAAAAAB////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAD + ////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH///////////////8AAAAAAAAAAAAAAAAAAAAA + AAAAAP///////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////4AAAAAAAAAAAAAAAA + AAAAAAAAAAAf//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////4AAAAAAAAAAA + AAAAAAAAAAAAAAAAB//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////4AAAAAA + AAAAAAAAAAAAAAAAAAAAAAH/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////4A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAf////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////// + ///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/// + ////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAP//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////////AAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAD/////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////////gAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////gAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAB////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////gAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/ + //////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAP//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////gAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAB//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAA/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////4AAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + P////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAB////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//4AAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + Af//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAD///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///+AAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////wAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAf////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAP/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////+AAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////wAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAD///////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////+AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// + /4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/ + ///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAH////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAH/////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////AAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAD/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////wAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAD///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////////AA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////// + ///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/// + /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAA + Af/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////+AAAAAAAAAAAAAAAAAAAAAA + AAAAAAf/////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////4AAAAAAAAAAAAAAAA + AAAAAAAAAAAf//////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////wAAAAAAAAAA + AAAAAAAAAAAAAAAA////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH////////////////AAAAA + AAAAAAAAAAAAAAAAAAAAA////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAH//////////////// + +AAAAAAAAAAAAAAAAAAAAAAAAB/////////////////8AAAAAAAAAAAAAAAAAAAAAAAAP/////////// + //////8AAAAAAAAAAAAAAAAAAAAAAAD//////////////////4AAAAAAAAAAAAAAAAAAAAAAAf////// + ////////////4AAAAAAAAAAAAAAAAAAAAAAH///////////////////wAAAAAAAAAAAAAAAAAAAAAA// + //////////////////wAAAAAAAAAAAAAAAAAAAAAP////////////////////gAAAAAAAAAAAAAAAAAA + AAB/////////////////////gAAAAAAAAAAAAAAAAAAAAf/////////////////////gAAAAAAAAAAAA + AAAAAAAH//////////////////////gAAAAAAAAAAAAAAAAAAB///////////////////////gAAAAAA + AAAAAAAAAAAAf///////////////////////gAAAAAAAAAAAAAAAAAH////////////////////////g + AAAAAAAAAAAAAAAAB/////////////////////////gAAAAAAAAAAAAAAAAf//////////////////// + /////wAAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAD//////////////// + ///////////4AAAAAAAAAAAAAB////////////////////////////8AAAAAAAAAAAAA//////////// + /////////////////+AAAAAAAAAAAAf//////////////////////////////AAAAAAAAAAAP/////// + ////////////////////////wAAAAAAAAAP////////////////////////////////+AAAAAAAAf/// + ///////////////////////////////wAAAAAA/////////////////////////////////////4AAAf + //////////////////8oAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xNCw/tiQsP7pELD+9JCw/vzQsP7/0LD + +/9Cw/vzQsP70kLD+6RCw/tiQsP7EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytCw/unQ8P7+kLD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7p0LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+w1Dw/uWQ8P7/kLD+/9Cw/v/QsP7/0bE + +/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ/P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srR8X74ULD+/9Cw/v/QsP7/3XT + /P/A6/7/+P3///////////////////////////////////j9///A6/7/ddP8/0LD+/9Cw/v/QsP7/0LD + +9tCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7N0bE+/RCw/v/QsP7/2PO + /P/S8f7/////////////////////////////////////////////////////////////////0vH+/2PO + /P9Cw/v/QsP7/0LD++9Cw/s3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytGxPv1QsP7/0LD + +/+O2/3/+v3///////////////////j9///K7v7/peP9/5Td/f+W3v3/p+P9/87v/v/6/f////////// + ////////+v3//47b/f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sNS8b75kLD + +/9Cw/v/n+D9//////////////////P7//+X3v3/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H + +/+d4P3/9vz//////////////////5/g/f9Cw/v/QsP7/0LD+9tCw/sNAAAAAAAAAAAAAAAAAAAAAFDH + +6FCw/v/QsP7/47b/f/////////////////V8v7/Vcn7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Yyvv/2vP+/////////////////47b/f9Cw/v/QsP7/0LD+5UAAAAAAAAAAAAA + AABCw/srQ8P7/kLD+/9jzvz/+v3/////////////1PH+/0nF+/9Cw/v/QsP7/2LN/P+05/3/6Pj///7/ + ///8/v//5Pf+/6/m/f9dzPz/QsP7/0LD+/9Kxvv/2PP+////////////+v3//2PO/P9Cw/v/QsP7/ULD + +ysAAAAAAAAAAFXJ+7lCw/v/QsP7/9Lx/v////////////z+//9Xyvv/QsP7/0LD+/+f4P3//P7///// + //////////////////////////////v+//+Z3/3/QsP7/0LD+/9Xyvv//P7/////////////0vH+/0LD + +/9Cw/v/QsP7pwAAAABCw/sTRcT7/ULD+/910/z/////////////////+v3//0/H+/9Cw/v/nuD9//// + //////////////////////////////////////////////////+c4P3/QsP7/0/H+//7/v////////// + ////////ddP8/0LD+/9Cw/v5QsP7E0/H+2lCw/v/QsP7/8Dr/v//////////////////////5ff+/83v + /v/+//////////////////////////////////////////////////////////7////N7/7/5ff+//// + ///////////////////A6/7/QsP7/0LD+/9Cw/tiXMv8vkLD+/9GxPv/+P3///////////////////// + ////////7fn////////v+v/////////////////////////////////////////////v+v///////+76 + ///+//////////////////////////j9//9GxPv/QsP7/0LD+6RUyfvoQsP7/2rQ/P////////////// + /////////////9Xy/v9GxPv/9fz//0PD+//h9v7/////////////////////////////////7Pn//0LD + +//k9/7/Usj7/8ft/v///////////////////////////2rQ/P9Cw/v/QsP70kjF+/tCw/v/h9n8//// + ///////////////////V8v7/fdb8/0LD+/951Pz/QsP7/3HS/P/T8f7//////////////////////9v0 + /v910/z/QsP7/3HS/P9FxPv/d9T8/9Dw/v//////////////////////h9n8/0LD+/9Cw/vzQsP7/0LD + +/+U3f3/////////////////3vX+/0bE+/9Cw/v/Vcn7/1nK+/9TyPv/QsP7/6Dh/f////////////// + ////////rOX9/0LD+/9SyPv/Wcr7/1XJ+/9Cw/v/Q8P7/9Px/v////////////////+U3f3/QsP7/0LD + +/9Cw/v/QsP7/5Td/f////////////////+l4/3/QsP7/7Tn/f///////////9Dw/v9Cw/v/oOH9//// + //////////////////+s5f3/QsP7/8Ts/v///////////8Dr/v9Cw/v/md/9/////////////////5Td + /f9Cw/v/QsP7/0jF+/tCw/v/h9n8/////////////////6fj/f9Cw/v/vOr+////////////0PD+/0LD + +/+g4f3//////////////////////6zl/f9Cw/v/xOz+////////////x+3+/0LD+/+Z3/3///////// + ////////h9n8/0LD+/9Cw/vzVcn76ULD+/9q0Pz/////////////////7Pn//1TJ+/9Dw/v/WMr7/1nK + +/9TyPv/QsP7/6Dh/f//////////////////////rOX9/0LD+/9SyPv/Wcr7/1nK+/9Dw/v/T8f7/+T3 + /v////////////////9q0Pz/QsP7/0LD+9JezPzBQsP7/0bE+//4/f/////////////z+///Wcr7/0TE + +/9s0Pz/cdL8/2XO/P9Cw/v/oOH9//////////////////////+s5f3/QsP7/2LN/P9x0vz/bND8/0fF + +/9SyPv/7Pn/////////////+P3//0bE+/9Cw/v/QsP7pFTJ+2xCw/v/QsP7/8Dr/v///////////73q + /v9Cw/v/reX9////////////0PD+/0LD+/+g4f3//////////////////////6zl/f9Cw/v/xOz+//// + ////////uun+/0LD+/+v5v3////////////A6/7/QsP7/0LD+/9Cw/tiQsP7E0XE+/1Cw/v/ddP8//// + ////////xOz+/0LD+/+C1/z/4vb+/+f3/v++6v7/QsP7/6Dh/f//////////////////////rOX9/0LD + +/+z5/3/5/f+/+P2/v+M2/3/QsP7/7np/v///////////3XT/P9Cw/v/QsP7+ULD+xMAAAAAWcr7vkLD + +/9Cw/v/0vH+///////4/f//ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////// + //+u5f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/9Pv////////S8f7/QsP7/0LD+/9Cw/unAAAAAAAA + AABCw/srQ8P7/0LD+/9jzvz/+v3////////4/f//peL9/0LD+/+a3/3/QsP7/5Hc/f/o+P////////// + /////////////+76//+X3v3/QsP7/47b/f9Hxfv/m9/9//b8////////+v3//2PO/P9Cw/v/QsP7/ULD + +ysAAAAAAAAAAAAAAABWyfunQsP7/0LD+/+O2/3////////////n9/7/f9b8//r9//961fz/7/r///// + //////////////////////////////b8//961fz/8vv//4fZ/P/e9f7///////////+O2/3/QsP7/0LD + +/9Cw/uVAAAAAAAAAAAAAAAAAAAAAELD+w1Nx/vpQsP7/0LD+/+f4P3///////////////////////// + ////////////////////////////////////////////////////////////////////////n+D9/0LD + +/9Cw/v/QsP720LD+w0AAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytIxfv3QsP7/0LD+/+O2/3/+v3///// + ////////////////////////////////////////////////////////////////////////+v3//47b + /f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zdHxfv2QsP7/0LD + +/9jzvz/0vH+/////////////////////////////////////////////////////////////////9Lx + /v9jzvz/QsP7/0LD+/9Cw/vvQsP7NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD + +ytKxvvlQsP7/0LD+/9Cw/v/dtP8/8Dr/v/4/f//////////////////////////////////+P3//8Dr + /v920/z/QsP7/0LD+/9Cw/v/QsP720LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+w1IxfuaQ8P7/kLD+/9Cw/v/QsP7/0bE+/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ + /P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srRcT7qkPD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ULD+6dCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7E0LD+2JCw/ukQ8P71EPD + +/VCw/v/QsP7/0LD+/NCw/vSQsP7pELD+2JCw/sTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP/wD///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABgAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gA + AB/8AAA//gAAf/+AAf//8A//KAAAADAAAABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD+/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD + +yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7GELD+3ZCw/vSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vSQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCw/sIQsP7gELD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG + +/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD + +4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y1Cw/vXQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td + /f/E7P7/6vj//////////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/33W + /P/Q8P7//v////////////////////////////////////////////////////////////////////7/ + ///Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// + /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD + +/9Cw/v/R8X7/7Hm/f/+//////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkLD + +/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////7////S8f7/oOH9/3zV + /P9mzvz/Wcr7/1rL/P9pz/z/gNf8/6Xj/f/Z8/7//////////////////////////////////////9vz + /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABCw/stQ8P7+ULD+/9Cw/v/QsP7/1zL/P/p+P/////////////////////////////4/f//quT9/1jK + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8/7Ln/f/7/v////////// + ///////////////////p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+whGxPvbQsP7/0LD+/9Cw/v/Vsn7/+n4/////////////////////////////8/w + /v9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9izfz/1/L+////////////////////////////6fj//1bJ+/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4BCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// + ////////p+P9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/SMX7/0zG+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/7Dm/f///////////////////////////9vz/v9Hxfv/QsP7/0LD + +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////// + //////////////////+c3/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9cy/z/pOL9/9by/v/3/P////////// + ///3/P//0PD+/53g/f9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4v3///////////////////////// + //+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD+x8AAAAAAAAAAAAAAAAAAAAAR8X7nELD+/9Cw/v/QsP7/27R + /P/+/////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/Ucj7/7np/v/+//////////// + ///////////////////////////////////7/v//sOb9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/uen+//// + ///////////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAAAABCw/sYQ8P7/ELD + +/9Cw/v/QsP7/9rz/v//////////////////////+/7//07H+/9Cw/v/QsP7/0LD+/9lzvz/6vj///// + /////////////////////////////////////////////////////////////+X3/v9gzPz/QsP7/0LD + +/9Cw/v/Tsf7//v+////////////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAA + AABDw/t3QsP7/0LD+/9Cw/v/fdb8////////////////////////////+P3//0bE+/9Cw/v/QsP7/1zL + /P/v+v////////////////////////////////////////////////////////////////////////// + ///v+v//Wsv8/0LD+/9Cw/v/RsT7//j9/////////////////////////////33W/P9Cw/v/QsP7/0LD + +/9Cw/t2AAAAAAAAAABMxvvdQsP7/0LD+/9Cw/v/0PD+/////////////////////////////////63l + /f9Lxvv/Yc38/9/1/v////////////////////////////////////////////////////////////// + ////////////////////////3/X+/2HN/P9Lxvv/reX9/////////////////////////////////9Dw + /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAELD+yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7///9Zyvv/QsP7/0LD+/9Cw/v/QsP7IELD+2BCw/v/QsP7/0LD+/+U3f3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YE/H+6RCw/v/QsP7/0LD + +//E7P7///////////////////////////////////////////+s5f3/md/9///////N7/7/gtf8//X8 + ////////////////////////////////////////////////////////+/7//4ra/f/A6/7//////6jj + /f+c4P3////////////////////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mVLI + +9FCw/v/QsP7/0LD+//q+P////////////////////////////////////////////9Zyvv/QsP7//// + //+J2v3/QsP7/9Dw/v//////////////////////////////////////////////////////3vT+/0LD + +/9z0/z//////0/H+/9Dw/v////////////////////////////////////////////q+P//QsP7/0LD + +/9Cw/v/QsP7wEvG+/FCw/v/QsP7/0rG+///////////////////////////////////////9fz//7np + /v9Nx/v/QsP7/5Td/f9gzfz/QsP7/4DX/P+t5f3//v////////////////////////////////////// + //+36P3/hdj8/0LD+/9Wyfv/lN39/0bE+/9Cw/v/s+f9//H7//////////////////////////////// + ////////Ssb7/0LD+/9Cw/v/QsP75kbE+/pCw/v/QsP7/1vL/P////////////////////////////// + ///Y8/7/VMn7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3/X+//////////////////// + /////////////+76//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//P8P7///////// + ////////////////////////W8v8/0LD+/9Cw/v/QsP79ELD+/9Cw/v/QsP7/2XO/P////////////// + //////////////7///9dy/z/QsP7/0LD+/9Nx/v/ZM78/2XO/P9lzvz/V8r7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/1XJ+/9lzvz/Zc78/2XO/P9Px/v/QsP7/0LD + +/9RyPv/9/z/////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO + /P///////////////////////////9vz/v9Cw/v/QsP7/4DX/P/7/v//////////////////uOj9/0LD + +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl/f////////////// + ///+////kdz9/0LD+/9Cw/v/yO7+////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0bE + +/pCw/v/QsP7/1vL/P///////////////////////////8vv/v9Cw/v/QsP7/8Hr/v////////////// + ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl + /f//////////////////////1fL+/0LD+/9Cw/v/uen+////////////////////////////W8v8/0LD + +/9Cw/v/QsP79EvG+/FCw/v/QsP7/0rG+////////////////////////////+X3/v9Cw/v/QsP7/4va + /f/+////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 + /v9Cw/v/QsP7/6zl/f//////////////////////nOD9/0LD+/9Cw/v/0/H+//////////////////// + ////////Ssb7/0LD+/9Cw/v/QsP75lPI+9NCw/v/QsP7/0LD+//q+P////////////////////////// + //971fz/QsP7/0LD+/9Yyvv/cdL8/3HS/P9x0vz/X8z8/0LD+/9Cw/v/2/T+//////////////////// + /////////////+f3/v9Cw/v/QsP7/1zL/P9x0vz/cdL8/3HS/P9dy/z/QsP7/0LD+/9pz/z//v////// + ///////////////////q+P//QsP7/0LD+/9Cw/v/QsP7wFPI+6hCw/v/QsP7/0LD+//E7P7///////// + ///////////////////w+v//T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF + +//m9/7////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mUTE+2FCw/v/QsP7/0LD + +/+U3f3///////////////////////////+R3P3/QsP7/0LD+/9mzvz/htn8/4jZ/P+I2fz/btH8/0LD + +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/2nP/P+I2fz/iNn8/4jZ + /P9s0Pz/QsP7/0LD+/991vz///////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YELD + +yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////z+//9Hxfv/QsP7/3zV/P////////////// + ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl + /f//////////////////////j9v9/0LD+/9Cw/v/7/r///////////////////7///9Zyvv/QsP7/0LD + +/9Cw/v/QsP7IAAAAABOx/vgQsP7/0LD+/9Cw/v/0PD+//////////////////P7//9Cw/v/QsP7/5je + /f//////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 + /v9Cw/v/QsP7/6zl/f//////////////////////rOX9/0LD+/9Cw/v/3vT+/////////////////9Dw + /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAAAAAABGxPt5QsP7/0LD+/9Cw/v/fdb8//////////////////7/ + //9SyPv/QsP7/0/H+/+56f7/2fP+/9v0/v/b9P7/ouH9/0LD+/9Cw/v/2/T+//////////////////// + /////////////+f3/v9Cw/v/QsP7/5je/f/b9P7/2/T+/9vz/v+/6/7/V8r7/0LD+/9GxPv/9vz///// + /////////////33W/P9Cw/v/QsP7/0LD+/9Cw/t2AAAAAAAAAABCw/sYRMT7/ULD+/9Cw/v/QsP7/9rz + /v////////////////+n4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// + /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/+V3f3/////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAAAAAAAAAATMb7oELD + +/9Cw/v/QsP7/27R/P/+///////////////+////peP9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Hxfv/7Pn///////////////////////////////////f8//9Ox/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/Ssb7/5vf/f/9/v/////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAA + AAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////////////////////z+//9Wyfv/QsP7/9v0 + /v971fz/QsP7/7Xn/f/s+f/////////////////////////////////////////////v+v//v+v+/0LD + +/9oz/z/2/T+/0vG+/9Cw/v/+/7///////////////////////+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD + +x8AAAAAAAAAAAAAAAAAAAAAAAAAAEbE+4NCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// + //9u0fz/Vcn7//////+d4P3/Q8P7/+D1/v////////////////////////////////////////////// + ////////7fn//0jF+/+J2v3//////2bO/P9Zyvv//////////////////////9vz/v9Hxfv/QsP7/0LD + +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whJxfvfQsP7/0LD+/9Cw/v/Vsn7/+n4 + ///////////////////4/f//9fz////////+////8Pr///////////////////////////////////// + //////////////////////////////H7///9/v////////j9///1/P//////////////////6fj//1bJ + +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/stRMT7+kLD + +/9Cw/v/QsP7/1zL/P/p+P////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7WkLD+/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9vz/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD+/9Cw/v/R8X7/7Hm/f/+//////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD + +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// + /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD + +/lCw/v/QsP7/0LD+/9Cw/v/QsP7/33W/P/Q8P7//v////////////////////////////////////// + //////////////////////////////7////Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD + +1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAELD+y1Dw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td/f/E7P7/6vj///// + /////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7gEPD+/lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0rG+/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7+ELD+4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD + +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQsP7GELD+3ZCw/vTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD + +/9Cw/v/QsP7/0LD+/9Cw/vTQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD + +/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//4Af//wAA//8AAP//AAD/+AAAH/8AAP/g + AAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAP + AADgAAAAAAcAAOAAAAAABwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAA + AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAA + AAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/gAAAAB/ + AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/AAD/4AAAB/8AAP/4AAAf/wAA//8AAP//AAD//+AH//8AAA== \ No newline at end of file diff --git a/NiceHashMiner/Resources/logo.ico b/NiceHashMiner/Resources/logo.ico index 99c98a6fdd5de158e021179b8b3d51625893d951..9d3aa7013cea24ef8ae5e98e2a1ef078cbf8c2e3 100644 GIT binary patch literal 285478 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 S_%<`(qv5L}F7SJS@BbfqF~a5m literal 71959 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 J!-r^k|9^mYwYLBO From 9adbf53b3f60cbf7d89d8b43d09cafb4f4bbf82b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 29 Sep 2016 10:48:30 +0200 Subject: [PATCH 060/366] ignore NVIDIA crypotnight default optimizations for Ti cards --- NiceHashMiner/Devices/ComputeDevice.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index f601e87..c2dcd02 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -204,7 +204,7 @@ public void SetDeviceBenchmarkConfig(DeviceBenchmarkConfig deviceBenchmarkConfig if (_cudaDevice != null) { if (DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(AlgorithmType.CryptoNight)) { var CryptoNightAlgo = DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.CryptoNight]; - if (_cudaDevice.SM_major >= 5) { + if (_cudaDevice.SM_major >= 5 && Name.Contains("Ti") == false) { CryptoNightAlgo.ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x" + _cudaDevice.SMX.ToString(); } } From aed18308f98feeb7b9b6c896cb957427751f3217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 29 Sep 2016 15:18:05 +0200 Subject: [PATCH 061/366] benchmark process read only output (stdout), ignore (stderr) --- NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/Miners/sgminer.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 251a3cd..76d9e67 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -97,7 +97,7 @@ protected Algorithm BenchmarkAlgorithm { } public BenchmarkProcessStatus BenchmarkProcessStatus { get; protected set; } protected string BenchmarkProcessPath { get; private set; } - private Process BenchmarkHandle = null; + protected Process BenchmarkHandle { get; private set; } protected Exception BenchmarkException = null; protected int BenchmarkTimeInSeconds; diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 8076731..0e52eaa 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -225,8 +225,8 @@ protected override void BenchmarkThreadRoutineStartSettup() { _benchmarkTimer.Reset(); _benchmarkTimer.Start(); - // call base - base.BenchmarkThreadRoutineStartSettup(); + // call base, read only outpus + BenchmarkHandle.BeginOutputReadLine(); } protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { From 6ab32895003d9c36c3716af96e5c34671b1c8258 Mon Sep 17 00:00:00 2001 From: Justsomedudeonthenet Date: Sun, 2 Oct 2016 09:27:39 -0400 Subject: [PATCH 062/366] Fix typo benchmakrs -> benchmarks --- NiceHashMiner/langs/en.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index b1c8071..9009b9c 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -256,7 +256,7 @@ "Form_Main_MINING_NOT_PROFITABLE": "CURRENTLY MINING NOT PROFITABLE.", "Form_Main_Group_Device_Rates": "Group/Device Rates:", "FormBenchmark_Benchmark_Step": "Benchmark step ( {0} / {1} )", - "FormBenchmark_Benchmark_Finish_Succes_MsgBox_Msg": "All benchmakrs have been successful", + "FormBenchmark_Benchmark_Finish_Succes_MsgBox_Msg": "All benchmarks have been successful", "FormBenchmark_Benchmark_Finish_Fail_MsgBox_Msg": "Not all benchmarks finished successfully. Retry to rebenchmark unbenchmarked algos or Cancel to disable unbenchmarked.", "FormBenchmark_Benchmark_Finish_MsgBox_Title": "Benchmark finished report", "FormBenchmark_Benchmark_GroupBoxStatus": "Benchmark progress status:", @@ -322,4 +322,4 @@ "AlgorithmsListView_ContextMenu_EnableAll": "Enable All Algorithms", "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable at least 1 device to proceed mining.", } -} \ No newline at end of file +} From ae28f70628d6d0ac396884022c3464185c8893ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 5 Oct 2016 16:21:30 +0200 Subject: [PATCH 063/366] add option to mine regardless of internet connection (will stop mining by default if no connection) --- NiceHashMiner/Configs/GeneralConfig.cs | 5 +++ NiceHashMiner/Forms/Form_Main.cs | 3 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 35 +++++++++++++++++-- NiceHashMiner/Forms/Form_Settings.cs | 7 ++++ NiceHashMiner/Helpers.cs | 11 ++++++ .../Interfaces/IMainFormRatesComunication.cs | 2 +- NiceHashMiner/Miners/MinersManager.cs | 31 +++++++++++----- NiceHashMiner/PInvoke/PInvokeHelpers.cs | 3 ++ NiceHashMiner/langs/en.lang | 3 ++ NiceHashMiner/langs/ru.lang | 3 ++ 10 files changed, 89 insertions(+), 14 deletions(-) diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index 7250ab5..20c3314 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -107,6 +107,9 @@ public int ApiBindPortPoolStart { } } public double MinimumProfit { get; set; } + + public bool ContinueMiningIfNoInternetAccess { get; set; } + public string hwid { get; set; } public bool DownloadInit { get; set; } @@ -169,6 +172,7 @@ public void SetDefaults() { MinimumProfit = 0; EthminerDagGenerationType = DagGenerationType.SingleKeep; DownloadInit = false; + ContinueMiningIfNoInternetAccess = false; } public GeneralConfig(bool initDefaults = false) { @@ -246,6 +250,7 @@ protected override void InitializeObject() { DisableAMDTempControl = _file.DisableAMDTempControl; DisableDefaultOptimizations = _file.DisableDefaultOptimizations; + ContinueMiningIfNoInternetAccess = _file.ContinueMiningIfNoInternetAccess; if (!IsNewVersion) { DownloadInit = _file.DownloadInit; } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 02bc03c..a84dcc3 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -440,8 +440,9 @@ public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPID UpdateGlobalRate(); } - public void ShowNotProfitable() { + public void ShowNotProfitable(string msg) { label_NotProfitable.Visible = true; + label_NotProfitable.Text = msg; label_NotProfitable.Invalidate(); } public void HideNotProfitable() { diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index c23aa6b..8b1c8ea 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -68,11 +68,13 @@ private void InitializeComponent() { this.pictureBox_LogToFile = new System.Windows.Forms.PictureBox(); this.checkBox_DebugConsole = new System.Windows.Forms.CheckBox(); this.groupBox_Main = new System.Windows.Forms.GroupBox(); + this.checkBox_ContinueMiningIfNoInternetAccess = new System.Windows.Forms.CheckBox(); this.pictureBox_WorkerName = new System.Windows.Forms.PictureBox(); this.pictureBox_MinProfit = new System.Windows.Forms.PictureBox(); this.pictureBox_ServiceLocation = new System.Windows.Forms.PictureBox(); this.pictureBox_Info_BitcoinAddress = new System.Windows.Forms.PictureBox(); this.textBox_MinProfit = new System.Windows.Forms.TextBox(); + this.pictureBox_ContinueMiningIfNoInternetAccess = new System.Windows.Forms.PictureBox(); this.label_BitcoinAddress = new System.Windows.Forms.Label(); this.label_MinProfit = new System.Windows.Forms.Label(); this.label_WorkerName = new System.Windows.Forms.Label(); @@ -161,6 +163,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinProfit)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ServiceLocation)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Info_BitcoinAddress)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ContinueMiningIfNoInternetAccess)).BeginInit(); this.groupBox_Localization.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_displayCurrency)).BeginInit(); @@ -563,7 +566,7 @@ private void InitializeComponent() { this.groupBox_Logging.Controls.Add(this.pictureBox_LogMaxFileSize); this.groupBox_Logging.Controls.Add(this.pictureBox_LogToFile); this.groupBox_Logging.Controls.Add(this.checkBox_DebugConsole); - this.groupBox_Logging.Location = new System.Drawing.Point(6, 240); + this.groupBox_Logging.Location = new System.Drawing.Point(6, 268); this.groupBox_Logging.Name = "groupBox_Logging"; this.groupBox_Logging.Size = new System.Drawing.Size(345, 70); this.groupBox_Logging.TabIndex = 388; @@ -638,11 +641,13 @@ private void InitializeComponent() { // // groupBox_Main // + this.groupBox_Main.Controls.Add(this.checkBox_ContinueMiningIfNoInternetAccess); this.groupBox_Main.Controls.Add(this.pictureBox_WorkerName); this.groupBox_Main.Controls.Add(this.pictureBox_MinProfit); this.groupBox_Main.Controls.Add(this.pictureBox_ServiceLocation); this.groupBox_Main.Controls.Add(this.pictureBox_Info_BitcoinAddress); this.groupBox_Main.Controls.Add(this.textBox_MinProfit); + this.groupBox_Main.Controls.Add(this.pictureBox_ContinueMiningIfNoInternetAccess); this.groupBox_Main.Controls.Add(this.label_BitcoinAddress); this.groupBox_Main.Controls.Add(this.label_MinProfit); this.groupBox_Main.Controls.Add(this.label_WorkerName); @@ -652,11 +657,22 @@ private void InitializeComponent() { this.groupBox_Main.Controls.Add(this.textBox_WorkerName); this.groupBox_Main.Location = new System.Drawing.Point(6, 6); this.groupBox_Main.Name = "groupBox_Main"; - this.groupBox_Main.Size = new System.Drawing.Size(345, 152); + this.groupBox_Main.Size = new System.Drawing.Size(345, 180); this.groupBox_Main.TabIndex = 386; this.groupBox_Main.TabStop = false; this.groupBox_Main.Text = "Main:"; // + // checkBox_ContinueMiningIfNoInternetAccess + // + this.checkBox_ContinueMiningIfNoInternetAccess.AutoSize = true; + this.checkBox_ContinueMiningIfNoInternetAccess.Location = new System.Drawing.Point(10, 149); + this.checkBox_ContinueMiningIfNoInternetAccess.Name = "checkBox_ContinueMiningIfNoInternetAccess"; + this.checkBox_ContinueMiningIfNoInternetAccess.Size = new System.Drawing.Size(205, 17); + this.checkBox_ContinueMiningIfNoInternetAccess.TabIndex = 365; + this.checkBox_ContinueMiningIfNoInternetAccess.Text = "Continue Mining If No Internet Access"; + this.checkBox_ContinueMiningIfNoInternetAccess.UseVisualStyleBackColor = true; + this.checkBox_ContinueMiningIfNoInternetAccess.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); + // // pictureBox_WorkerName // this.pictureBox_WorkerName.Image = global::NiceHashMiner.Properties.Resources.info_black_18; @@ -704,6 +720,16 @@ private void InitializeComponent() { this.textBox_MinProfit.Size = new System.Drawing.Size(237, 20); this.textBox_MinProfit.TabIndex = 334; // + // pictureBox_ContinueMiningIfNoInternetAccess + // + this.pictureBox_ContinueMiningIfNoInternetAccess.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_ContinueMiningIfNoInternetAccess.Location = new System.Drawing.Point(302, 149); + this.pictureBox_ContinueMiningIfNoInternetAccess.Name = "pictureBox_ContinueMiningIfNoInternetAccess"; + this.pictureBox_ContinueMiningIfNoInternetAccess.Size = new System.Drawing.Size(18, 18); + this.pictureBox_ContinueMiningIfNoInternetAccess.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_ContinueMiningIfNoInternetAccess.TabIndex = 364; + this.pictureBox_ContinueMiningIfNoInternetAccess.TabStop = false; + // // label_BitcoinAddress // this.label_BitcoinAddress.AutoSize = true; @@ -777,7 +803,7 @@ private void InitializeComponent() { this.groupBox_Localization.Controls.Add(this.comboBox_Language); this.groupBox_Localization.Controls.Add(this.currencyConverterCombobox); this.groupBox_Localization.Controls.Add(this.label_displayCurrency); - this.groupBox_Localization.Location = new System.Drawing.Point(6, 164); + this.groupBox_Localization.Location = new System.Drawing.Point(6, 192); this.groupBox_Localization.Name = "groupBox_Localization"; this.groupBox_Localization.Size = new System.Drawing.Size(345, 70); this.groupBox_Localization.TabIndex = 385; @@ -1411,6 +1437,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinProfit)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ServiceLocation)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Info_BitcoinAddress)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ContinueMiningIfNoInternetAccess)).EndInit(); this.groupBox_Localization.ResumeLayout(false); this.groupBox_Localization.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); @@ -1547,6 +1574,8 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_AMD_DisableAMDTempControl; private System.Windows.Forms.CheckBox checkBox_DisableDefaultOptimizations; private System.Windows.Forms.PictureBox pictureBox_DisableDefaultOptimizations; + private System.Windows.Forms.CheckBox checkBox_ContinueMiningIfNoInternetAccess; + private System.Windows.Forms.PictureBox pictureBox_ContinueMiningIfNoInternetAccess; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 4281427..d48ca3e 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -206,6 +206,10 @@ private void InitializeToolTip() { toolTip1.SetToolTip(checkBox_DisableDefaultOptimizations, International.GetText("Form_Settings_ToolTip_DisableDefaultOptimizations")); toolTip1.SetToolTip(pictureBox_DisableDefaultOptimizations, International.GetText("Form_Settings_ToolTip_DisableDefaultOptimizations")); + // internet connection mining check + toolTip1.SetToolTip(checkBox_ContinueMiningIfNoInternetAccess, International.GetText("Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess")); + toolTip1.SetToolTip(pictureBox_ContinueMiningIfNoInternetAccess, International.GetText("Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess")); + this.Text = International.GetText("Form_Settings_Title"); algorithmSettingsControl1.InitLocale(toolTip1); @@ -294,6 +298,7 @@ private void InitializeGeneralTabTranslations() { buttonSelectedProfit.Text = International.GetText("FormSettings_Tab_Devices_Algorithms_Check_SingleProfitability"); checkBox_DisableDefaultOptimizations.Text = International.GetText("Form_Settings_Text_DisableDefaultOptimizations"); + checkBox_ContinueMiningIfNoInternetAccess.Text = International.GetText("Form_Settings_Text_ContinueMiningIfNoInternetAccess"); } private void InitializeGeneralTabCallbacks() { @@ -382,6 +387,7 @@ private void InitializeGeneralTabFieldValuesReferences() { checkBox_LogToFile.Checked = ConfigManager.Instance.GeneralConfig.LogToFile; checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl; checkBox_DisableDefaultOptimizations.Checked = ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations; + checkBox_ContinueMiningIfNoInternetAccess.Checked = ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess; } // Textboxes @@ -512,6 +518,7 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { ConfigManager.Instance.GeneralConfig.DisableWindowsErrorReporting = checkBox_DisableWindowsErrorReporting.Checked; ConfigManager.Instance.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; ConfigManager.Instance.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; + ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess = checkBox_ContinueMiningIfNoInternetAccess.Checked; } private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, EventArgs e) { diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index 474359c..a89ce7f 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -212,5 +212,16 @@ public static bool Is45NetOrHigher() { } } + public static bool IsConnectedToInternet() { + bool returnValue = false; + try { + int Desc; + returnValue = InternetGetConnectedState(out Desc, 0); + } catch { + returnValue = false; + } + return returnValue; + } + } } diff --git a/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs b/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs index 9a1c854..e3b54c9 100644 --- a/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs +++ b/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs @@ -9,7 +9,7 @@ public interface IMainFormRatesComunication { void ClearRatesALL(); void ClearRates(int groupCount); void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPIData, double paying, bool isApiGetException); - void ShowNotProfitable(); + void ShowNotProfitable(string msg); void HideNotProfitable(); } } diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 435e5bf..0bc3e66 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -78,6 +78,7 @@ public partial class MinersManager : BaseLazySingleton { Dictionary _cpuMiners = new Dictionary(); private bool IsProfitable = true; + private bool IsConnectedToInternet = true; readonly string TAG; @@ -95,7 +96,7 @@ protected MinersManager() { // set internet checking _internetCheckTimer = new Timer(); _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; - _internetCheckTimer.Interval = 1000 * 60 * 5; + _internetCheckTimer.Interval = 1000 * 30 * 1; // every minute or 5?? // 1000 * 60 * 1 // path checker Helpers.ConsolePrint(TAG, "Creating MinerPathChecker miners"); @@ -106,11 +107,14 @@ protected MinersManager() { } private void InternetCheckTimer_Tick(object sender, EventArgs e) { - //if () { - - //} else { - - //} + if (ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { + IsConnectedToInternet = Helpers.IsConnectedToInternet(); + if (IsConnectedToInternet) { + Helpers.ConsolePrint(TAG, "Internet Conectivity Avaliable"); + } else { + Helpers.ConsolePrint(TAG, "NO INTERNET!!! WHOOOOOO. GO OUTSIDE???"); + } + } } private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { @@ -135,6 +139,7 @@ public void StopAllMiners() { // restroe/enable sleep _preventSleepTimer.Stop(); + _internetCheckTimer.Stop(); Helpers.AllowMonitorPowerdownAndSleep(); } @@ -240,6 +245,8 @@ public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication // assume profitable IsProfitable = true; + // assume we have internet + IsConnectedToInternet = true; // this checks if there are enabled devices and enabled algorithms @@ -271,6 +278,7 @@ public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication if (isMiningEnabled) { _preventSleepTimer.Start(); + _internetCheckTimer.Start(); } IsCurrentlyIdle = !isMiningEnabled; @@ -516,11 +524,16 @@ public void SwichMostProfitableGroupUpMethod(Dictionary 0 - && currentProfitUSD < ConfigManager.Instance.GeneralConfig.MinimumProfit) { + if (!IsConnectedToInternet || (ConfigManager.Instance.GeneralConfig.MinimumProfit > 0 + && currentProfitUSD < ConfigManager.Instance.GeneralConfig.MinimumProfit)) { IsProfitable = false; IsCurrentlyIdle = true; - _mainFormRatesComunication.ShowNotProfitable(); + if (!IsConnectedToInternet) { + // change msg + _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NO_INTERNET_CONNECTION")); + } else { + _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NOT_PROFITABLE")); + } // return don't group StopAllMinersNonProfitable(); Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); diff --git a/NiceHashMiner/PInvoke/PInvokeHelpers.cs b/NiceHashMiner/PInvoke/PInvokeHelpers.cs index 1a71fb2..b624fbc 100644 --- a/NiceHashMiner/PInvoke/PInvokeHelpers.cs +++ b/NiceHashMiner/PInvoke/PInvokeHelpers.cs @@ -19,6 +19,9 @@ [Out] out bool wow64Process [return: MarshalAsAttribute(UnmanagedType.Bool)] public static extern bool AllocConsole(); + [DllImport("wininet.dll")] + protected extern static bool InternetGetConnectedState(out int Description, int ReservedValue); + #region Check If Idle internal struct LASTINPUTINFO { public uint cbSize; diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 9009b9c..92323d3 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -233,6 +233,8 @@ "Form_Settings_ToolTip_AlgoBenchmarkSpeed": "Fine tune algorithm ratios by manually setting benchmark speeds for each algorithm.", "Form_Settings_ToolTip_AlgoDisabledDevices": "Any devices that are checked will be skipped by NiceHashMiner (only for this algorithm).", "Form_Settings_ToolTip_AlgoExtraLaunchParameters": "Additional launch parameters when launching miner and this algorithm.", + "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Continue Mining If No Internet Access", + "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess" : "If enabled NiceHashMiner will continue mining regardless of internet connectivity", "Form_Settings_DisplayCurrency": "Display Currency", "Form_Settings_ToolTip_DisplayCurrency": "Choose what Currency to Display mining protif.", "Form_Settings_APIBindPortStart": "API Bind port pool start", @@ -254,6 +256,7 @@ "Form_Main_MiningDevices": "Mining Devices {0}:", "Form_Main_bins_folder_files_missing": "There are missing files from last Miners Initialization. Please make sure that your anti-virus is not blocking the application. NiceHash Miner might not work properly without missing files. Click Yes to reinitialize NiceHash Miner to try to fix this issue.", "Form_Main_MINING_NOT_PROFITABLE": "CURRENTLY MINING NOT PROFITABLE.", + "Form_Main_MINING_NO_INTERNET_CONNECTION": "CURRENTLY NOT MINING. NO INTERNET CONNECTION.", "Form_Main_Group_Device_Rates": "Group/Device Rates:", "FormBenchmark_Benchmark_Step": "Benchmark step ( {0} / {1} )", "FormBenchmark_Benchmark_Finish_Succes_MsgBox_Msg": "All benchmarks have been successful", diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 6da3527..0cc4719 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -65,6 +65,7 @@ "Form_Main_msgbox_buttonBenchmarkRestartWarningMsg":"Работа {0} завершится. Этот новое диалоговое окно еще тестируется и {0} нужен перезапуск для результата.", "Form_Main_msgbox_anti_botnet_msgbox": "NiceHash Miner обнаружил изменение ID оборудования. Если вы не загружали и не устанавливали NiceHash Miner, ваш компьютер может быть взломан. В этом случае, мы советуем вам установить антивирус или переустановить ваш Windows.\r\n\r\nПродолжить работу с NiceHash Miner?", "Form_Main_No_Device_Enabled_For_Mining": "Предупреждение: устройства для майнинга не были включены. Включите, пожалуйста, хотя-бы одно устройство для запуска майнинга.", + "Form_Main_MINING_NO_INTERNET_CONNECTION": "НА ДАННЫЙ МОМЕНТ НЕ МАЙНИТ. НЕТ ПОДКЛЮЧЕНИЯ К ИНТЕРНЕТУ.", "Form_Benchmark_title":"Бенчмарк", @@ -321,5 +322,7 @@ "NET45_Not_Intsalled_msg" : "Для корректной работы NiceHash Miner требуется .NET Framework 4.5 или выше. Установите, пожалуйста, Microsoft .NET Framework 4.5", "Form_Settings_ToolTip_DisableDefaultOptimizations": "Если отмечено, отключает все настройки оптимизации по умолчанию, делая майнинг потенциально более стабильным, но значительно медленнее (особенно для карт AMD).", "Form_Settings_Text_DisableDefaultOptimizations": "Отключить оптимизацию", + "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Продолжить майнинг без доступа к интернету", + "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess" : "Если отмечено, NiceHashMiner продолжит майнинг вне зависимости от подключения к интернету.", } } \ No newline at end of file From 1959c949362b3dd70574de2a2fd82549fab095cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 5 Oct 2016 16:23:33 +0200 Subject: [PATCH 064/366] remove spammy debug logs --- NiceHashMiner/Miners/MinersManager.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 0bc3e66..b9e7f03 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -109,11 +109,6 @@ protected MinersManager() { private void InternetCheckTimer_Tick(object sender, EventArgs e) { if (ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { IsConnectedToInternet = Helpers.IsConnectedToInternet(); - if (IsConnectedToInternet) { - Helpers.ConsolePrint(TAG, "Internet Conectivity Avaliable"); - } else { - Helpers.ConsolePrint(TAG, "NO INTERNET!!! WHOOOOOO. GO OUTSIDE???"); - } } } @@ -530,6 +525,7 @@ public void SwichMostProfitableGroupUpMethod(Dictionary Date: Wed, 5 Oct 2016 20:12:50 +0200 Subject: [PATCH 065/366] CPU cryptonight find sweet spot in benchmark --- NiceHashMiner/Algorithm.cs | 3 -- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- NiceHashMiner/Forms/Form_Benchmark.cs | 55 +++++++++++++++++++++--- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index aa9ede9..bebdf28 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -23,9 +23,6 @@ public class Algorithm { public static readonly string PasswordDefault = "x"; - [JsonIgnore] - public double CurrentProfit { get; set; } - // benchmark info [JsonIgnore] public string BenchmarkStatus { get; set; } diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 14a566f..931e8f2 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -15,7 +15,7 @@ public static Dictionary CreateDefaultsForGroup(Device return new Dictionary() { { AlgorithmType.Lyra2RE, new Algorithm(AlgorithmType.Lyra2RE, "lyra2") }, { AlgorithmType.Hodl, new Algorithm(AlgorithmType.Hodl, "hodl") }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") /* NOT NEDDED { ExtraLaunchParameters = "--no-extranonce"}*/ } + { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") } }; } if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 299c678..afacbdb 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -48,7 +48,19 @@ private enum BenchmarkSettingsStatus : int { private string CurrentAlgoName; - + // CPU benchmarking helpers + private class CPUBenchmarkStatus { + public bool HasAlreadyBenchmarked = false; // after first benchmark set to true + public double BenchmarkSpeed; + public int LessTreads = 0; + public int Time; + } + private CPUBenchmarkStatus __CPUBenchmarkStatus = null; + + // CPU sweet spots + private List CPUAlgos = new List() { + AlgorithmType.CryptoNight + }; private static Color DISABLED_COLOR = Color.DarkGray; private static Color BENCHMARKED_COLOR = Color.LightGreen; @@ -391,8 +403,13 @@ void NextBenchmark() { var currentConfig = _currentDevice.DeviceBenchmarkConfig; if (_currentDevice.DeviceGroupType == DeviceGroupType.CPU) { _currentMiner = MinersManager.GetCpuMiner(_currentDevice.Group); + if (_currentAlgorithm != null && _currentAlgorithm.LessThreads == 0 && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { + __CPUBenchmarkStatus = new CPUBenchmarkStatus(); + _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; + } } else { _currentMiner = MinersManager.CreateMiner(currentConfig.DeviceGroupType, _currentAlgorithm.NiceHashID); + __CPUBenchmarkStatus = null; } if (_currentMiner != null && _currentAlgorithm != null) { @@ -404,6 +421,9 @@ void NextBenchmark() { var time = ConfigManager.Instance.GeneralConfig.BenchmarkTimeLimits .GetBenchamrktime(benchmarkOptions1.PerformanceType, _currentDevice.DeviceGroupType); //currentConfig.TimeLimit = time; + if (__CPUBenchmarkStatus != null) { + __CPUBenchmarkStatus.Time = time; + } // dagger about 4 minutes var showWaitTime = _currentAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto ? 4 * 60 : time; @@ -470,8 +490,29 @@ public void OnBenchmarkComplete(bool success, string status) { if (!_inBenchmark) return; this.Invoke((MethodInvoker)delegate { _bechmarkedSuccessCount += success ? 1 : 0; - _benchmarkingTimer.Stop(); - if (!success) { + bool rebenchSame = false; + if(success && __CPUBenchmarkStatus != null && CPUAlgos.Contains(_currentAlgorithm.NiceHashID)) { + if (__CPUBenchmarkStatus.HasAlreadyBenchmarked && __CPUBenchmarkStatus.BenchmarkSpeed > _currentAlgorithm.BenchmarkSpeed) { + rebenchSame = false; + _currentAlgorithm.BenchmarkSpeed = __CPUBenchmarkStatus.BenchmarkSpeed; + } else { + __CPUBenchmarkStatus.HasAlreadyBenchmarked = true; + __CPUBenchmarkStatus.BenchmarkSpeed = _currentAlgorithm.BenchmarkSpeed; + __CPUBenchmarkStatus.LessTreads++; + if(__CPUBenchmarkStatus.LessTreads < Globals.ThreadsPerCPU) { + _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; + rebenchSame = true; + } else { + rebenchSame = false; + } + } + } + + if(!rebenchSame) { + _benchmarkingTimer.Stop(); + } + + if (!success && !rebenchSame) { // add new failed list _benchmarkFailedAlgoPerDev.Add( new DeviceAlgo() { @@ -479,12 +520,16 @@ public void OnBenchmarkComplete(bool success, string status) { Algorithm = _currentAlgorithm.NiceHashName } ); algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, status); - } else { + } else if (!rebenchSame) { // set status to empty string it will return speed _currentAlgorithm.ClearBenchmarkPending(); algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, ""); } - NextBenchmark(); + if (rebenchSame) { + _currentMiner.BenchmarkStart(_currentDevice, _currentAlgorithm, __CPUBenchmarkStatus.Time, this); + } else { + NextBenchmark(); + } }); } From 1be92344387a6404f9e0747f2a65e4ac0627fedc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 5 Oct 2016 20:47:07 +0200 Subject: [PATCH 066/366] CPU sweet spot correct lessthreads setting, NHM size shrinking, fix icon problem --- NiceHashMiner/Forms/Form_Benchmark.cs | 3 + NiceHashMiner/Forms/Form_Benchmark.resx | 4763 ---------------------- NiceHashMiner/Forms/Form_Main.cs | 1 + NiceHashMiner/Forms/Form_Main.resx | 4770 +--------------------- NiceHashMiner/Forms/Form_Settings.cs | 1 + NiceHashMiner/Forms/Form_Settings.resx | 4771 +---------------------- 6 files changed, 14 insertions(+), 14295 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index afacbdb..36eefe7 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -96,7 +96,9 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm bool autostart = false, //List enabledDevices = null, AlgorithmType singleBenchmarkType = AlgorithmType.NONE) { + InitializeComponent(); + this.Icon = NiceHashMiner.Properties.Resources.logo; _singleBenchmarkType = singleBenchmarkType; @@ -495,6 +497,7 @@ public void OnBenchmarkComplete(bool success, string status) { if (__CPUBenchmarkStatus.HasAlreadyBenchmarked && __CPUBenchmarkStatus.BenchmarkSpeed > _currentAlgorithm.BenchmarkSpeed) { rebenchSame = false; _currentAlgorithm.BenchmarkSpeed = __CPUBenchmarkStatus.BenchmarkSpeed; + _currentAlgorithm.LessThreads--; } else { __CPUBenchmarkStatus.HasAlreadyBenchmarked = true; __CPUBenchmarkStatus.BenchmarkSpeed = _currentAlgorithm.BenchmarkSpeed; diff --git a/NiceHashMiner/Forms/Form_Benchmark.resx b/NiceHashMiner/Forms/Form_Benchmark.resx index 6302e34..1af7de1 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.resx +++ b/NiceHashMiner/Forms/Form_Benchmark.resx @@ -117,4767 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAKCAEAK4EAAAgIAAAAQAgAKgQAADWJAQAMDAAAAEA - IACoJQAAfjUEACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7NVTJ+6pMxvvsQ8P7/EPD+/xJxfvoRMT7nELD+zUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sOV8r7ukLD+/9mz/z/o+L9/7/r/v+/6/7/o+L9/2XO/PxCw/v/Q8P7pkLD+w4AAAAAAAAAAAAA - AABCw/sOVcn730/H+//D7P7//////+z5///K7v7/yu7+/+/6////////w+z+/0zG+/pExPvLQsP7DgAA - AAAAAAAAXcz8wU/H+//j9v7/9Pv//4TY/P9Dw/v/QsP7/0LD+/9Dw/v/iNn8//T7///j9v7/S8b7+ULD - +6UAAAAAYMz8P0LD+//D7P7//v///2zQ/P9Vyfv/ver+//b8///1/P//ver+/1TJ+/9s0Pz//v///8Ps - /v9Cw/v/QsP7NWvQ/MRmz/z///////z+//+L2v3/4/b+///////////////////////i9v7/i9r9//3+ - ////////YMz89ELD+5pTyPv1o+L9////////////v+v+/8bt/v/1/P/////////////7/v//wev+/73q - /v///////////6Pi/f5Dw/vhRcT7/r/r/v//////vOr+/1PI+/9Wyfv/hdj8////////////i9r9/1TJ - +/9Qx/v/t+j9//////+/6/7/Q8P7+0XE+/6/6/7//////3HS/P/Y8/7/5/f+/3HS/P///////////3HS - /P/b9P7/2/T+/2zQ/P//////v+v+/0PD+/tTyPv1o+L9//////+f4f3/T8f7/2DN/P9x0vz///////// - //9x0vz/Xsz8/0/H+/+Z3/3//////6Pi/f9Dw/vhbND8xmbP/P//////gNf8/77q/v/d9P7/cdL8//// - ////////cdL8/9Lx/v/B6/7/eNT8//////9gzfz2QsP7mmfP/EJCw/v/w+z+/9Px/v9Yyvv/Vsn7/5Td - /f///////////5rf/f9TyPv/Vcn7/9Dw/v/D7P7/QsP7/0LD+zUAAAAAYM38xU/H+//j9v7/1/L+/9v0 - /v/6/f/////////////9/v//2PP+/9fy/v/j9v7/TMb7+kLD+6UAAAAAAAAAAELD+w5XyvviT8f7/8Ps - /v/////////////////////////////////D7P7/TMb7+0XE+8xCw/sOAAAAAAAAAAAAAAAAQsP7DlvL - /L5Cw/v/Zs/8/6Pi/f+/6/7/v+v+/6Pi/f9lzvz9QsP7/0TE+6dCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAARsT7N1nK+69Nx/vtRMT7/UPD+/xLxvvqSMX7n0LD+zYAAAAAAAAAAAAAAAAAAAAA+B8AAOAH - AADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAADgBwAA+B8AACgA - AAAAAQAAAAIAAAEAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7EELD+zBCw/tSQsP7akLD+31Cw/uRQsP7pULD+7hCw/vLQsP73kLD++BCw/vvQsP78ELD - +/dCw/v/QsP7/0LD+/9Cw/v/QsP790LD+/BCw/vvQsP74ELD+95Cw/vLQsP7uELD+6VCw/uRQsP7fULD - +2pCw/tSQsP7MELD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+zFCw/tgQsP7jULD - +65Cw/vOQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD+85Cw/uuQsP7jULD+2BCw/sxQsP7CAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7Q0LD+3pCw/upQsP71kLD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vWQsP7qULD - +3pCw/tDQsP7DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD+5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD+1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sIQsP7R0LD+5BCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9lCw/uQQsP7R0LD+wgAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD - +21Cw/u0QsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7tELD - +21Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/twQsP7yELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+8hCw/twQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7bULD+8NCw/v+QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/5Cw/vDQsP7bULD+xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+0NCw/upQsP7+ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7qULD+0NCw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD - +3pCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/ulQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7+0LD+6VCw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sBQsP7SULD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7xCw/tJQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AkLD+1hCw/vbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9tCw/tYQsP7AgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sBQsP7UkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9ZCw/tSQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yRCw/uxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7FCw/skAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD - +4tCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD+4pCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD - ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vULD - +yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/t0QsP79kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9r0Pz/gtf8/5fe/f+l4/3/s+f9/8Hr - /v/Q8P7/2/T+/+b3/v/n9/7/7Pn///P7///z+///8/v///P7///s+f//5/f+/+b3/v/b9P7/0PD+/8Hr - /v+z5/3/peP9/5fe/f+C1/z/a9D8/1PI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v2QsP7dELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/vMQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0TE+/9gzfz/g9j8/6Xi/f/G7f7/4PX+//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+P3//+D1/v/G7f7/peL9/4PY/P9gzfz/RMT7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vMQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+3dCw/v6QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1jK - +/+F2Pz/seb9/9rz/v/6/f////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - ///a8/7/seb9/4XY/P9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/t3QsP7AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD+79Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/+O2/3/v+v+/+v5 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+v5//+/6/7/jtv9/1fK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+79Cw/scAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7nULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/d9T8/7bo/f/y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////L7 - //+26P3/d9T8/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7nULD - +wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP7zULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P+y5/3/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////v+v//suf9/27R/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vNQsP7IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Qx/v/ld39/+D1/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4PX+/5Xd/f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/t7QsP7/ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/2zQ/P+86v7/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+v3//7zq/v9s0Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ULD+3tCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/utQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/f9b8/9Tx/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////9Tx - /v9/1vz/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rULD+woAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +/+R3P3/5Pb+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+T2/v+R3P3/R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vjQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/47b - /f/p+P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+n4//+O2/3/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++NCw/suAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/vxQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/iNn8/+f3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+b3/v+I2fz/RMT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ULD - +0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v931Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/I7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////8ju - /v9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/1Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/6vk/f/7/v////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////+/7//6vk/f9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////v+v+/1LI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t4AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz/8fv///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////x+///hdj8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3gAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////++6v7/Tcf7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/o+P////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+j4 - //9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/6Lh/f/9/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////f7//6Lh/f9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/ULD+1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vxQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////v///+35///W8v7/x+3+/7rp/v+t5f3/oeH9/5rf/f+U3f3/lN39/4zb - /f+U3f3/lN39/5fe/f+g4f3/qeT9/7bo/f/D7P7/0/H+/+f3/v/7/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/FCw/suAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vjQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////j9 - ///T8f7/s+f9/5Td/f931Pz/Wsv8/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9u0fz/i9r9/6vk - /f/I7v7/7vr///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////j9//+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP740LD+xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//+76f7/i9r9/2PO - /P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Xyvv/ftb8/6nk/f/Y8/7//f7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Ti/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/utQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/vOr+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////r9///K7v7/kdz9/1zL/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/991vz/tuj9/+35//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////vOr+/0bE - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+61Cw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t7QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/0vH+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////6/f//xOz+/4LX/P9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/a9D8/6zl - /f/s+f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///S8f7/T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ewAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////9nz/v+Q3P3/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7/3PT/P+86v7/+f3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+D1/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP77ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/5Pf+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////7/v//uOj9/2fP/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+/+W3v3/5/f+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5Pf+/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP77ULD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7zULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//+j4v3/U8j7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/991vz/1fL+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////q+P//Xcv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////8/v//6Dh/f9Nx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/900/z/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+/6//9jzfz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///4/f//qOP9/03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/920/z/2/P+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////7/r//13L/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD++5Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+/6/7/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+G2fz/6/n///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////q+P//Wsv8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++5Cw/scAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+H1 - /v9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG+/+n4/3/+/7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+T3 - /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3dCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////+/7//6Hh - /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/U8f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////4PX+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t3AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/v6QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/0vH+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////3fT+/2XO - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5be/f/5/f////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////S8f7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD - +zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/vNQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/vOr+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////+////qeT9/0bE - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/X8z8/9vz - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7zq/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t0QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////w+v//d9T8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9GxPv/q+T9//7///////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////pOL9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP79kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////Y8/7/V8r7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+A1/z/9vz///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v2QsP7IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+66f7/R8X7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2LN/P/k9/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//2bP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7YELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+b3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7/8ru/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/T8f7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD - ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8vv/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////z+//+I2fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/tuj9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////8vv - /v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++lCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Lh/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//961fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/9ay/z/btH8/4DX - /P+L2v3/mN79/6Dh/f+g4f3/qOP9/6Dh/f+g4f3/nN/9/4/b/f+C1/z/dNP8/1/M/P9Jxfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4f3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////ouH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yRCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/9/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////T7//9u0fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/4LX/P+o4/3/ye7+/+f3/v/9/v////////// - /////////////////////////////////////////////////////////////////////////////+/6 - ///R8P7/s+f9/47b/f9pz/z/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Hc - /f/+//////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////3+//9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/skAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/uyQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//o+P////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////T7//9q0Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Vsn7/47b/f/A6/7/7fn///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////j9///Q8P7/n+H9/2nP/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/j9v9//7///////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6Pj//03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7sgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//9y0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/1rL/P+a3/3/2fP+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////7vr//7Ln/f9z0/z/Q8P7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+P2/3//v////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sBQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////v+//900/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Hxfv/iNn8/9Hw/v/+//////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+v5 - //+l4/3/W8v8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4XY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7z0LD+wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7U0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/8fv///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+E2Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH - +/+k4v3/7/r///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7////G7f7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/n+D9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////x+///Usj7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+Z3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7/6bj - /f/2/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////Q8P7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+1hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+56f7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Ixfv/oOH9//b8 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Q8P7/bND8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8nu/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////e9X8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/vcQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+r4//////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////Y8/7/R8X7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz/5/f+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+56f7/Usj7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+r4 - //9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6vk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////y+///V8r7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ+//J7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////X8 - //+U3f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1/M - /P/1/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////q+T9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sBQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/7/v////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////f9b8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////8/w/v9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP71ELD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7SkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//I7v7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////uen+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/7zq/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////9fz//4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////yO7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tKAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////8fv//07H - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////s+f9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7//H7//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////57g - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//T7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////X8v7/Vsn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+e4P3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4fX+/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/ulQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////7/ - //9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//v+//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9kzvz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//7///////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///h9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//7///////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////9Pv//3LS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//i9v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7ekLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////xe3+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///7/v//e9X8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+O2/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +//p+P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7jo/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////6fj//0fF - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+91Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+R3P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////H7f7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/i9r9//7///////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//3LS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//K7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/5Pf+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5Pb+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//3+//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////1/P//Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4/b+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5Pf+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7+ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/f9b8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7///9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8//P7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+v5//9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//7/ - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9/1vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7FAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/9Tx/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////mN79/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/970/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////1fL+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+8NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/23R/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+z5//9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+p5P3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0vG - +//s+f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/v+QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////s+f9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT/P/+//////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////v///3TT - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+y5/3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////vOr+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/kLD - +xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/twQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+W3v3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///y+///Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+W3v3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////r9//9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7yELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/ld39//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////6rk - /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3rV/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +/+q5P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ld39/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////4fX+/4HX/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zc78/8Dr/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////8Dr/v9mzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7/4HX - /P/h9f7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////8vv//8Dr/v+i4f3/lN39/5/g/f+56f7/4fX+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+H2/v+36P3/oOH9/5Td/f+h4f3/wOv+//L7 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/u0QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+y5/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////7Ln - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sIQsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///v+v//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/d9T8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3fU/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+5BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7bo/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uQAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+//y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////8vv//0XE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP72QAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sbAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7V0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qeT9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+5JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////971/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vNAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/ELD+wwAAAAAAAAAAAAAAAAAAAAAQsP7Q0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+/6/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tDAAAAAAAAAAAAAAAAAAAAAELD+3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7////+//////////////////////////////////////////// - //////////////////////////////////////////////z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////v+//////////////////////////////////////////////// - ////////////////////////////////////////+/7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////6/n//0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK - +/////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/2rQ/P9ExPv/RMT7/2nP/P+/6/7///////////////////////// - ///////////////////////////////////k9/7/hNj8/0zG+/9Cw/v/V8r7/5nf/f/1/P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////R8P7/dNP8/0bE+/9Cw/v/YM38/63l/f/9/v////////////////////////// - /////////////////////////////+/6//+R3P3/Ucj7/0LD+/9Px/v/i9r9/+z5//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAQsP71kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+F2Pz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////neD9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5je/f////////////// - ///////////////////////////////////W8v7/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YM38//L7 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+26P3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ftb8//3+//////////////// - /////////////////////////////+j4//9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9TyPv/4vb+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////hdj8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vWAAAAAAAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////ze/+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/yu7+//// - ///////////////////////////////////7/v//Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+F2Pz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////l9/7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+t5f3///////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2nP - /P/+//////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAELD+zFCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/9rz/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV - /P//////////////////////////////////////xOz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7//H7//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////nN/9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8//// - ///////////////////////////////////i9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/2PP+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////a8/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sxAAAAAAAAAABCw/tgQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0TE+//6/f////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9cy/z//////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//U8f7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3rV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//7/v//////////////////////////////////v+v+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/7bo/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+v3//0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAQsP7jULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9hzfz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD - +65Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////g9j8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uuAAAAAAAA - AABCw/vPQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7zwAA - AAAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////G7f7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/AAAAAAQsP7EELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////4PX+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7EELD+zBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+zBCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////3+///k9v7/U8j7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/6Dh - /f9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8/6Dh/f+g4f3/oOH9/6Dh - /f+m4/3/y+/+//z+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+v5//+15/3/oeH9/6Dh/f+g4f3/oOH9/6Dh/f9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/33W - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+W3v3/8/v///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////U8j7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tSQsP7akLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Y8/7/neD9/27R/P9Hxfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9dy/z/0vH+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//5be/f9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Xyvv/hdj8/7fo - /f/y+/////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////2vQ - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7akLD+31Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////9Pv//6nk/f9cy/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//Q8P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////v///33W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RcT7/33W/P/R8P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+D2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+31Cw/uSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//quT9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//n9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/a8/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uSQsP7pULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+l4/3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////d9P7/ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5zf/f/7/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////6Xj/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7pULD+7hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/s+f9//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////A6/7/ScX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////6/f//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cNL8//H7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7hCw/vLQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP73kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//Q8P7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////B6/7/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO - /P/3/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73kLD++BCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/2/T+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////f9f7/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////b9P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++BCw/vvQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/+f3/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////9/v//ac/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP78ELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//n9/7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////seb9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//b8//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/7fn///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+P3//1TJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+m4/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////s+f//QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Vcn7//z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////8/v//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P+Z3/3/x+3+/+j4 - ///3/P////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////3+///v+v//3vX+/7Ln/f9+1vz/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//H7f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////P7//9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////u+v//Q8P7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/7bo/f/+//////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+n4//+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/itr9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////z+///QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////uen+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/XMv8/+f3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6rk/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ+/////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////8/v//0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//t+f////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////5Hc/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+X3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////lt79/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/6fj///// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+35 - //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/5/f+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9t0fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////n9 - //9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/BCw/vvQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+f3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////Vcn7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+//4/f////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+t5f3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP74ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//b9P7///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////v///0PD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+C1/z///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/md/9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////9v0/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP74ELD+95Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////P7 - //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qOP9//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////Q8P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+95Cw/vLQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///v+v//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7np - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////2DN/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP7uELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+z5/3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////8/v//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//A6/7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7Pn/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7uELD+6VCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/peP9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5nf/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+l4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6VCw/uTQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5fe/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5nf/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+f3//0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+o4/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uTQsP7fULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+D2Pz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3DS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9mz/z///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////8zv/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4PY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7fULD - +2pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/a9D8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9jz/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+r4//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9r0Pz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +2pCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////wuz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9v0fz//f7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////T8f7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13L/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////U8j7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tSQsP7MELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/+P3///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////b8//9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//Vcn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+X3v3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7MELD+xBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////gtf8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//X8//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Q8P7/Vcn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2vP+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+xAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9jz/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Uyfv/p+P9/+f3 - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+f3//83v/v9+1vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cdL8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////G7f7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/AAAAAAAAAAAELD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////dtP8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/V8r7/3fU/P+F2Pz/k939/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td - /f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/1bJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/etX8/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td - /f+U3f3/lN39/5Td/f+U3f3/lN39/43b/f+A1/z/bND8/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/87v/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////peL9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vPAAAAAAAAAABCw/uuQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4PY/P////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+T3 - /v9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////4PY - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rgAAAAAAAAAAQsP7jULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9hzfz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////qOP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+//v+v////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD+2BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7//r9 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7///+C1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF+//T8f7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///6/f//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tgAAAAAAAAAABCw/syQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//a8/7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//F7f7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////2vP+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//i9r9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+//Q8P7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAAAAAABCw/vWQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4XY/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+46P3/Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3PT/P/q+P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9YAAAAAAAAAAAAAAAAAAAAAQsP7qULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9ay/z///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////2/T+/1vL/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+U3f3/+/7///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAELD - +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////xe3+/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS - /P/0+/////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6/n//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAA - AABCw/tDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////x+3+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/atD8//f8//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0MAAAAAAAAAAAAA - AAAAAAAAQsP7DELD+/xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////3PT+/0nF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+A1/z//v////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+O2/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/sMAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//13M/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/67l/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7kkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3vX+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////5zg/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////3vX+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7kgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1dCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6nk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+z5//9Ixfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/etX8/7Pn - /f/b9P7/9/z///////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - ///////////////////+////7vr//8nu/v+c4P3/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////6nk/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+a3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9x0vz/4vb+//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////z+//+z5/3/S8b7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/7fn///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+9lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7//L7 - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////+////Usj7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////930/v9RyPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6rk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////y+///RcT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/uQQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+26P3///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////0vH+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz//P7///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////zu/+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////tuj9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/d9T8//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////57g - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1/L+//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//X8 - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3fU/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/v2QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0XE+//v+v////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //951Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Y878//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//R8P7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9FxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/ZCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7tELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/suf9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Td - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////j9//9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/sOb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/u0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+o4/3///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////Usj7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6Ti/f////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/seQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/tuj9//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////1zL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+X3v3///////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////4PX+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+8hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5be/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6jj/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////5be - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/twQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+U3f3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////4/f//Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD+/5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Y878//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+86v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////btH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Y8/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4HX/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xe3+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Tx - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/bND8//z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+b3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xRCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9/1vz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////970/v9RyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/sUAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7qULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7/+T3/v////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/j9v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////P7//7Pn/f9Lxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+E2Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+T3/v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+R3P3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9pz/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/3vV - /P+z5/3/3fT+//j9//////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - /////////////////////////v///+76///K7v7/nOD9/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP73ULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/+n4//////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////sOb9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/ScX7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7//r9//////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////p+P//R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////b8 - //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////jtv9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3oAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//z+/////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+6VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//9jzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+46P3///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/ulAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7/+H1/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////3PT+/0jF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz//v////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+H1/v9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+96v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/9fz///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tKQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8ju - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7Pn///// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////I7v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+9RCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9ezPz/+/7///////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ver+/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lN39//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////5/f//QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz/7/r///// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9RCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6zl/f////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////c9P7/YM38/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////2TO/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/+Z3/3/+/7///// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7BELD+9xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////v+ - //+m4/3/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ - +//3/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2zQ/P/Y8/7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vcQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tYQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//+i4v3/WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD - +//I7v7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////f7//3XT - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/edT8/8zv/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD - +9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7////Q8P7/l979/2TO/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ - +//J7v7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///4/f//itr9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/3rV/P+x5v3/6/n///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1LI+//y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////9/z//1bJ+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/a9D8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4DX/P+U3f3/lN39/5Td/f+U3f3/m9/9/7/r - /v/4/f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////h9v7/qeT9/5Xd/f+U3f3/lN39/5Td/f+U3f3/Vsn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4/b/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f910/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////L7//9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AULD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/htn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////Wcr7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////// - //+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/+j4 - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////1nK - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+/////////////////////////////// - ////////oOH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// - //+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/uyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz//f7///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv///////////////////////// - /////////////6Dh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////// - ////////uOj9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////9/v//btH8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6Li/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////// - //////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////// - /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ouL9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP76ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Dw/v/y+/+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////2DM/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P////////////// - ////////////////////////peP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Xy - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7//z+//////////////// - ///////////////////B6/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/uOj9//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////y+/+/0PD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2BCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//n9/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+B1/z///////// - /////////////////////////////8ru/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +//1/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////6Lh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO/P////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/970 - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0/H+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Z8/8//n9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////2PP+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1PH+//// - ///////////////////////////////////9/v//Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+Q3P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////s+f//Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+56f7///////// - //////////////////////////////////991vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT - /P////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//2fP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yNCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+u5f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/q+T9//// - /////////////////////////////////////////////+H2/v9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/+P3///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////8ft/v9Ixfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+R3P3///////// - ////////////////////////////////////////8fv//2PO/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M - /P/s+f////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////4jZ/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7dELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////9Tx/v9/1vz/Vsn7/1bJ+/991vz/0vH+//// - ////////////////////////////////////////////////////////8Pr//5nf/f9gzfz/Usj7/2rQ - /P+t5f3/+/7///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4fb+/4jZ/P9ay/z/U8j7/3TT/P/B6/7///////// - ///////////////////////////////////////////////////3/P//peL9/2bO/P9SyPv/ZM78/6Dh - /f/1/P////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/vMQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ver+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////73q/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7MELD+/pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +//S8f7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9Lx/v9GxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t3QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/T8f7/+H1/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v9Px/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+T3/v9Wyfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP77kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P/q+P////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9ay/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1RCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcz8/+/6//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9dzPz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9jzfz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +whCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P/q+P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9dzPz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sIAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7IELD++1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wsv8/+T3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+T3/v9ay/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Wyfv/4fX+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v9Wyfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0/H+//S8f7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9Lx/v9Px/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t7AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7rULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/73q/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////73q/v9GxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7AQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD++NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz/+f3///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//4jZ/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP78ULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2fP/P/n9/7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/2fP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7LgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7VULD+/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/ouL9//3+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////9/v//ouL9/0PD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7VQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tlQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9u0fz/6Pj///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//btH8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ZQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////++6v7/Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7eELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4bZ/P/y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////L7//+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t4QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7/7/r/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7/r/v9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7dULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Mxvv/rOX9//v+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//rOX9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tlQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9ezPz/ye7+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////J7v7/Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7ZQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+H1/v931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7QULD+/FCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/+I2fz/5/f+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/4jZ/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7QQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP740LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/+O2/3/6fj///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////p+P//jtv9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7LgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0jF - +/+R3P3/5ff+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+X3/v+R3P3/SMX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CkLD+61Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0PD+/9/1vz/1PH+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////1PH+/3/W/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7e0LD - +/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz/ver+//r9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - //+96v7/bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/t7QsP7AQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/lt79/+D1/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////4PX+/5be - /f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+yBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/btH8/7Ln - /f/v+v////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//+y5/3/btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7CULD+51Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RcT7/3fU/P+26P3/8vv///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////y+///tuj9/3fU/P9FxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+51Cw/sJAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP7v0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7/47b/f+/6/7/7Pn///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////7Pn//7/r/v+O2/3/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/t4QsP7+kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9ay/z/hdj8/7Hm/f/b8/7/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///6/f//2/P+/7Hm/f+F2Pz/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7eELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +zBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/9hzfz/g9j8/6Xj/f/G7f7/4PX+//j9//////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//+D1/v/G7f7/peP9/4PY - /P9hzfz/RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7BELD+3RCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/U8j7/2vQ - /P+D2Pz/l979/6Xj/f+z5/3/wev+/9Hw/v/b9P7/5/f+/+f3/v/t+f//8/v///T7///0+///8/v//+35 - ///n9/7/5/f+/9v0/v/R8P7/wev+/7Pn/f+l4/3/l979/4PY/P9r0Pz/U8j7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/t0QsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7I0LD+71Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP7i0LD+/pCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7i0LD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7skLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/uyQsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wFCw/tTQsP71kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP71kLD+1NCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/tYQsP73ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vcQsP7WELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/tKQsP7vELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vELD - +0pCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sxQsP7pULD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/ulQsP7MQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+3pCw/sYAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7Q0LD+6pCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/uqQsP7Q0LD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7FELD+21Cw/vDQsP7/kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7w0LD+21Cw/sUAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +xpCw/txQsP7yELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8hCw/txQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/seQsP7bkLD+7VCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/ZCw/u1QsP7bkLD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+0dCw/uQQsP72ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vZQsP7kELD+0dCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD - +5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD - +1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wxCw/tDQsP7ekLD+6lCw/vWQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+9ZCw/upQsP7ekLD+0NCw/sMAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/syQsP7YELD+41Cw/uuQsP70ELD - +/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/BCw/vQQsP7rkLD+41Cw/tgQsP7MkLD+wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7EELD+zFCw/tSQsP7akLD+31Cw/uTQsP7pkLD+7hCw/vLQsP73kLD++BCw/vwQsP78ELD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/vwQsP74ELD+95Cw/vLQsP7uELD+6ZCw/uTQsP7fULD - +2pCw/tSQsP7MULD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////4AAAf - ////////////////////////////////////8AAAAAAP//////////////////////////////////4A - AAAAAAB/////////////////////////////////wAAAAAAAAAP///////////////////////////// - //wAAAAAAAAAAD//////////////////////////////4AAAAAAAAAAAB/////////////////////// - //////8AAAAAAAAAAAAA////////////////////////////+AAAAAAAAAAAAAAf//////////////// - ///////////AAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAAP////////// - ///////////////4AAAAAAAAAAAAAAAAH////////////////////////+AAAAAAAAAAAAAAAAAH//// - ////////////////////gAAAAAAAAAAAAAAAAAH///////////////////////4AAAAAAAAAAAAAAAAA - AH//////////////////////+AAAAAAAAAAAAAAAAAAAH//////////////////////gAAAAAAAAAAAA - AAAAAAAH/////////////////////4AAAAAAAAAAAAAAAAAAAAH////////////////////+AAAAAAAA - AAAAAAAAAAAAAH////////////////////wAAAAAAAAAAAAAAAAAAAAAP///////////////////8AAA - AAAAAAAAAAAAAAAAAAAP///////////////////gAAAAAAAAAAAAAAAAAAAAAAf///////////////// - /4AAAAAAAAAAAAAAAAAAAAAAAf//////////////////AAAAAAAAAAAAAAAAAAAAAAAA//////////// - //////wAAAAAAAAAAAAAAAAAAAAAAAA/////////////////+AAAAAAAAAAAAAAAAAAAAAAAAB////// - ///////////gAAAAAAAAAAAAAAAAAAAAAAAAB////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAD - ////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH///////////////8AAAAAAAAAAAAAAAAAAAAA - AAAAAP///////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////4AAAAAAAAAAAAAAAA - AAAAAAAAAAAf//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////4AAAAAAAAAAA - AAAAAAAAAAAAAAAAB//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////4AAAAAA - AAAAAAAAAAAAAAAAAAAAAAH/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////4A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAf////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////// - ///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/// - ////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAP//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////////AAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAD/////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////////gAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////gAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAB////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////gAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/ - //////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAP//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////gAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAB//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAA/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////4AAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - P////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAB////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//4AAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - Af//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAD///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///+AAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////wAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAf////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAP/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////+AAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////wAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAD///////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////+AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// - /4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/ - ///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAH////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////4AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAH/////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////AAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAD/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////wAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAD///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////////AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////// - ///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/// - /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAA - Af/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAf/////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////4AAAAAAAAAAAAAAAA - AAAAAAAAAAAf//////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////wAAAAAAAAAA - AAAAAAAAAAAAAAAA////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH////////////////AAAAA - AAAAAAAAAAAAAAAAAAAAA////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAH//////////////// - +AAAAAAAAAAAAAAAAAAAAAAAAB/////////////////8AAAAAAAAAAAAAAAAAAAAAAAAP/////////// - //////8AAAAAAAAAAAAAAAAAAAAAAAD//////////////////4AAAAAAAAAAAAAAAAAAAAAAAf////// - ////////////4AAAAAAAAAAAAAAAAAAAAAAH///////////////////wAAAAAAAAAAAAAAAAAAAAAA// - //////////////////wAAAAAAAAAAAAAAAAAAAAAP////////////////////gAAAAAAAAAAAAAAAAAA - AAB/////////////////////gAAAAAAAAAAAAAAAAAAAAf/////////////////////gAAAAAAAAAAAA - AAAAAAAH//////////////////////gAAAAAAAAAAAAAAAAAAB///////////////////////gAAAAAA - AAAAAAAAAAAAf///////////////////////gAAAAAAAAAAAAAAAAAH////////////////////////g - AAAAAAAAAAAAAAAAB/////////////////////////gAAAAAAAAAAAAAAAAf//////////////////// - /////wAAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAD//////////////// - ///////////4AAAAAAAAAAAAAB////////////////////////////8AAAAAAAAAAAAA//////////// - /////////////////+AAAAAAAAAAAAf//////////////////////////////AAAAAAAAAAAP/////// - ////////////////////////wAAAAAAAAAP////////////////////////////////+AAAAAAAAf/// - ///////////////////////////////wAAAAAA/////////////////////////////////////4AAAf - //////////////////8oAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xNCw/tiQsP7pELD+9JCw/vzQsP7/0LD - +/9Cw/vzQsP70kLD+6RCw/tiQsP7EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytCw/unQ8P7+kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7p0LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+w1Dw/uWQ8P7/kLD+/9Cw/v/QsP7/0bE - +/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ/P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srR8X74ULD+/9Cw/v/QsP7/3XT - /P/A6/7/+P3///////////////////////////////////j9///A6/7/ddP8/0LD+/9Cw/v/QsP7/0LD - +9tCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7N0bE+/RCw/v/QsP7/2PO - /P/S8f7/////////////////////////////////////////////////////////////////0vH+/2PO - /P9Cw/v/QsP7/0LD++9Cw/s3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytGxPv1QsP7/0LD - +/+O2/3/+v3///////////////////j9///K7v7/peP9/5Td/f+W3v3/p+P9/87v/v/6/f////////// - ////////+v3//47b/f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sNS8b75kLD - +/9Cw/v/n+D9//////////////////P7//+X3v3/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H - +/+d4P3/9vz//////////////////5/g/f9Cw/v/QsP7/0LD+9tCw/sNAAAAAAAAAAAAAAAAAAAAAFDH - +6FCw/v/QsP7/47b/f/////////////////V8v7/Vcn7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Yyvv/2vP+/////////////////47b/f9Cw/v/QsP7/0LD+5UAAAAAAAAAAAAA - AABCw/srQ8P7/kLD+/9jzvz/+v3/////////////1PH+/0nF+/9Cw/v/QsP7/2LN/P+05/3/6Pj///7/ - ///8/v//5Pf+/6/m/f9dzPz/QsP7/0LD+/9Kxvv/2PP+////////////+v3//2PO/P9Cw/v/QsP7/ULD - +ysAAAAAAAAAAFXJ+7lCw/v/QsP7/9Lx/v////////////z+//9Xyvv/QsP7/0LD+/+f4P3//P7///// - //////////////////////////////v+//+Z3/3/QsP7/0LD+/9Xyvv//P7/////////////0vH+/0LD - +/9Cw/v/QsP7pwAAAABCw/sTRcT7/ULD+/910/z/////////////////+v3//0/H+/9Cw/v/nuD9//// - //////////////////////////////////////////////////+c4P3/QsP7/0/H+//7/v////////// - ////////ddP8/0LD+/9Cw/v5QsP7E0/H+2lCw/v/QsP7/8Dr/v//////////////////////5ff+/83v - /v/+//////////////////////////////////////////////////////////7////N7/7/5ff+//// - ///////////////////A6/7/QsP7/0LD+/9Cw/tiXMv8vkLD+/9GxPv/+P3///////////////////// - ////////7fn////////v+v/////////////////////////////////////////////v+v///////+76 - ///+//////////////////////////j9//9GxPv/QsP7/0LD+6RUyfvoQsP7/2rQ/P////////////// - /////////////9Xy/v9GxPv/9fz//0PD+//h9v7/////////////////////////////////7Pn//0LD - +//k9/7/Usj7/8ft/v///////////////////////////2rQ/P9Cw/v/QsP70kjF+/tCw/v/h9n8//// - ///////////////////V8v7/fdb8/0LD+/951Pz/QsP7/3HS/P/T8f7//////////////////////9v0 - /v910/z/QsP7/3HS/P9FxPv/d9T8/9Dw/v//////////////////////h9n8/0LD+/9Cw/vzQsP7/0LD - +/+U3f3/////////////////3vX+/0bE+/9Cw/v/Vcn7/1nK+/9TyPv/QsP7/6Dh/f////////////// - ////////rOX9/0LD+/9SyPv/Wcr7/1XJ+/9Cw/v/Q8P7/9Px/v////////////////+U3f3/QsP7/0LD - +/9Cw/v/QsP7/5Td/f////////////////+l4/3/QsP7/7Tn/f///////////9Dw/v9Cw/v/oOH9//// - //////////////////+s5f3/QsP7/8Ts/v///////////8Dr/v9Cw/v/md/9/////////////////5Td - /f9Cw/v/QsP7/0jF+/tCw/v/h9n8/////////////////6fj/f9Cw/v/vOr+////////////0PD+/0LD - +/+g4f3//////////////////////6zl/f9Cw/v/xOz+////////////x+3+/0LD+/+Z3/3///////// - ////////h9n8/0LD+/9Cw/vzVcn76ULD+/9q0Pz/////////////////7Pn//1TJ+/9Dw/v/WMr7/1nK - +/9TyPv/QsP7/6Dh/f//////////////////////rOX9/0LD+/9SyPv/Wcr7/1nK+/9Dw/v/T8f7/+T3 - /v////////////////9q0Pz/QsP7/0LD+9JezPzBQsP7/0bE+//4/f/////////////z+///Wcr7/0TE - +/9s0Pz/cdL8/2XO/P9Cw/v/oOH9//////////////////////+s5f3/QsP7/2LN/P9x0vz/bND8/0fF - +/9SyPv/7Pn/////////////+P3//0bE+/9Cw/v/QsP7pFTJ+2xCw/v/QsP7/8Dr/v///////////73q - /v9Cw/v/reX9////////////0PD+/0LD+/+g4f3//////////////////////6zl/f9Cw/v/xOz+//// - ////////uun+/0LD+/+v5v3////////////A6/7/QsP7/0LD+/9Cw/tiQsP7E0XE+/1Cw/v/ddP8//// - ////////xOz+/0LD+/+C1/z/4vb+/+f3/v++6v7/QsP7/6Dh/f//////////////////////rOX9/0LD - +/+z5/3/5/f+/+P2/v+M2/3/QsP7/7np/v///////////3XT/P9Cw/v/QsP7+ULD+xMAAAAAWcr7vkLD - +/9Cw/v/0vH+///////4/f//ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////// - //+u5f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/9Pv////////S8f7/QsP7/0LD+/9Cw/unAAAAAAAA - AABCw/srQ8P7/0LD+/9jzvz/+v3////////4/f//peL9/0LD+/+a3/3/QsP7/5Hc/f/o+P////////// - /////////////+76//+X3v3/QsP7/47b/f9Hxfv/m9/9//b8////////+v3//2PO/P9Cw/v/QsP7/ULD - +ysAAAAAAAAAAAAAAABWyfunQsP7/0LD+/+O2/3////////////n9/7/f9b8//r9//961fz/7/r///// - //////////////////////////////b8//961fz/8vv//4fZ/P/e9f7///////////+O2/3/QsP7/0LD - +/9Cw/uVAAAAAAAAAAAAAAAAAAAAAELD+w1Nx/vpQsP7/0LD+/+f4P3///////////////////////// - ////////////////////////////////////////////////////////////////////////n+D9/0LD - +/9Cw/v/QsP720LD+w0AAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytIxfv3QsP7/0LD+/+O2/3/+v3///// - ////////////////////////////////////////////////////////////////////////+v3//47b - /f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zdHxfv2QsP7/0LD - +/9jzvz/0vH+/////////////////////////////////////////////////////////////////9Lx - /v9jzvz/QsP7/0LD+/9Cw/vvQsP7NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +ytKxvvlQsP7/0LD+/9Cw/v/dtP8/8Dr/v/4/f//////////////////////////////////+P3//8Dr - /v920/z/QsP7/0LD+/9Cw/v/QsP720LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+w1IxfuaQ8P7/kLD+/9Cw/v/QsP7/0bE+/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ - /P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srRcT7qkPD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ULD+6dCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7E0LD+2JCw/ukQ8P71EPD - +/VCw/v/QsP7/0LD+/NCw/vSQsP7pELD+2JCw/sTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP/wD///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABgAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gA - AB/8AAA//gAAf/+AAf//8A//KAAAADAAAABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD+/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD - +yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7GELD+3ZCw/vSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vSQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sIQsP7gELD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG - +/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD - +4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y1Cw/vXQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td - /f/E7P7/6vj//////////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/33W - /P/Q8P7//v////////////////////////////////////////////////////////////////////7/ - ///Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// - /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD - +/9Cw/v/R8X7/7Hm/f/+//////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkLD - +/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////7////S8f7/oOH9/3zV - /P9mzvz/Wcr7/1rL/P9pz/z/gNf8/6Xj/f/Z8/7//////////////////////////////////////9vz - /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/stQ8P7+ULD+/9Cw/v/QsP7/1zL/P/p+P/////////////////////////////4/f//quT9/1jK - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8/7Ln/f/7/v////////// - ///////////////////p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+whGxPvbQsP7/0LD+/9Cw/v/Vsn7/+n4/////////////////////////////8/w - /v9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9izfz/1/L+////////////////////////////6fj//1bJ+/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4BCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// - ////////p+P9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/SMX7/0zG+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/7Dm/f///////////////////////////9vz/v9Hxfv/QsP7/0LD - +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////// - //////////////////+c3/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9cy/z/pOL9/9by/v/3/P////////// - ///3/P//0PD+/53g/f9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4v3///////////////////////// - //+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD+x8AAAAAAAAAAAAAAAAAAAAAR8X7nELD+/9Cw/v/QsP7/27R - /P/+/////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/Ucj7/7np/v/+//////////// - ///////////////////////////////////7/v//sOb9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/uen+//// - ///////////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAAAABCw/sYQ8P7/ELD - +/9Cw/v/QsP7/9rz/v//////////////////////+/7//07H+/9Cw/v/QsP7/0LD+/9lzvz/6vj///// - /////////////////////////////////////////////////////////////+X3/v9gzPz/QsP7/0LD - +/9Cw/v/Tsf7//v+////////////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAA - AABDw/t3QsP7/0LD+/9Cw/v/fdb8////////////////////////////+P3//0bE+/9Cw/v/QsP7/1zL - /P/v+v////////////////////////////////////////////////////////////////////////// - ///v+v//Wsv8/0LD+/9Cw/v/RsT7//j9/////////////////////////////33W/P9Cw/v/QsP7/0LD - +/9Cw/t2AAAAAAAAAABMxvvdQsP7/0LD+/9Cw/v/0PD+/////////////////////////////////63l - /f9Lxvv/Yc38/9/1/v////////////////////////////////////////////////////////////// - ////////////////////////3/X+/2HN/P9Lxvv/reX9/////////////////////////////////9Dw - /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAELD+yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7///9Zyvv/QsP7/0LD+/9Cw/v/QsP7IELD+2BCw/v/QsP7/0LD+/+U3f3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YE/H+6RCw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////+s5f3/md/9///////N7/7/gtf8//X8 - ////////////////////////////////////////////////////////+/7//4ra/f/A6/7//////6jj - /f+c4P3////////////////////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mVLI - +9FCw/v/QsP7/0LD+//q+P////////////////////////////////////////////9Zyvv/QsP7//// - //+J2v3/QsP7/9Dw/v//////////////////////////////////////////////////////3vT+/0LD - +/9z0/z//////0/H+/9Dw/v////////////////////////////////////////////q+P//QsP7/0LD - +/9Cw/v/QsP7wEvG+/FCw/v/QsP7/0rG+///////////////////////////////////////9fz//7np - /v9Nx/v/QsP7/5Td/f9gzfz/QsP7/4DX/P+t5f3//v////////////////////////////////////// - //+36P3/hdj8/0LD+/9Wyfv/lN39/0bE+/9Cw/v/s+f9//H7//////////////////////////////// - ////////Ssb7/0LD+/9Cw/v/QsP75kbE+/pCw/v/QsP7/1vL/P////////////////////////////// - ///Y8/7/VMn7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3/X+//////////////////// - /////////////+76//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//P8P7///////// - ////////////////////////W8v8/0LD+/9Cw/v/QsP79ELD+/9Cw/v/QsP7/2XO/P////////////// - //////////////7///9dy/z/QsP7/0LD+/9Nx/v/ZM78/2XO/P9lzvz/V8r7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/1XJ+/9lzvz/Zc78/2XO/P9Px/v/QsP7/0LD - +/9RyPv/9/z/////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO - /P///////////////////////////9vz/v9Cw/v/QsP7/4DX/P/7/v//////////////////uOj9/0LD - +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl/f////////////// - ///+////kdz9/0LD+/9Cw/v/yO7+////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0bE - +/pCw/v/QsP7/1vL/P///////////////////////////8vv/v9Cw/v/QsP7/8Hr/v////////////// - ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl - /f//////////////////////1fL+/0LD+/9Cw/v/uen+////////////////////////////W8v8/0LD - +/9Cw/v/QsP79EvG+/FCw/v/QsP7/0rG+////////////////////////////+X3/v9Cw/v/QsP7/4va - /f/+////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 - /v9Cw/v/QsP7/6zl/f//////////////////////nOD9/0LD+/9Cw/v/0/H+//////////////////// - ////////Ssb7/0LD+/9Cw/v/QsP75lPI+9NCw/v/QsP7/0LD+//q+P////////////////////////// - //971fz/QsP7/0LD+/9Yyvv/cdL8/3HS/P9x0vz/X8z8/0LD+/9Cw/v/2/T+//////////////////// - /////////////+f3/v9Cw/v/QsP7/1zL/P9x0vz/cdL8/3HS/P9dy/z/QsP7/0LD+/9pz/z//v////// - ///////////////////q+P//QsP7/0LD+/9Cw/v/QsP7wFPI+6hCw/v/QsP7/0LD+//E7P7///////// - ///////////////////w+v//T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +//m9/7////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mUTE+2FCw/v/QsP7/0LD - +/+U3f3///////////////////////////+R3P3/QsP7/0LD+/9mzvz/htn8/4jZ/P+I2fz/btH8/0LD - +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/2nP/P+I2fz/iNn8/4jZ - /P9s0Pz/QsP7/0LD+/991vz///////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YELD - +yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////z+//9Hxfv/QsP7/3zV/P////////////// - ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl - /f//////////////////////j9v9/0LD+/9Cw/v/7/r///////////////////7///9Zyvv/QsP7/0LD - +/9Cw/v/QsP7IAAAAABOx/vgQsP7/0LD+/9Cw/v/0PD+//////////////////P7//9Cw/v/QsP7/5je - /f//////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 - /v9Cw/v/QsP7/6zl/f//////////////////////rOX9/0LD+/9Cw/v/3vT+/////////////////9Dw - /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAAAAAABGxPt5QsP7/0LD+/9Cw/v/fdb8//////////////////7/ - //9SyPv/QsP7/0/H+/+56f7/2fP+/9v0/v/b9P7/ouH9/0LD+/9Cw/v/2/T+//////////////////// - /////////////+f3/v9Cw/v/QsP7/5je/f/b9P7/2/T+/9vz/v+/6/7/V8r7/0LD+/9GxPv/9vz///// - /////////////33W/P9Cw/v/QsP7/0LD+/9Cw/t2AAAAAAAAAABCw/sYRMT7/ULD+/9Cw/v/QsP7/9rz - /v////////////////+n4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+V3f3/////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAAAAAAAAAATMb7oELD - +/9Cw/v/QsP7/27R/P/+///////////////+////peP9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Hxfv/7Pn///////////////////////////////////f8//9Ox/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Ssb7/5vf/f/9/v/////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAA - AAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////////////////////z+//9Wyfv/QsP7/9v0 - /v971fz/QsP7/7Xn/f/s+f/////////////////////////////////////////////v+v//v+v+/0LD - +/9oz/z/2/T+/0vG+/9Cw/v/+/7///////////////////////+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD - +x8AAAAAAAAAAAAAAAAAAAAAAAAAAEbE+4NCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// - //9u0fz/Vcn7//////+d4P3/Q8P7/+D1/v////////////////////////////////////////////// - ////////7fn//0jF+/+J2v3//////2bO/P9Zyvv//////////////////////9vz/v9Hxfv/QsP7/0LD - +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whJxfvfQsP7/0LD+/9Cw/v/Vsn7/+n4 - ///////////////////4/f//9fz////////+////8Pr///////////////////////////////////// - //////////////////////////////H7///9/v////////j9///1/P//////////////////6fj//1bJ - +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/stRMT7+kLD - +/9Cw/v/QsP7/1zL/P/p+P////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7WkLD+/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////9vz/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD+/9Cw/v/R8X7/7Hm/f/+//////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// - /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD - +/lCw/v/QsP7/0LD+/9Cw/v/QsP7/33W/P/Q8P7//v////////////////////////////////////// - //////////////////////////////7////Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD - +1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+y1Dw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td/f/E7P7/6vj///// - /////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7gEPD+/lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0rG+/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7+ELD+4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7GELD+3ZCw/vTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vTQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD - +/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//4Af//wAA//8AAP//AAD/+AAAH/8AAP/g - AAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAP - AADgAAAAAAcAAOAAAAAABwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAA - AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAA - AAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/gAAAAB/ - AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/AAD/4AAAB/8AAP/4AAAf/wAA//8AAP//AAD//+AH//8AAA== - - \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index a84dcc3..8e9c178 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -56,6 +56,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, public Form_Main() { InitializeComponent(); + this.Icon = NiceHashMiner.Properties.Resources.logo; InitLocalization(); diff --git a/NiceHashMiner/Forms/Form_Main.resx b/NiceHashMiner/Forms/Form_Main.resx index 4de6aaa..d4f816a 100644 --- a/NiceHashMiner/Forms/Form_Main.resx +++ b/NiceHashMiner/Forms/Form_Main.resx @@ -117,4773 +117,11 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 17, 17 - - + + 133, 17 - - - - - AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAKCAEAK4EAAAgIAAAAQAgAKgQAADWJAQAMDAAAAEA - IACoJQAAfjUEACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7NVTJ+6pMxvvsQ8P7/EPD+/xJxfvoRMT7nELD+zUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sOV8r7ukLD+/9mz/z/o+L9/7/r/v+/6/7/o+L9/2XO/PxCw/v/Q8P7pkLD+w4AAAAAAAAAAAAA - AABCw/sOVcn730/H+//D7P7//////+z5///K7v7/yu7+/+/6////////w+z+/0zG+/pExPvLQsP7DgAA - AAAAAAAAXcz8wU/H+//j9v7/9Pv//4TY/P9Dw/v/QsP7/0LD+/9Dw/v/iNn8//T7///j9v7/S8b7+ULD - +6UAAAAAYMz8P0LD+//D7P7//v///2zQ/P9Vyfv/ver+//b8///1/P//ver+/1TJ+/9s0Pz//v///8Ps - /v9Cw/v/QsP7NWvQ/MRmz/z///////z+//+L2v3/4/b+///////////////////////i9v7/i9r9//3+ - ////////YMz89ELD+5pTyPv1o+L9////////////v+v+/8bt/v/1/P/////////////7/v//wev+/73q - /v///////////6Pi/f5Dw/vhRcT7/r/r/v//////vOr+/1PI+/9Wyfv/hdj8////////////i9r9/1TJ - +/9Qx/v/t+j9//////+/6/7/Q8P7+0XE+/6/6/7//////3HS/P/Y8/7/5/f+/3HS/P///////////3HS - /P/b9P7/2/T+/2zQ/P//////v+v+/0PD+/tTyPv1o+L9//////+f4f3/T8f7/2DN/P9x0vz///////// - //9x0vz/Xsz8/0/H+/+Z3/3//////6Pi/f9Dw/vhbND8xmbP/P//////gNf8/77q/v/d9P7/cdL8//// - ////////cdL8/9Lx/v/B6/7/eNT8//////9gzfz2QsP7mmfP/EJCw/v/w+z+/9Px/v9Yyvv/Vsn7/5Td - /f///////////5rf/f9TyPv/Vcn7/9Dw/v/D7P7/QsP7/0LD+zUAAAAAYM38xU/H+//j9v7/1/L+/9v0 - /v/6/f/////////////9/v//2PP+/9fy/v/j9v7/TMb7+kLD+6UAAAAAAAAAAELD+w5XyvviT8f7/8Ps - /v/////////////////////////////////D7P7/TMb7+0XE+8xCw/sOAAAAAAAAAAAAAAAAQsP7DlvL - /L5Cw/v/Zs/8/6Pi/f+/6/7/v+v+/6Pi/f9lzvz9QsP7/0TE+6dCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAARsT7N1nK+69Nx/vtRMT7/UPD+/xLxvvqSMX7n0LD+zYAAAAAAAAAAAAAAAAAAAAA+B8AAOAH - AADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAADgBwAA+B8AACgA - AAAAAQAAAAIAAAEAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7EELD+zBCw/tSQsP7akLD+31Cw/uRQsP7pULD+7hCw/vLQsP73kLD++BCw/vvQsP78ELD - +/dCw/v/QsP7/0LD+/9Cw/v/QsP790LD+/BCw/vvQsP74ELD+95Cw/vLQsP7uELD+6VCw/uRQsP7fULD - +2pCw/tSQsP7MELD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+zFCw/tgQsP7jULD - +65Cw/vOQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD+85Cw/uuQsP7jULD+2BCw/sxQsP7CAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7Q0LD+3pCw/upQsP71kLD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vWQsP7qULD - +3pCw/tDQsP7DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD+5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD+1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sIQsP7R0LD+5BCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9lCw/uQQsP7R0LD+wgAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD - +21Cw/u0QsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7tELD - +21Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/twQsP7yELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+8hCw/twQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7bULD+8NCw/v+QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/5Cw/vDQsP7bULD+xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+0NCw/upQsP7+ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7qULD+0NCw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD - +3pCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/ulQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7+0LD+6VCw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sBQsP7SULD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7xCw/tJQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AkLD+1hCw/vbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9tCw/tYQsP7AgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sBQsP7UkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9ZCw/tSQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yRCw/uxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7FCw/skAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD - +4tCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD+4pCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD - ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vULD - +yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/t0QsP79kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9r0Pz/gtf8/5fe/f+l4/3/s+f9/8Hr - /v/Q8P7/2/T+/+b3/v/n9/7/7Pn///P7///z+///8/v///P7///s+f//5/f+/+b3/v/b9P7/0PD+/8Hr - /v+z5/3/peP9/5fe/f+C1/z/a9D8/1PI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v2QsP7dELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/vMQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0TE+/9gzfz/g9j8/6Xi/f/G7f7/4PX+//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+P3//+D1/v/G7f7/peL9/4PY/P9gzfz/RMT7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vMQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+3dCw/v6QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1jK - +/+F2Pz/seb9/9rz/v/6/f////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - ///a8/7/seb9/4XY/P9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/t3QsP7AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD+79Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/+O2/3/v+v+/+v5 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+v5//+/6/7/jtv9/1fK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+79Cw/scAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7nULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/d9T8/7bo/f/y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////L7 - //+26P3/d9T8/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7nULD - +wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP7zULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P+y5/3/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////v+v//suf9/27R/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vNQsP7IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Qx/v/ld39/+D1/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4PX+/5Xd/f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/t7QsP7/ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/2zQ/P+86v7/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+v3//7zq/v9s0Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ULD+3tCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/utQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/f9b8/9Tx/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////9Tx - /v9/1vz/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rULD+woAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +/+R3P3/5Pb+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+T2/v+R3P3/R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vjQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/47b - /f/p+P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+n4//+O2/3/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++NCw/suAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/vxQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/iNn8/+f3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+b3/v+I2fz/RMT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ULD - +0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v931Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/I7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////8ju - /v9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/1Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/6vk/f/7/v////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////+/7//6vk/f9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////v+v+/1LI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t4AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz/8fv///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////x+///hdj8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3gAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////++6v7/Tcf7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/o+P////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+j4 - //9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/6Lh/f/9/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////f7//6Lh/f9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/ULD+1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vxQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////v///+35///W8v7/x+3+/7rp/v+t5f3/oeH9/5rf/f+U3f3/lN39/4zb - /f+U3f3/lN39/5fe/f+g4f3/qeT9/7bo/f/D7P7/0/H+/+f3/v/7/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/FCw/suAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vjQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////j9 - ///T8f7/s+f9/5Td/f931Pz/Wsv8/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9u0fz/i9r9/6vk - /f/I7v7/7vr///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////j9//+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP740LD+xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//+76f7/i9r9/2PO - /P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Xyvv/ftb8/6nk/f/Y8/7//f7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Ti/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/utQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/vOr+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////r9///K7v7/kdz9/1zL/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/991vz/tuj9/+35//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////vOr+/0bE - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+61Cw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t7QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/0vH+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////6/f//xOz+/4LX/P9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/a9D8/6zl - /f/s+f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///S8f7/T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ewAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////9nz/v+Q3P3/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7/3PT/P+86v7/+f3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+D1/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP77ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/5Pf+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////7/v//uOj9/2fP/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+/+W3v3/5/f+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5Pf+/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP77ULD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7zULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//+j4v3/U8j7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/991vz/1fL+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////q+P//Xcv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////8/v//6Dh/f9Nx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/900/z/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+/6//9jzfz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///4/f//qOP9/03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/920/z/2/P+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////7/r//13L/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD++5Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+/6/7/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+G2fz/6/n///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////q+P//Wsv8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++5Cw/scAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+H1 - /v9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG+/+n4/3/+/7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+T3 - /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3dCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////+/7//6Hh - /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/U8f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////4PX+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t3AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/v6QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/0vH+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////3fT+/2XO - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5be/f/5/f////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////S8f7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD - +zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/vNQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/vOr+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////+////qeT9/0bE - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/X8z8/9vz - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7zq/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t0QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////w+v//d9T8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9GxPv/q+T9//7///////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////pOL9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP79kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////Y8/7/V8r7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+A1/z/9vz///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v2QsP7IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+66f7/R8X7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2LN/P/k9/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//2bP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7YELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+b3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7/8ru/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/T8f7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD - ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8vv/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////z+//+I2fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/tuj9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////8vv - /v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++lCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Lh/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//961fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/9ay/z/btH8/4DX - /P+L2v3/mN79/6Dh/f+g4f3/qOP9/6Dh/f+g4f3/nN/9/4/b/f+C1/z/dNP8/1/M/P9Jxfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4f3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////ouH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yRCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/9/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////T7//9u0fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/4LX/P+o4/3/ye7+/+f3/v/9/v////////// - /////////////////////////////////////////////////////////////////////////////+/6 - ///R8P7/s+f9/47b/f9pz/z/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Hc - /f/+//////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////3+//9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/skAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/uyQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//o+P////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////T7//9q0Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Vsn7/47b/f/A6/7/7fn///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////j9///Q8P7/n+H9/2nP/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/j9v9//7///////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6Pj//03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7sgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//9y0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/1rL/P+a3/3/2fP+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////7vr//7Ln/f9z0/z/Q8P7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+P2/3//v////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sBQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////v+//900/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Hxfv/iNn8/9Hw/v/+//////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+v5 - //+l4/3/W8v8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4XY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7z0LD+wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7U0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/8fv///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+E2Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH - +/+k4v3/7/r///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7////G7f7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/n+D9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////x+///Usj7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+Z3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7/6bj - /f/2/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////Q8P7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+1hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+56f7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Ixfv/oOH9//b8 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Q8P7/bND8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8nu/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////e9X8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/vcQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+r4//////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////Y8/7/R8X7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz/5/f+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+56f7/Usj7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+r4 - //9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6vk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////y+///V8r7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ+//J7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////X8 - //+U3f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1/M - /P/1/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////q+T9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sBQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/7/v////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////f9b8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////8/w/v9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP71ELD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7SkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//I7v7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////uen+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/7zq/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////9fz//4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////yO7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tKAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////8fv//07H - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////s+f9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7//H7//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////57g - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//T7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////X8v7/Vsn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+e4P3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4fX+/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/ulQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////7/ - //9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//v+//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9kzvz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//7///////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///h9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//7///////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////9Pv//3LS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//i9v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7ekLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////xe3+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///7/v//e9X8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+O2/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +//p+P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7jo/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////6fj//0fF - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+91Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+R3P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////H7f7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/i9r9//7///////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//3LS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//K7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/5Pf+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5Pb+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//3+//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////1/P//Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4/b+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5Pf+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7+ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/f9b8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7///9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8//P7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+v5//9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//7/ - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9/1vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7FAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/9Tx/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////mN79/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/970/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////1fL+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+8NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/23R/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+z5//9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+p5P3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0vG - +//s+f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/v+QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////s+f9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT/P/+//////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////v///3TT - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+y5/3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////vOr+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/kLD - +xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/twQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+W3v3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///y+///Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+W3v3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////r9//9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7yELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/ld39//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////6rk - /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3rV/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +/+q5P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ld39/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////4fX+/4HX/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zc78/8Dr/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////8Dr/v9mzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7/4HX - /P/h9f7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////8vv//8Dr/v+i4f3/lN39/5/g/f+56f7/4fX+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+H2/v+36P3/oOH9/5Td/f+h4f3/wOv+//L7 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/u0QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+y5/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////7Ln - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sIQsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///v+v//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/d9T8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3fU/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+5BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7bo/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uQAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+//y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////8vv//0XE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP72QAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sbAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7V0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qeT9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+5JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////971/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vNAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/ELD+wwAAAAAAAAAAAAAAAAAAAAAQsP7Q0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+/6/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tDAAAAAAAAAAAAAAAAAAAAAELD+3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7////+//////////////////////////////////////////// - //////////////////////////////////////////////z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////v+//////////////////////////////////////////////// - ////////////////////////////////////////+/7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////6/n//0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK - +/////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/2rQ/P9ExPv/RMT7/2nP/P+/6/7///////////////////////// - ///////////////////////////////////k9/7/hNj8/0zG+/9Cw/v/V8r7/5nf/f/1/P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////R8P7/dNP8/0bE+/9Cw/v/YM38/63l/f/9/v////////////////////////// - /////////////////////////////+/6//+R3P3/Ucj7/0LD+/9Px/v/i9r9/+z5//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAQsP71kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+F2Pz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////neD9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5je/f////////////// - ///////////////////////////////////W8v7/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YM38//L7 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+26P3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ftb8//3+//////////////// - /////////////////////////////+j4//9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9TyPv/4vb+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////hdj8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vWAAAAAAAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////ze/+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/yu7+//// - ///////////////////////////////////7/v//Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+F2Pz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////l9/7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+t5f3///////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2nP - /P/+//////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAELD+zFCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/9rz/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV - /P//////////////////////////////////////xOz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7//H7//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////nN/9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8//// - ///////////////////////////////////i9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/2PP+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////a8/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sxAAAAAAAAAABCw/tgQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0TE+//6/f////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9cy/z//////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//U8f7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3rV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//7/v//////////////////////////////////v+v+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/7bo/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+v3//0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAQsP7jULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9hzfz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD - +65Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////g9j8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uuAAAAAAAA - AABCw/vPQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7zwAA - AAAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////G7f7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/AAAAAAQsP7EELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////4PX+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7EELD+zBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+zBCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////3+///k9v7/U8j7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/6Dh - /f9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8/6Dh/f+g4f3/oOH9/6Dh - /f+m4/3/y+/+//z+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+v5//+15/3/oeH9/6Dh/f+g4f3/oOH9/6Dh/f9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/33W - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+W3v3/8/v///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////U8j7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tSQsP7akLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Y8/7/neD9/27R/P9Hxfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9dy/z/0vH+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//5be/f9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Xyvv/hdj8/7fo - /f/y+/////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////2vQ - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7akLD+31Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////9Pv//6nk/f9cy/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//Q8P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////v///33W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RcT7/33W/P/R8P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+D2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+31Cw/uSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//quT9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//n9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/a8/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uSQsP7pULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+l4/3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////d9P7/ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5zf/f/7/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////6Xj/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7pULD+7hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/s+f9//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////A6/7/ScX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////6/f//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cNL8//H7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7hCw/vLQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP73kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//Q8P7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////B6/7/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO - /P/3/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73kLD++BCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/2/T+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////f9f7/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////b9P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++BCw/vvQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/+f3/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////9/v//ac/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP78ELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//n9/7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////seb9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//b8//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/7fn///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+P3//1TJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+m4/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////s+f//QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Vcn7//z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////8/v//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P+Z3/3/x+3+/+j4 - ///3/P////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////3+///v+v//3vX+/7Ln/f9+1vz/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//H7f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////P7//9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////u+v//Q8P7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/7bo/f/+//////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+n4//+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/itr9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////z+///QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////uen+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/XMv8/+f3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6rk/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ+/////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////8/v//0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//t+f////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////5Hc/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+X3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////lt79/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/6fj///// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+35 - //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/5/f+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9t0fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////n9 - //9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/BCw/vvQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+f3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////Vcn7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+//4/f////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+t5f3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP74ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//b9P7///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////v///0PD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+C1/z///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/md/9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////9v0/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP74ELD+95Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////P7 - //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qOP9//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////Q8P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+95Cw/vLQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///v+v//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7np - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////2DN/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP7uELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+z5/3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////8/v//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//A6/7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7Pn/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7uELD+6VCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/peP9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5nf/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+l4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6VCw/uTQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5fe/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5nf/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+f3//0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+o4/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uTQsP7fULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+D2Pz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3DS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9mz/z///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////8zv/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4PY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7fULD - +2pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/a9D8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9jz/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+r4//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9r0Pz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +2pCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////wuz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9v0fz//f7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////T8f7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13L/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////U8j7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tSQsP7MELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/+P3///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////b8//9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//Vcn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+X3v3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7MELD+xBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////gtf8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//X8//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Q8P7/Vcn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2vP+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+xAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9jz/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Uyfv/p+P9/+f3 - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+f3//83v/v9+1vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cdL8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////G7f7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/AAAAAAAAAAAELD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////dtP8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/V8r7/3fU/P+F2Pz/k939/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td - /f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/1bJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/etX8/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td - /f+U3f3/lN39/5Td/f+U3f3/lN39/43b/f+A1/z/bND8/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/87v/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////peL9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vPAAAAAAAAAABCw/uuQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4PY/P////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+T3 - /v9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////4PY - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rgAAAAAAAAAAQsP7jULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9hzfz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////qOP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+//v+v////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD+2BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7//r9 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7///+C1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF+//T8f7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///6/f//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tgAAAAAAAAAABCw/syQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//a8/7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//F7f7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////2vP+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//i9r9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+//Q8P7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAAAAAABCw/vWQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4XY/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+46P3/Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3PT/P/q+P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9YAAAAAAAAAAAAAAAAAAAAAQsP7qULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9ay/z///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////2/T+/1vL/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+U3f3/+/7///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAELD - +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////xe3+/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS - /P/0+/////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6/n//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAA - AABCw/tDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////x+3+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/atD8//f8//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0MAAAAAAAAAAAAA - AAAAAAAAQsP7DELD+/xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////3PT+/0nF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+A1/z//v////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+O2/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/sMAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//13M/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/67l/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7kkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3vX+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////5zg/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////3vX+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7kgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1dCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6nk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+z5//9Ixfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/etX8/7Pn - /f/b9P7/9/z///////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - ///////////////////+////7vr//8nu/v+c4P3/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////6nk/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+a3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9x0vz/4vb+//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////z+//+z5/3/S8b7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/7fn///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+9lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7//L7 - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////+////Usj7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////930/v9RyPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6rk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////y+///RcT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/uQQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+26P3///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////0vH+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz//P7///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////zu/+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////tuj9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/d9T8//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////57g - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1/L+//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//X8 - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3fU/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/v2QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0XE+//v+v////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //951Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Y878//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//R8P7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9FxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/ZCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7tELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/suf9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Td - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////j9//9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/sOb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/u0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+o4/3///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////Usj7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6Ti/f////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/seQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/tuj9//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////1zL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+X3v3///////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////4PX+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+8hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5be/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6jj/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////5be - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/twQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+U3f3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////4/f//Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD+/5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Y878//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+86v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////btH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Y8/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4HX/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xe3+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Tx - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/bND8//z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+b3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xRCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9/1vz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////970/v9RyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/sUAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7qULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7/+T3/v////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/j9v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////P7//7Pn/f9Lxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+E2Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+T3/v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+R3P3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9pz/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/3vV - /P+z5/3/3fT+//j9//////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - /////////////////////////v///+76///K7v7/nOD9/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP73ULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/+n4//////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////sOb9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/ScX7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7//r9//////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////p+P//R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////b8 - //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////jtv9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3oAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//z+/////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+6VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//9jzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+46P3///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/ulAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7/+H1/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////3PT+/0jF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz//v////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+H1/v9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+96v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/9fz///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tKQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8ju - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7Pn///// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////I7v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+9RCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9ezPz/+/7///////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ver+/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lN39//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////5/f//QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz/7/r///// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9RCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6zl/f////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////c9P7/YM38/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////2TO/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/+Z3/3/+/7///// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7BELD+9xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////v+ - //+m4/3/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ - +//3/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2zQ/P/Y8/7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vcQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tYQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//+i4v3/WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD - +//I7v7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////f7//3XT - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/edT8/8zv/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD - +9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7////Q8P7/l979/2TO/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ - +//J7v7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///4/f//itr9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/3rV/P+x5v3/6/n///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1LI+//y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////9/z//1bJ+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/a9D8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4DX/P+U3f3/lN39/5Td/f+U3f3/m9/9/7/r - /v/4/f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////h9v7/qeT9/5Xd/f+U3f3/lN39/5Td/f+U3f3/Vsn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4/b/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f910/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////L7//9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AULD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/htn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////Wcr7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////// - //+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/+j4 - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////1nK - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+/////////////////////////////// - ////////oOH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// - //+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/uyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz//f7///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv///////////////////////// - /////////////6Dh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////// - ////////uOj9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////9/v//btH8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6Li/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////// - //////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////// - /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ouL9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP76ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Dw/v/y+/+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////2DM/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P////////////// - ////////////////////////peP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Xy - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7//z+//////////////// - ///////////////////B6/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/uOj9//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////y+/+/0PD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2BCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//n9/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+B1/z///////// - /////////////////////////////8ru/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +//1/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////6Lh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO/P////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/970 - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0/H+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Z8/8//n9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////2PP+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1PH+//// - ///////////////////////////////////9/v//Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+Q3P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////s+f//Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+56f7///////// - //////////////////////////////////991vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT - /P////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//2fP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yNCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+u5f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/q+T9//// - /////////////////////////////////////////////+H2/v9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/+P3///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////8ft/v9Ixfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+R3P3///////// - ////////////////////////////////////////8fv//2PO/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M - /P/s+f////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////4jZ/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7dELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////9Tx/v9/1vz/Vsn7/1bJ+/991vz/0vH+//// - ////////////////////////////////////////////////////////8Pr//5nf/f9gzfz/Usj7/2rQ - /P+t5f3/+/7///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4fb+/4jZ/P9ay/z/U8j7/3TT/P/B6/7///////// - ///////////////////////////////////////////////////3/P//peL9/2bO/P9SyPv/ZM78/6Dh - /f/1/P////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/vMQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ver+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////73q/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7MELD+/pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +//S8f7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9Lx/v9GxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t3QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/T8f7/+H1/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v9Px/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+T3/v9Wyfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP77kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P/q+P////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9ay/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1RCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcz8/+/6//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9dzPz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9jzfz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +whCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P/q+P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9dzPz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sIAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7IELD++1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wsv8/+T3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+T3/v9ay/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Wyfv/4fX+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v9Wyfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0/H+//S8f7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9Lx/v9Px/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t7AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7rULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/73q/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////73q/v9GxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7AQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD++NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz/+f3///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//4jZ/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP78ULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2fP/P/n9/7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/2fP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7LgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7VULD+/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/ouL9//3+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////9/v//ouL9/0PD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7VQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tlQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9u0fz/6Pj///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//btH8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ZQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////++6v7/Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7eELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4bZ/P/y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////L7//+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t4QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7/7/r/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7/r/v9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7dULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Mxvv/rOX9//v+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//rOX9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tlQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9ezPz/ye7+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////J7v7/Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7ZQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+H1/v931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7QULD+/FCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/+I2fz/5/f+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/4jZ/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7QQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP740LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/+O2/3/6fj///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////p+P//jtv9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7LgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0jF - +/+R3P3/5ff+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+X3/v+R3P3/SMX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CkLD+61Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0PD+/9/1vz/1PH+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////1PH+/3/W/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7e0LD - +/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz/ver+//r9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - //+96v7/bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/t7QsP7AQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/lt79/+D1/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////4PX+/5be - /f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+yBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/btH8/7Ln - /f/v+v////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//+y5/3/btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7CULD+51Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RcT7/3fU/P+26P3/8vv///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////y+///tuj9/3fU/P9FxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+51Cw/sJAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP7v0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7/47b/f+/6/7/7Pn///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////7Pn//7/r/v+O2/3/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/t4QsP7+kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9ay/z/hdj8/7Hm/f/b8/7/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///6/f//2/P+/7Hm/f+F2Pz/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7eELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +zBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/9hzfz/g9j8/6Xj/f/G7f7/4PX+//j9//////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//+D1/v/G7f7/peP9/4PY - /P9hzfz/RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7BELD+3RCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/U8j7/2vQ - /P+D2Pz/l979/6Xj/f+z5/3/wev+/9Hw/v/b9P7/5/f+/+f3/v/t+f//8/v///T7///0+///8/v//+35 - ///n9/7/5/f+/9v0/v/R8P7/wev+/7Pn/f+l4/3/l979/4PY/P9r0Pz/U8j7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/t0QsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7I0LD+71Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP7i0LD+/pCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7i0LD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7skLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/uyQsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wFCw/tTQsP71kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP71kLD+1NCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/tYQsP73ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vcQsP7WELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/tKQsP7vELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vELD - +0pCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sxQsP7pULD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/ulQsP7MQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+3pCw/sYAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7Q0LD+6pCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/uqQsP7Q0LD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7FELD+21Cw/vDQsP7/kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7w0LD+21Cw/sUAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +xpCw/txQsP7yELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8hCw/txQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/seQsP7bkLD+7VCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/ZCw/u1QsP7bkLD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+0dCw/uQQsP72ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vZQsP7kELD+0dCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD - +5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD - +1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wxCw/tDQsP7ekLD+6lCw/vWQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+9ZCw/upQsP7ekLD+0NCw/sMAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/syQsP7YELD+41Cw/uuQsP70ELD - +/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/BCw/vQQsP7rkLD+41Cw/tgQsP7MkLD+wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7EELD+zFCw/tSQsP7akLD+31Cw/uTQsP7pkLD+7hCw/vLQsP73kLD++BCw/vwQsP78ELD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/vwQsP74ELD+95Cw/vLQsP7uELD+6ZCw/uTQsP7fULD - +2pCw/tSQsP7MULD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////4AAAf - ////////////////////////////////////8AAAAAAP//////////////////////////////////4A - AAAAAAB/////////////////////////////////wAAAAAAAAAP///////////////////////////// - //wAAAAAAAAAAD//////////////////////////////4AAAAAAAAAAAB/////////////////////// - //////8AAAAAAAAAAAAA////////////////////////////+AAAAAAAAAAAAAAf//////////////// - ///////////AAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAAP////////// - ///////////////4AAAAAAAAAAAAAAAAH////////////////////////+AAAAAAAAAAAAAAAAAH//// - ////////////////////gAAAAAAAAAAAAAAAAAH///////////////////////4AAAAAAAAAAAAAAAAA - AH//////////////////////+AAAAAAAAAAAAAAAAAAAH//////////////////////gAAAAAAAAAAAA - AAAAAAAH/////////////////////4AAAAAAAAAAAAAAAAAAAAH////////////////////+AAAAAAAA - AAAAAAAAAAAAAH////////////////////wAAAAAAAAAAAAAAAAAAAAAP///////////////////8AAA - AAAAAAAAAAAAAAAAAAAP///////////////////gAAAAAAAAAAAAAAAAAAAAAAf///////////////// - /4AAAAAAAAAAAAAAAAAAAAAAAf//////////////////AAAAAAAAAAAAAAAAAAAAAAAA//////////// - //////wAAAAAAAAAAAAAAAAAAAAAAAA/////////////////+AAAAAAAAAAAAAAAAAAAAAAAAB////// - ///////////gAAAAAAAAAAAAAAAAAAAAAAAAB////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAD - ////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH///////////////8AAAAAAAAAAAAAAAAAAAAA - AAAAAP///////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////4AAAAAAAAAAAAAAAA - AAAAAAAAAAAf//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////4AAAAAAAAAAA - AAAAAAAAAAAAAAAAB//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////4AAAAAA - AAAAAAAAAAAAAAAAAAAAAAH/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////4A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAf////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////// - ///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/// - ////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAP//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////////AAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAD/////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////////gAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////gAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAB////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////gAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/ - //////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAP//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////gAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAB//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAA/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////4AAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - P////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAB////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//4AAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - Af//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAD///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///+AAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////wAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAf////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAP/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////+AAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////wAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAD///////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////+AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// - /4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/ - ///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAH////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////4AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAH/////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////AAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAD/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////wAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAD///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////////AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////// - ///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/// - /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAA - Af/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAf/////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////4AAAAAAAAAAAAAAAA - AAAAAAAAAAAf//////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////wAAAAAAAAAA - AAAAAAAAAAAAAAAA////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH////////////////AAAAA - AAAAAAAAAAAAAAAAAAAAA////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAH//////////////// - +AAAAAAAAAAAAAAAAAAAAAAAAB/////////////////8AAAAAAAAAAAAAAAAAAAAAAAAP/////////// - //////8AAAAAAAAAAAAAAAAAAAAAAAD//////////////////4AAAAAAAAAAAAAAAAAAAAAAAf////// - ////////////4AAAAAAAAAAAAAAAAAAAAAAH///////////////////wAAAAAAAAAAAAAAAAAAAAAA// - //////////////////wAAAAAAAAAAAAAAAAAAAAAP////////////////////gAAAAAAAAAAAAAAAAAA - AAB/////////////////////gAAAAAAAAAAAAAAAAAAAAf/////////////////////gAAAAAAAAAAAA - AAAAAAAH//////////////////////gAAAAAAAAAAAAAAAAAAB///////////////////////gAAAAAA - AAAAAAAAAAAAf///////////////////////gAAAAAAAAAAAAAAAAAH////////////////////////g - AAAAAAAAAAAAAAAAB/////////////////////////gAAAAAAAAAAAAAAAAf//////////////////// - /////wAAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAD//////////////// - ///////////4AAAAAAAAAAAAAB////////////////////////////8AAAAAAAAAAAAA//////////// - /////////////////+AAAAAAAAAAAAf//////////////////////////////AAAAAAAAAAAP/////// - ////////////////////////wAAAAAAAAAP////////////////////////////////+AAAAAAAAf/// - ///////////////////////////////wAAAAAA/////////////////////////////////////4AAAf - //////////////////8oAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xNCw/tiQsP7pELD+9JCw/vzQsP7/0LD - +/9Cw/vzQsP70kLD+6RCw/tiQsP7EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytCw/unQ8P7+kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7p0LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+w1Dw/uWQ8P7/kLD+/9Cw/v/QsP7/0bE - +/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ/P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srR8X74ULD+/9Cw/v/QsP7/3XT - /P/A6/7/+P3///////////////////////////////////j9///A6/7/ddP8/0LD+/9Cw/v/QsP7/0LD - +9tCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7N0bE+/RCw/v/QsP7/2PO - /P/S8f7/////////////////////////////////////////////////////////////////0vH+/2PO - /P9Cw/v/QsP7/0LD++9Cw/s3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytGxPv1QsP7/0LD - +/+O2/3/+v3///////////////////j9///K7v7/peP9/5Td/f+W3v3/p+P9/87v/v/6/f////////// - ////////+v3//47b/f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sNS8b75kLD - +/9Cw/v/n+D9//////////////////P7//+X3v3/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H - +/+d4P3/9vz//////////////////5/g/f9Cw/v/QsP7/0LD+9tCw/sNAAAAAAAAAAAAAAAAAAAAAFDH - +6FCw/v/QsP7/47b/f/////////////////V8v7/Vcn7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Yyvv/2vP+/////////////////47b/f9Cw/v/QsP7/0LD+5UAAAAAAAAAAAAA - AABCw/srQ8P7/kLD+/9jzvz/+v3/////////////1PH+/0nF+/9Cw/v/QsP7/2LN/P+05/3/6Pj///7/ - ///8/v//5Pf+/6/m/f9dzPz/QsP7/0LD+/9Kxvv/2PP+////////////+v3//2PO/P9Cw/v/QsP7/ULD - +ysAAAAAAAAAAFXJ+7lCw/v/QsP7/9Lx/v////////////z+//9Xyvv/QsP7/0LD+/+f4P3//P7///// - //////////////////////////////v+//+Z3/3/QsP7/0LD+/9Xyvv//P7/////////////0vH+/0LD - +/9Cw/v/QsP7pwAAAABCw/sTRcT7/ULD+/910/z/////////////////+v3//0/H+/9Cw/v/nuD9//// - //////////////////////////////////////////////////+c4P3/QsP7/0/H+//7/v////////// - ////////ddP8/0LD+/9Cw/v5QsP7E0/H+2lCw/v/QsP7/8Dr/v//////////////////////5ff+/83v - /v/+//////////////////////////////////////////////////////////7////N7/7/5ff+//// - ///////////////////A6/7/QsP7/0LD+/9Cw/tiXMv8vkLD+/9GxPv/+P3///////////////////// - ////////7fn////////v+v/////////////////////////////////////////////v+v///////+76 - ///+//////////////////////////j9//9GxPv/QsP7/0LD+6RUyfvoQsP7/2rQ/P////////////// - /////////////9Xy/v9GxPv/9fz//0PD+//h9v7/////////////////////////////////7Pn//0LD - +//k9/7/Usj7/8ft/v///////////////////////////2rQ/P9Cw/v/QsP70kjF+/tCw/v/h9n8//// - ///////////////////V8v7/fdb8/0LD+/951Pz/QsP7/3HS/P/T8f7//////////////////////9v0 - /v910/z/QsP7/3HS/P9FxPv/d9T8/9Dw/v//////////////////////h9n8/0LD+/9Cw/vzQsP7/0LD - +/+U3f3/////////////////3vX+/0bE+/9Cw/v/Vcn7/1nK+/9TyPv/QsP7/6Dh/f////////////// - ////////rOX9/0LD+/9SyPv/Wcr7/1XJ+/9Cw/v/Q8P7/9Px/v////////////////+U3f3/QsP7/0LD - +/9Cw/v/QsP7/5Td/f////////////////+l4/3/QsP7/7Tn/f///////////9Dw/v9Cw/v/oOH9//// - //////////////////+s5f3/QsP7/8Ts/v///////////8Dr/v9Cw/v/md/9/////////////////5Td - /f9Cw/v/QsP7/0jF+/tCw/v/h9n8/////////////////6fj/f9Cw/v/vOr+////////////0PD+/0LD - +/+g4f3//////////////////////6zl/f9Cw/v/xOz+////////////x+3+/0LD+/+Z3/3///////// - ////////h9n8/0LD+/9Cw/vzVcn76ULD+/9q0Pz/////////////////7Pn//1TJ+/9Dw/v/WMr7/1nK - +/9TyPv/QsP7/6Dh/f//////////////////////rOX9/0LD+/9SyPv/Wcr7/1nK+/9Dw/v/T8f7/+T3 - /v////////////////9q0Pz/QsP7/0LD+9JezPzBQsP7/0bE+//4/f/////////////z+///Wcr7/0TE - +/9s0Pz/cdL8/2XO/P9Cw/v/oOH9//////////////////////+s5f3/QsP7/2LN/P9x0vz/bND8/0fF - +/9SyPv/7Pn/////////////+P3//0bE+/9Cw/v/QsP7pFTJ+2xCw/v/QsP7/8Dr/v///////////73q - /v9Cw/v/reX9////////////0PD+/0LD+/+g4f3//////////////////////6zl/f9Cw/v/xOz+//// - ////////uun+/0LD+/+v5v3////////////A6/7/QsP7/0LD+/9Cw/tiQsP7E0XE+/1Cw/v/ddP8//// - ////////xOz+/0LD+/+C1/z/4vb+/+f3/v++6v7/QsP7/6Dh/f//////////////////////rOX9/0LD - +/+z5/3/5/f+/+P2/v+M2/3/QsP7/7np/v///////////3XT/P9Cw/v/QsP7+ULD+xMAAAAAWcr7vkLD - +/9Cw/v/0vH+///////4/f//ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////// - //+u5f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/9Pv////////S8f7/QsP7/0LD+/9Cw/unAAAAAAAA - AABCw/srQ8P7/0LD+/9jzvz/+v3////////4/f//peL9/0LD+/+a3/3/QsP7/5Hc/f/o+P////////// - /////////////+76//+X3v3/QsP7/47b/f9Hxfv/m9/9//b8////////+v3//2PO/P9Cw/v/QsP7/ULD - +ysAAAAAAAAAAAAAAABWyfunQsP7/0LD+/+O2/3////////////n9/7/f9b8//r9//961fz/7/r///// - //////////////////////////////b8//961fz/8vv//4fZ/P/e9f7///////////+O2/3/QsP7/0LD - +/9Cw/uVAAAAAAAAAAAAAAAAAAAAAELD+w1Nx/vpQsP7/0LD+/+f4P3///////////////////////// - ////////////////////////////////////////////////////////////////////////n+D9/0LD - +/9Cw/v/QsP720LD+w0AAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytIxfv3QsP7/0LD+/+O2/3/+v3///// - ////////////////////////////////////////////////////////////////////////+v3//47b - /f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zdHxfv2QsP7/0LD - +/9jzvz/0vH+/////////////////////////////////////////////////////////////////9Lx - /v9jzvz/QsP7/0LD+/9Cw/vvQsP7NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +ytKxvvlQsP7/0LD+/9Cw/v/dtP8/8Dr/v/4/f//////////////////////////////////+P3//8Dr - /v920/z/QsP7/0LD+/9Cw/v/QsP720LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+w1IxfuaQ8P7/kLD+/9Cw/v/QsP7/0bE+/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ - /P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srRcT7qkPD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ULD+6dCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7E0LD+2JCw/ukQ8P71EPD - +/VCw/v/QsP7/0LD+/NCw/vSQsP7pELD+2JCw/sTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP/wD///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABgAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gA - AB/8AAA//gAAf/+AAf//8A//KAAAADAAAABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD+/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD - +yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7GELD+3ZCw/vSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vSQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sIQsP7gELD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG - +/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD - +4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y1Cw/vXQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td - /f/E7P7/6vj//////////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/33W - /P/Q8P7//v////////////////////////////////////////////////////////////////////7/ - ///Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// - /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD - +/9Cw/v/R8X7/7Hm/f/+//////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkLD - +/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////7////S8f7/oOH9/3zV - /P9mzvz/Wcr7/1rL/P9pz/z/gNf8/6Xj/f/Z8/7//////////////////////////////////////9vz - /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/stQ8P7+ULD+/9Cw/v/QsP7/1zL/P/p+P/////////////////////////////4/f//quT9/1jK - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8/7Ln/f/7/v////////// - ///////////////////p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+whGxPvbQsP7/0LD+/9Cw/v/Vsn7/+n4/////////////////////////////8/w - /v9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9izfz/1/L+////////////////////////////6fj//1bJ+/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4BCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// - ////////p+P9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/SMX7/0zG+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/7Dm/f///////////////////////////9vz/v9Hxfv/QsP7/0LD - +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////// - //////////////////+c3/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9cy/z/pOL9/9by/v/3/P////////// - ///3/P//0PD+/53g/f9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4v3///////////////////////// - //+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD+x8AAAAAAAAAAAAAAAAAAAAAR8X7nELD+/9Cw/v/QsP7/27R - /P/+/////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/Ucj7/7np/v/+//////////// - ///////////////////////////////////7/v//sOb9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/uen+//// - ///////////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAAAABCw/sYQ8P7/ELD - +/9Cw/v/QsP7/9rz/v//////////////////////+/7//07H+/9Cw/v/QsP7/0LD+/9lzvz/6vj///// - /////////////////////////////////////////////////////////////+X3/v9gzPz/QsP7/0LD - +/9Cw/v/Tsf7//v+////////////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAA - AABDw/t3QsP7/0LD+/9Cw/v/fdb8////////////////////////////+P3//0bE+/9Cw/v/QsP7/1zL - /P/v+v////////////////////////////////////////////////////////////////////////// - ///v+v//Wsv8/0LD+/9Cw/v/RsT7//j9/////////////////////////////33W/P9Cw/v/QsP7/0LD - +/9Cw/t2AAAAAAAAAABMxvvdQsP7/0LD+/9Cw/v/0PD+/////////////////////////////////63l - /f9Lxvv/Yc38/9/1/v////////////////////////////////////////////////////////////// - ////////////////////////3/X+/2HN/P9Lxvv/reX9/////////////////////////////////9Dw - /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAELD+yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7///9Zyvv/QsP7/0LD+/9Cw/v/QsP7IELD+2BCw/v/QsP7/0LD+/+U3f3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YE/H+6RCw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////+s5f3/md/9///////N7/7/gtf8//X8 - ////////////////////////////////////////////////////////+/7//4ra/f/A6/7//////6jj - /f+c4P3////////////////////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mVLI - +9FCw/v/QsP7/0LD+//q+P////////////////////////////////////////////9Zyvv/QsP7//// - //+J2v3/QsP7/9Dw/v//////////////////////////////////////////////////////3vT+/0LD - +/9z0/z//////0/H+/9Dw/v////////////////////////////////////////////q+P//QsP7/0LD - +/9Cw/v/QsP7wEvG+/FCw/v/QsP7/0rG+///////////////////////////////////////9fz//7np - /v9Nx/v/QsP7/5Td/f9gzfz/QsP7/4DX/P+t5f3//v////////////////////////////////////// - //+36P3/hdj8/0LD+/9Wyfv/lN39/0bE+/9Cw/v/s+f9//H7//////////////////////////////// - ////////Ssb7/0LD+/9Cw/v/QsP75kbE+/pCw/v/QsP7/1vL/P////////////////////////////// - ///Y8/7/VMn7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3/X+//////////////////// - /////////////+76//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//P8P7///////// - ////////////////////////W8v8/0LD+/9Cw/v/QsP79ELD+/9Cw/v/QsP7/2XO/P////////////// - //////////////7///9dy/z/QsP7/0LD+/9Nx/v/ZM78/2XO/P9lzvz/V8r7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/1XJ+/9lzvz/Zc78/2XO/P9Px/v/QsP7/0LD - +/9RyPv/9/z/////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO - /P///////////////////////////9vz/v9Cw/v/QsP7/4DX/P/7/v//////////////////uOj9/0LD - +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl/f////////////// - ///+////kdz9/0LD+/9Cw/v/yO7+////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0bE - +/pCw/v/QsP7/1vL/P///////////////////////////8vv/v9Cw/v/QsP7/8Hr/v////////////// - ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl - /f//////////////////////1fL+/0LD+/9Cw/v/uen+////////////////////////////W8v8/0LD - +/9Cw/v/QsP79EvG+/FCw/v/QsP7/0rG+////////////////////////////+X3/v9Cw/v/QsP7/4va - /f/+////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 - /v9Cw/v/QsP7/6zl/f//////////////////////nOD9/0LD+/9Cw/v/0/H+//////////////////// - ////////Ssb7/0LD+/9Cw/v/QsP75lPI+9NCw/v/QsP7/0LD+//q+P////////////////////////// - //971fz/QsP7/0LD+/9Yyvv/cdL8/3HS/P9x0vz/X8z8/0LD+/9Cw/v/2/T+//////////////////// - /////////////+f3/v9Cw/v/QsP7/1zL/P9x0vz/cdL8/3HS/P9dy/z/QsP7/0LD+/9pz/z//v////// - ///////////////////q+P//QsP7/0LD+/9Cw/v/QsP7wFPI+6hCw/v/QsP7/0LD+//E7P7///////// - ///////////////////w+v//T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +//m9/7////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mUTE+2FCw/v/QsP7/0LD - +/+U3f3///////////////////////////+R3P3/QsP7/0LD+/9mzvz/htn8/4jZ/P+I2fz/btH8/0LD - +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/2nP/P+I2fz/iNn8/4jZ - /P9s0Pz/QsP7/0LD+/991vz///////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YELD - +yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////z+//9Hxfv/QsP7/3zV/P////////////// - ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl - /f//////////////////////j9v9/0LD+/9Cw/v/7/r///////////////////7///9Zyvv/QsP7/0LD - +/9Cw/v/QsP7IAAAAABOx/vgQsP7/0LD+/9Cw/v/0PD+//////////////////P7//9Cw/v/QsP7/5je - /f//////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 - /v9Cw/v/QsP7/6zl/f//////////////////////rOX9/0LD+/9Cw/v/3vT+/////////////////9Dw - /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAAAAAABGxPt5QsP7/0LD+/9Cw/v/fdb8//////////////////7/ - //9SyPv/QsP7/0/H+/+56f7/2fP+/9v0/v/b9P7/ouH9/0LD+/9Cw/v/2/T+//////////////////// - /////////////+f3/v9Cw/v/QsP7/5je/f/b9P7/2/T+/9vz/v+/6/7/V8r7/0LD+/9GxPv/9vz///// - /////////////33W/P9Cw/v/QsP7/0LD+/9Cw/t2AAAAAAAAAABCw/sYRMT7/ULD+/9Cw/v/QsP7/9rz - /v////////////////+n4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+V3f3/////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAAAAAAAAAATMb7oELD - +/9Cw/v/QsP7/27R/P/+///////////////+////peP9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Hxfv/7Pn///////////////////////////////////f8//9Ox/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Ssb7/5vf/f/9/v/////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAA - AAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////////////////////z+//9Wyfv/QsP7/9v0 - /v971fz/QsP7/7Xn/f/s+f/////////////////////////////////////////////v+v//v+v+/0LD - +/9oz/z/2/T+/0vG+/9Cw/v/+/7///////////////////////+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD - +x8AAAAAAAAAAAAAAAAAAAAAAAAAAEbE+4NCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// - //9u0fz/Vcn7//////+d4P3/Q8P7/+D1/v////////////////////////////////////////////// - ////////7fn//0jF+/+J2v3//////2bO/P9Zyvv//////////////////////9vz/v9Hxfv/QsP7/0LD - +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whJxfvfQsP7/0LD+/9Cw/v/Vsn7/+n4 - ///////////////////4/f//9fz////////+////8Pr///////////////////////////////////// - //////////////////////////////H7///9/v////////j9///1/P//////////////////6fj//1bJ - +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/stRMT7+kLD - +/9Cw/v/QsP7/1zL/P/p+P////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7WkLD+/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////9vz/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD+/9Cw/v/R8X7/7Hm/f/+//////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// - /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD - +/lCw/v/QsP7/0LD+/9Cw/v/QsP7/33W/P/Q8P7//v////////////////////////////////////// - //////////////////////////////7////Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD - +1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+y1Dw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td/f/E7P7/6vj///// - /////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7gEPD+/lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0rG+/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7+ELD+4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7GELD+3ZCw/vTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vTQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD - +/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//4Af//wAA//8AAP//AAD/+AAAH/8AAP/g - AAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAP - AADgAAAAAAcAAOAAAAAABwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAA - AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAA - AAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/gAAAAB/ - AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/AAD/4AAAB/8AAP/4AAAf/wAA//8AAP//AAD//+AH//8AAA== - \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index d48ca3e..bdd503d 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -40,6 +40,7 @@ private set { public Form_Settings() { InitializeComponent(); + this.Icon = NiceHashMiner.Properties.Resources.logo; //ret = 1; // default IsChange = false; diff --git a/NiceHashMiner/Forms/Form_Settings.resx b/NiceHashMiner/Forms/Form_Settings.resx index e04c2be..6298d83 100644 --- a/NiceHashMiner/Forms/Form_Settings.resx +++ b/NiceHashMiner/Forms/Form_Settings.resx @@ -117,4773 +117,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 17, 17 - - + + + 25 - - - - - AAABAAQAEBAAAAEAIABoBAAARgAAAAAAAAABACAAKCAEAK4EAAAgIAAAAQAgAKgQAADWJAQAMDAAAAEA - IACoJQAAfjUEACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7NVTJ+6pMxvvsQ8P7/EPD+/xJxfvoRMT7nELD+zUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sOV8r7ukLD+/9mz/z/o+L9/7/r/v+/6/7/o+L9/2XO/PxCw/v/Q8P7pkLD+w4AAAAAAAAAAAAA - AABCw/sOVcn730/H+//D7P7//////+z5///K7v7/yu7+/+/6////////w+z+/0zG+/pExPvLQsP7DgAA - AAAAAAAAXcz8wU/H+//j9v7/9Pv//4TY/P9Dw/v/QsP7/0LD+/9Dw/v/iNn8//T7///j9v7/S8b7+ULD - +6UAAAAAYMz8P0LD+//D7P7//v///2zQ/P9Vyfv/ver+//b8///1/P//ver+/1TJ+/9s0Pz//v///8Ps - /v9Cw/v/QsP7NWvQ/MRmz/z///////z+//+L2v3/4/b+///////////////////////i9v7/i9r9//3+ - ////////YMz89ELD+5pTyPv1o+L9////////////v+v+/8bt/v/1/P/////////////7/v//wev+/73q - /v///////////6Pi/f5Dw/vhRcT7/r/r/v//////vOr+/1PI+/9Wyfv/hdj8////////////i9r9/1TJ - +/9Qx/v/t+j9//////+/6/7/Q8P7+0XE+/6/6/7//////3HS/P/Y8/7/5/f+/3HS/P///////////3HS - /P/b9P7/2/T+/2zQ/P//////v+v+/0PD+/tTyPv1o+L9//////+f4f3/T8f7/2DN/P9x0vz///////// - //9x0vz/Xsz8/0/H+/+Z3/3//////6Pi/f9Dw/vhbND8xmbP/P//////gNf8/77q/v/d9P7/cdL8//// - ////////cdL8/9Lx/v/B6/7/eNT8//////9gzfz2QsP7mmfP/EJCw/v/w+z+/9Px/v9Yyvv/Vsn7/5Td - /f///////////5rf/f9TyPv/Vcn7/9Dw/v/D7P7/QsP7/0LD+zUAAAAAYM38xU/H+//j9v7/1/L+/9v0 - /v/6/f/////////////9/v//2PP+/9fy/v/j9v7/TMb7+kLD+6UAAAAAAAAAAELD+w5XyvviT8f7/8Ps - /v/////////////////////////////////D7P7/TMb7+0XE+8xCw/sOAAAAAAAAAAAAAAAAQsP7DlvL - /L5Cw/v/Zs/8/6Pi/f+/6/7/v+v+/6Pi/f9lzvz9QsP7/0TE+6dCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAARsT7N1nK+69Nx/vtRMT7/UPD+/xLxvvqSMX7n0LD+zYAAAAAAAAAAAAAAAAAAAAA+B8AAOAH - AADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAADgBwAA+B8AACgA - AAAAAQAAAAIAAAEAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7EELD+zBCw/tSQsP7akLD+31Cw/uRQsP7pULD+7hCw/vLQsP73kLD++BCw/vvQsP78ELD - +/dCw/v/QsP7/0LD+/9Cw/v/QsP790LD+/BCw/vvQsP74ELD+95Cw/vLQsP7uELD+6VCw/uRQsP7fULD - +2pCw/tSQsP7MELD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+zFCw/tgQsP7jULD - +65Cw/vOQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD+85Cw/uuQsP7jULD+2BCw/sxQsP7CAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7Q0LD+3pCw/upQsP71kLD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vWQsP7qULD - +3pCw/tDQsP7DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD+5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD+1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sIQsP7R0LD+5BCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9lCw/uQQsP7R0LD+wgAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD - +21Cw/u0QsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7tELD - +21Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/twQsP7yELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+8hCw/twQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7bULD+8NCw/v+QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/5Cw/vDQsP7bULD+xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+0NCw/upQsP7+ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7qULD+0NCw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD - +3pCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/ulQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7+0LD+6VCw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sBQsP7SULD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7xCw/tJQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AkLD+1hCw/vbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9tCw/tYQsP7AgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sBQsP7UkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9ZCw/tSQsP7AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yRCw/uxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7FCw/skAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD - +4tCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD+4pCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD - ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vULD - +yMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/t0QsP79kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9r0Pz/gtf8/5fe/f+l4/3/s+f9/8Hr - /v/Q8P7/2/T+/+b3/v/n9/7/7Pn///P7///z+///8/v///P7///s+f//5/f+/+b3/v/b9P7/0PD+/8Hr - /v+z5/3/peP9/5fe/f+C1/z/a9D8/1PI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v2QsP7dELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/vMQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0TE+/9gzfz/g9j8/6Xi/f/G7f7/4PX+//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+P3//+D1/v/G7f7/peL9/4PY/P9gzfz/RMT7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vMQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+3dCw/v6QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1jK - +/+F2Pz/seb9/9rz/v/6/f////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - ///a8/7/seb9/4XY/P9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/t3QsP7AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD+79Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/+O2/3/v+v+/+v5 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+v5//+/6/7/jtv9/1fK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+79Cw/scAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7nULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/d9T8/7bo/f/y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////L7 - //+26P3/d9T8/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7nULD - +wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP7zULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P+y5/3/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////v+v//suf9/27R/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vNQsP7IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Qx/v/ld39/+D1/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4PX+/5Xd/f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/t7QsP7/ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/2zQ/P+86v7/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+v3//7zq/v9s0Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ULD+3tCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/utQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/f9b8/9Tx/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////9Tx - /v9/1vz/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rULD+woAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +/+R3P3/5Pb+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+T2/v+R3P3/R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vjQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/47b - /f/p+P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+n4//+O2/3/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++NCw/suAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/vxQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/iNn8/+f3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+b3/v+I2fz/RMT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ULD - +0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v931Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/I7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////8ju - /v9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/1Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/6vk/f/7/v////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////+/7//6vk/f9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////v+v+/1LI+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t4AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz/8fv///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////x+///hdj8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3gAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////++6v7/Tcf7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/o+P////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+j4 - //9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1VCw/v9QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/6Lh/f/9/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////f7//6Lh/f9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/ULD+1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y5Cw/vxQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////v///+35///W8v7/x+3+/7rp/v+t5f3/oeH9/5rf/f+U3f3/lN39/4zb - /f+U3f3/lN39/5fe/f+g4f3/qeT9/7bo/f/D7P7/0/H+/+f3/v/7/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/FCw/suAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vjQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////j9 - ///T8f7/s+f9/5Td/f931Pz/Wsv8/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/9u0fz/i9r9/6vk - /f/I7v7/7vr///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////j9//+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP740LD+xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//+76f7/i9r9/2PO - /P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Xyvv/ftb8/6nk/f/Y8/7//f7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Ti/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/utQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/vOr+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////r9///K7v7/kdz9/1zL/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/991vz/tuj9/+35//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////vOr+/0bE - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+61Cw/sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t7QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/0vH+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////6/f//xOz+/4LX/P9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/a9D8/6zl - /f/s+f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///S8f7/T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ewAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////9nz/v+Q3P3/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7/3PT/P+86v7/+f3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+D1/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sgQsP77ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/5Pf+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////7/v//uOj9/2fP/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+/+W3v3/5/f+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5Pf+/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP77ULD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7zULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//+j4v3/U8j7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/991vz/1fL+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////q+P//Xcv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////8/v//6Dh/f9Nx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/900/z/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+/6//9jzfz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///4/f//qOP9/03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/920/z/2/P+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////7/r//13L/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HELD++5Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ay/z/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+/6/7/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+G2fz/6/n///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////q+P//Wsv8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++5Cw/scAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+H1 - /v9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG+/+n4/3/+/7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+T3 - /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3dCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Px/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////+/7//6Hh - /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/U8f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////4PX+/0/H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t3AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zBCw/v6QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/0vH+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////3fT+/2XO - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5be/f/5/f////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////S8f7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+kLD - +zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/vNQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/vOr+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////+////qeT9/0bE - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/X8z8/9vz - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7zq/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t0QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/pOL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////w+v//d9T8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9GxPv/q+T9//7///////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////pOL9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sjQsP79kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////Y8/7/V8r7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+A1/z/9vz///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v2QsP7IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zs/8//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+66f7/R8X7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2LN/P/k9/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//2bP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7YELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+b3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7/8ru/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/T8f7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7DkLD - ++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8vv/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////z+//+I2fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/tuj9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////8vv - /v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++lCw/sOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Lh/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//961fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/9ay/z/btH8/4DX - /P+L2v3/mN79/6Dh/f+g4f3/qOP9/6Dh/f+g4f3/nN/9/4/b/f+C1/z/dNP8/1/M/P9Jxfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4f3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////ouH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yRCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P/9/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////T7//9u0fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/4LX/P+o4/3/ye7+/+f3/v/9/v////////// - /////////////////////////////////////////////////////////////////////////////+/6 - ///R8P7/s+f9/47b/f9pz/z/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Hc - /f/+//////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////3+//9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/skAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/uyQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//o+P////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////T7//9q0Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Vsn7/47b/f/A6/7/7fn///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////j9///Q8P7/n+H9/2nP/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/j9v9//7///////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6Pj//03H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7sgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//9y0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/1rL/P+a3/3/2fP+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////7vr//7Ln/f9z0/z/Q8P7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+P2/3//v////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sBQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+F2Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////v+//900/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Hxfv/iNn8/9Hw/v/+//////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+v5 - //+l4/3/W8v8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4XY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7z0LD+wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7U0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9SyPv/8fv///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+E2Pz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH - +/+k4v3/7/r///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7////G7f7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/n+D9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////x+///Usj7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AkLD+9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+Z3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7/6bj - /f/2/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////Q8P7/cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+1hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+56f7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Ixfv/oOH9//b8 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Q8P7/bND8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/8nu/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////e9X8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/vcQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+r4//////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////Y8/7/R8X7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz/5/f+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////7///+56f7/Usj7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+r4 - //9Mxvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ELD+wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6vk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////y+///V8r7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ+//J7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////X8 - //+U3f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1/M - /P/1/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////q+T9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sBQsP71ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M/P/7/v////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////f9b8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////8/w/v9Yyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP71ELD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7SkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//I7v7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////uen+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/7zq/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////9fz//4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////yO7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tKAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////8fv//07H - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////s+f9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Tsf7//H7//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zFCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/4fX+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////57g - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//T7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////X8v7/Vsn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+e4P3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4fX+/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/sxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/ulQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////7/ - //9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//v+//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9kzvz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//7///////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+I2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///h9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//7///////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////9Pv//3LS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//i9v7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7ekLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////xe3+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///7/v//e9X8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+O2/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +//p+P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/md/9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7jo/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////6fj//0fF - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+91Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+R3P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////H7f7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/i9r9//7///////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//3LS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//K7v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/5Pf+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5Pb+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ddP8//3+//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////1/P//Zs/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4/b+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5Pf+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sUQsP7+ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/f9b8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7///9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcv8//P7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+v5//9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//7/ - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9/1vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7FAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/9Tx/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////mN79/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/970/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////1fL+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+8NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/23R/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+z5//9Kxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+p5P3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0vG - +//s+f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/v+QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+86v7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////s+f9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT/P/+//////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////v///3TT - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+y5/3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////vOr+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/kLD - +xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/twQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+W3v3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2PN/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///y+///Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+W3v3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////r9//9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7yELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/ld39//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////6rk - /f9GxPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3rV/P/y+/////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//971fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +/+q5P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ld39/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7HkLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////4fX+/4HX/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Zc78/8Dr/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////8Dr/v9mzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7/4HX - /P/h9f7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////8vv//8Dr/v+i4f3/lN39/5/g/f+56f7/4fX+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+H2/v+36P3/oOH9/5Td/f+h4f3/wOv+//L7 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/u0QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+y5/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////7Ln - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sIQsP79kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9ExPv/7/r///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///v+v//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v2QsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/d9T8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3fU/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+5BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7bo/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uQAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+//y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////8vv//0XE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP72QAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sbAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7V0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qeT9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7VwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+5JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/971/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////971/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vNAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sMQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/ELD+wwAAAAAAAAAAAAAAAAAAAAAQsP7Q0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+/6/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tDAAAAAAAAAAAAAAAAAAAAAELD+3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7////+//////////////////////////////////////////// - //////////////////////////////////////////////z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////v+//////////////////////////////////////////////// - ////////////////////////////////////////+/7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////6/n//0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAAAABCw/upQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK - +/////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/2rQ/P9ExPv/RMT7/2nP/P+/6/7///////////////////////// - ///////////////////////////////////k9/7/hNj8/0zG+/9Cw/v/V8r7/5nf/f/1/P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////R8P7/dNP8/0bE+/9Cw/v/YM38/63l/f/9/v////////////////////////// - /////////////////////////////+/6//+R3P3/Ucj7/0LD+/9Px/v/i9r9/+z5//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6kAAAAAAAAAAAAAAAAAAAAAQsP71kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+F2Pz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////neD9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5je/f////////////// - ///////////////////////////////////W8v7/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YM38//L7 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+26P3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ftb8//3+//////////////// - /////////////////////////////+j4//9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9TyPv/4vb+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////hdj8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vWAAAAAAAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////ze/+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/yu7+//// - ///////////////////////////////////7/v//Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+F2Pz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////l9/7/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+t5f3///////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2nP - /P/+//////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAELD+zFCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/9rz/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV - /P//////////////////////////////////////xOz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7//H7//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////nN/9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8//// - ///////////////////////////////////i9v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/2PP+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////a8/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/sxAAAAAAAAAABCw/tgQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0TE+//6/f////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9ezPz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9cy/z//////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//U8f7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3rV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//7/v//////////////////////////////////v+v+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/7bo/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+v3//0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7YAAAAAAAAAAAQsP7jULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9hzfz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD - +65Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////g9j8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uuAAAAAAAA - AABCw/vPQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7zwAA - AAAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////Wcr7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////////+g4f3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////G7f7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/AAAAAAQsP7EELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////1nK+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+///////////////////////////////////////oOH9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////+46P3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////4PX+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7EELD+zBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//j9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////j9//9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+zBCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////3+///k9v7/U8j7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/6Dh - /f9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8/6Dh/f+g4f3/oOH9/6Dh - /f+m4/3/y+/+//z+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+v5//+15/3/oeH9/6Dh/f+g4f3/oOH9/6Dh/f9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/mt/9/6Dh/f+g4f3/oOH9/6Dh/f+g4f3/oOH9/33W - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+W3v3/8/v///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////U8j7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tSQsP7akLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Y8/7/neD9/27R/P9Hxfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9dy/z/0vH+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//5be/f9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Xyvv/hdj8/7fo - /f/y+/////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////2vQ - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7akLD+31Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/g9j8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////9Pv//6nk/f9cy/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//Q8P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////v///33W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RcT7/33W/P/R8P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+D2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+31Cw/uSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//quT9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7//n9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/a8/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uSQsP7pULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+l4/3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////d9P7/ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/5zf/f/7/v////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////6Xj/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7pULD+7hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/s+f9//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////A6/7/ScX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////6/f//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cNL8//H7//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+7hCw/vLQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+z5/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP73kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//Q8P7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////B6/7/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO - /P/3/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73kLD++BCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/2/T+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////f9f7/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/g9j8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////b9P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++BCw/vvQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/+f3/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////9/v//ac/8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP78ELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//n9/7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////seb9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Usj7//b8//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP78ELD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/7fn///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+P3//1TJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+m4/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////s+f//QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Vcn7//z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////8/v//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9t0fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P+Z3/3/x+3+/+j4 - ///3/P////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////3+///v+v//3vX+/7Ln/f9+1vz/RsT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//H7f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////P7//9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////u+v//Q8P7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/7bo/f/+//////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+n4//+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/itr9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////z+///QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////uen+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/XMv8/+f3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6rk/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ+/////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////8/v//0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//t+f////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////5Hc/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/TMb7/+X3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////lt79/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/6fj///// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+35 - //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/5/f+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9t0fz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/63l/f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////n9 - //9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/BCw/vvQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+f3/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////Vcn7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+//4/f////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+t5f3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vvQsP74ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//b9P7///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////v///0PD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+C1/z///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/md/9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////9v0/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP74ELD+95Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////P7 - //9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/qOP9//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5Dc/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////Q8P7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+95Cw/vLQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Hr - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///v+v//QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7np - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////2DN/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////wev+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vLQsP7uELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+z5/3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////8/v//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//A6/7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9oz/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7Pn/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7uELD+6VCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/peP9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5nf/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+l4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+6VCw/uTQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5fe/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////UMf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/5nf/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+f3//0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+o4/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////l979/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/uTQsP7fULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+D2Pz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3DS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9mz/z///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////8zv/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/x+3+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4PY/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7fULD - +2pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/a9D8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9jz/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+r4//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9r0Pz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +2pCw/tSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+/////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////wuz+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9v0fz//f7///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////T8f7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13L/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////U8j7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tSQsP7MELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/+P3///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////b8//9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5fe/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//Vcn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+X3v3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7MELD+xBCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+D1/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////gtf8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//X8//////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////Q8P7/Vcn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2vP+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+D1/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+xAAAAAAQsP78ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//G7f7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9jz/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Uyfv/p+P9/+f3 - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////+f3//83v/v9+1vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/cdL8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////G7f7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/AAAAAAAAAAAELD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////dtP8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/V8r7/3fU/P+F2Pz/k939/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td - /f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/1bJ+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/etX8/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td - /f+U3f3/lN39/5Td/f+U3f3/lN39/43b/f+A1/z/bND8/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/87v/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////peL9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vPAAAAAAAAAABCw/uuQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4PY/P////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+T3 - /v9Hxfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4TY/P////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////4PY - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7rgAAAAAAAAAAQsP7jULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9hzfz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////qOP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1PI+//v+v////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9hzfz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+40AAAAAAAAAAELD+2BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7//r9 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7///+C1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF+//T8f7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///6/f//RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/tgAAAAAAAAAABCw/syQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//a8/7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////+/7//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+//F7f7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////2vP+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAAAAAAAAAAQsP7CELD+/xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/seb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//i9r9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+//Q8P7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+wgAAAAAAAAAAAAAAABCw/vWQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4XY/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+46P3/Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3PT/P/q+P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+9YAAAAAAAAAAAAAAAAAAAAAQsP7qULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9ay/z///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////2/T+/1vL/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+U3f3/+/7///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAELD - +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+v5//////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////xe3+/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS - /P/0+/////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////6/n//0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7egAAAAAAAAAAAAAAAAAA - AABCw/tDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+/6/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////x+3+/0bE+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/atD8//f8//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+0MAAAAAAAAAAAAA - AAAAAAAAQsP7DELD+/xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/jtv9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////3PT+/0nF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+A1/z//v////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+O2/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/sMAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1fK+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//13M/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/67l/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7kkLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3vX+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////5zg/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ScX7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////3vX+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7kgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1dCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6nk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+z5//9Ixfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/etX8/7Pn - /f/b9P7/9/z///////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - ///////////////////+////7vr//8nu/v+c4P3/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/47b/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////6nk/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9y0vz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+a3/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9x0vz/4vb+//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////z+//+z5/3/S8b7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9GxPv/7fn///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9y0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+9lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RcT7//L7 - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////+////Usj7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/xOz+//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////930/v9RyPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6rk/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////y+///RcT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/uQQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+26P3///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////0vH+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz//P7///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////zu/+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9r0Pz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////tuj9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7R0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/d9T8//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////57g - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1/L+//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+A1/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//X8 - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3fU/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/v2QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0XE+//v+v////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //951Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Y878//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//R8P7///////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9FxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/ZCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7tELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/suf9//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5Td - /f////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////j9//9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/sOb9//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/u0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +25Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/27R/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+o4/3///////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////Usj7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6Ti/f////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7bgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/seQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/4PX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/tuj9//////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////1zL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+X3v3///////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////4PX+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+8hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/5be/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6jj/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/lt79//////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////5be - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/twQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/+v3///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+U3f3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ - /P////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////4/f//Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD+/5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9Xyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Y878//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+I2fz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+f3/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////yu7+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+v5v3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //+86v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/vDQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////btH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Y8/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/iNn8//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////n9/7/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4HX/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xe3+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7bULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Tx - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////47b/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/bND8//z+//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////5/f+/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//E7P7///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////9Dw/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/+b3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////1PH+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+20AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xRCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9/1vz///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+26P3/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+M2/3//f7///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////3HS/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+f3 - /v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/xOz+//// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////970/v9RyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1DH+/////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////3/W/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/sUAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7qULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Q8P7/+T3/v////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////6vj//0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3HS/P/j9v7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8Ts - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////P7//7Pn/f9Lxvv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+E2Pz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+T3/v9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/upAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+0NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/+R3P3///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9pz/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/3vV - /P+z5/3/3fT+//j9//////////////////////////////////////////////////////////////// - ////////////////////////////////////////cdL8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////////////////////////////////// - /////////////////////////v///+76///K7v7/nOD9/1rL/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+R3P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7QwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP73ULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/R8X7/+n4//////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////sOb9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0TE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/ScX7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/03H - +/9Nx/v/Tcf7/03H+/9Nx/v/Tcf7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/UMf7//r9//////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////p+P//R8X7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +3pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+O2/3///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////b8 - //9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Dh/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////jtv9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+3oAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sYQsP7+0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/+f3/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////qeT9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//z+/////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/sYAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+6VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////v+//9jzvz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+46P3///////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////4jZ/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/ulAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sxQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/RMT7/+H1/v////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////3PT+/0jF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/iNn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////n9/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9+1vz//v////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+H1/v9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7MQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7xCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+96v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4jZ/P////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/9fz///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tKQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/8ju - /v////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7Hm/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////+n4//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/7Pn///// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////I7v7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AULD+9RCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9ezPz/+/7///////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ver+/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/lN39//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////5/f//QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9s0Pz/7/r///// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9RCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tfQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6zl/f////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////c9P7/YM38/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/7zq - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////2TO/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD+/+Z3/3/+/7///// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////rOX9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/tfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7BELD+9xCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Mxvv/6vj///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////v+ - //+m4/3/TMb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1TJ - +//3/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////+y5/3/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2zQ/P/Y8/7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vcQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/tYQsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3vV/P////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////P7//+i4v3/WMr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0PD - +//I7v7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////f7//3XT - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/edT8/8zv/v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD - +9ZCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/v+v+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////7////Q8P7/l979/2TO/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1XJ - +//J7v7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///4/f//itr9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/3rV/P+x5v3/6/n///////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7/r/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP71kLD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1LI+//y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////9/z//1bJ+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0zG+/+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f+U3f3/a9D8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4DX/P+U3f3/lN39/5Td/f+U3f3/m9/9/7/r - /v/4/f////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////h9v7/qeT9/5Xd/f+U3f3/lN39/5Td/f+U3f3/Vsn7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4/b/f+U3f3/lN39/5Td/f+U3f3/lN39/5Td/f910/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////L7//9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7AULD+89Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/htn8//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9Zyvv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv//////////////////////////////////////6Dh - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////3HS/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+///////////////////////////////////uOj9/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tFQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/++6v7///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////Wcr7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////////////////////// - //+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////9x0vz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v//////////////////////////////////7jo - /f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////++6v7/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+7JCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Tcf7/+j4 - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////1nK - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1nK+/////////////////////////////// - ////////oOH9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Dw/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////cdL8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7//P7//////////////////////////////// - //+46P3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/rOX9//////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/uyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz//f7///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9Zyvv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Zyvv///////////////////////// - /////////////6Dh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//Q8P7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////3HS - /P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+//z+/////////////////////////// - ////////uOj9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6zl/f////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////9/v//btH8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/6Li/f////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////Wcr7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7//////////////////// - //////////////////+g4f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/0PD+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //9x0vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/8/v///////////////////// - /////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+s5f3///////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////ouL9/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP76ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Dw/v/y+/+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////2DM/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P////////////// - ////////////////////////peP9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/9Xy - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7//z+//////////////// - ///////////////////B6/7/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/uOj9//// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////y+/+/0PD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+2BCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H+//n9/7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+F2Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+B1/z///////// - /////////////////////////////8ru/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +//1/P////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////6Lh/f9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO/P////////////// - ////////////////////////5/f+/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/970 - /v////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/0/H+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7vULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Z8/8//n9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////2PP+/0PD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/1PH+//// - ///////////////////////////////////9/v//Y838/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+Q3P3///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////s+f//Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+56f7///////// - //////////////////////////////////991vz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/3TT - /P////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//2fP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +yNCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+u5f3/Q8P7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/q+T9//// - /////////////////////////////////////////////+H2/v9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/+P3///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////8ft/v9Ixfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+R3P3///////// - ////////////////////////////////////////8fv//2PO/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/17M - /P/s+f////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////4jZ/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7dELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/6Xi/f////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////9Tx/v9/1vz/Vsn7/1bJ+/991vz/0vH+//// - ////////////////////////////////////////////////////////8Pr//5nf/f9gzfz/Usj7/2rQ - /P+t5f3/+/7///////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////4fb+/4jZ/P9ay/z/U8j7/3TT/P/B6/7///////// - ///////////////////////////////////////////////////3/P//peL9/2bO/P9SyPv/ZM78/6Dh - /f/1/P////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wRCw/vMQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ver+//// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////73q/v9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vMQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7MELD+/pCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE - +//S8f7///////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9Lx/v9GxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t3QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/T8f7/+H1/v////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v9Px/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7AkLD+79Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Wyfv/5Pf+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+T3/v9Wyfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP77kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/1rL/P/q+P////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9ay/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+1RCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Xcz8/+/6//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9dzPz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7nULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9jzfz/7/r///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//9jzfz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+50AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +whCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/13M/P/q+P////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+r4//9dzPz/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sIAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7IELD++1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wsv8/+T3 - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+T3/v9ay/z/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tGQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Wyfv/4fX+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+H1/v9Wyfv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0/H+//S8f7///////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////9Lx/v9Px/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/t7AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7rULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/RsT7/73q/v////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////73q/v9GxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7AQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/peL9//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////6Xi/f9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7GkLD++NCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/+I2fz/+f3///////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+f3//4jZ/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP78ULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2fP/P/n9/7///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////5/f+/2fP/P9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7LgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +0FCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/T8f7/8vv - /v////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////y+/+/0/H+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7QQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7VULD+/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Dw/v/ouL9//3+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////9/v//ouL9/0PD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7VQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/tlQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9u0fz/6Pj///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////o+P//btH8/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7ZQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3VCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+/++6v7///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////++6v7/Tcf7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7eELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/4bZ/P/y+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////L7//+G2fz/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/t4QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Usj7/7/r/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////7/r/v9SyPv/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3hCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/e9X8/+r4 - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////6vj//3vV/P9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7eAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7dULD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Mxvv/rOX9//v+//////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////7/v//rOX9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7dQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tlQsP7/ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9ezPz/ye7+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////J7v7/Xsz8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v9QsP7ZQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+1VCw/v6QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/931Pz/4fX+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+H1/v931Pz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7VQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7QULD+/FCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/+I2fz/5/f+//////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////5/f+/4jZ/P9ExPv/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vxQsP7QQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/suQsP740LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0bE+/+O2/3/6fj///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////p+P//jtv9/0bE+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vjQsP7LgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xpCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0jF - +/+R3P3/5ff+//////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////+X3/v+R3P3/SMX7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CkLD+61Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0PD+/9/1vz/1PH+//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////1PH+/3/W/P9Dw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/utQsP7CgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7e0LD - +/1Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9t0fz/ver+//r9//////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////r9 - //+96v7/bdH8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/1Cw/t7QsP7AQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tGQsP77ULD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Qx/v/lt79/+D1/v////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////4PX+/5be - /f9Qx/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD++1Cw/tGAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+yBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/btH8/7Ln - /f/v+v////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+/6//+y5/3/btH8/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+81Cw/sgAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7CULD+51Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/RcT7/3fU/P+26P3/8vv///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////y+///tuj9/3fU/P9FxPv/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+51Cw/sJAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7VELD++5Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0XE+/9y0vz/qeT9/971/v////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////3vX+/6nk/f9y0vz/RcT7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP77kLD+1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/scQsP7v0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/V8r7/47b/f+/6/7/7Pn///// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////7Pn//7/r/v+O2/3/V8r7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7v0LD+xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/t4QsP7+kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9ay/z/hdj8/7Hm/f/b8/7/+v3///////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///6/f//2/P+/7Hm/f+F2Pz/Wsv8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v6QsP7eELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +zBCw/vNQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0TE+/9hzfz/g9j8/6Xj/f/G7f7/4PX+//j9//////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////+P3//+D1/v/G7f7/peP9/4PY - /P9hzfz/RMT7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/vNQsP7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7BELD+3RCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/U8j7/2vQ - /P+D2Pz/l979/6Xj/f+z5/3/wev+/9Hw/v/b9P7/5/f+/+f3/v/t+f//8/v///T7///0+///8/v//+35 - ///n9/7/5/f+/9v0/v/R8P7/wev+/7Pn/f+l4/3/l979/4PY/P9r0Pz/U8j7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/ZCw/t0QsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAQsP7I0LD+71Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+71Cw/sjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7YELD++lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP76ULD+2BCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sOQsP7i0LD+/pCw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v6QsP7i0LD+w4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/skQsP7skLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/uyQsP7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/tFQsP7z0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+89Cw/tFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wFCw/tTQsP71kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP71kLD+1NCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wJCw/tYQsP73ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vcQsP7WELD+wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wRCw/tfQsP71ELD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +9RCw/tfQsP7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+wFCw/tKQsP7vELD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7vELD - +0pCw/sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/sxQsP7pULD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/tCw/ulQsP7MQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sYQsP7ekLD+91Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP73ULD+3pCw/sYAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sBQsP7Q0LD+6pCw/v5QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/lCw/uqQsP7Q0LD+wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7FELD+21Cw/vDQsP7/kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v+QsP7w0LD+21Cw/sUAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +xpCw/txQsP7yELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+8hCw/txQsP7GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/seQsP7bkLD+7VCw/v2QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/ZCw/u1QsP7bkLD+x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7CELD+0dCw/uQQsP72ULD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vZQsP7kELD+0dCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sbQsP7V0LD - +5JCw/vNQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/xCw/vNQsP7kkLD - +1dCw/sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+wxCw/tDQsP7ekLD+6lCw/vWQsP7/ELD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/ELD+9ZCw/upQsP7ekLD+0NCw/sMAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whCw/syQsP7YELD+41Cw/uuQsP70ELD - +/BCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/BCw/vQQsP7rkLD+41Cw/tgQsP7MkLD+wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7EELD+zFCw/tSQsP7akLD+31Cw/uTQsP7pkLD+7hCw/vLQsP73kLD++BCw/vwQsP78ELD - +/hCw/v/QsP7/0LD+/9Cw/v/QsP7+ELD+/BCw/vwQsP74ELD+95Cw/vLQsP7uELD+6ZCw/uTQsP7fULD - +2pCw/tSQsP7MULD+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////4AAAf - ////////////////////////////////////8AAAAAAP//////////////////////////////////4A - AAAAAAB/////////////////////////////////wAAAAAAAAAP///////////////////////////// - //wAAAAAAAAAAD//////////////////////////////4AAAAAAAAAAAB/////////////////////// - //////8AAAAAAAAAAAAA////////////////////////////+AAAAAAAAAAAAAAf//////////////// - ///////////AAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAAP////////// - ///////////////4AAAAAAAAAAAAAAAAH////////////////////////+AAAAAAAAAAAAAAAAAH//// - ////////////////////gAAAAAAAAAAAAAAAAAH///////////////////////4AAAAAAAAAAAAAAAAA - AH//////////////////////+AAAAAAAAAAAAAAAAAAAH//////////////////////gAAAAAAAAAAAA - AAAAAAAH/////////////////////4AAAAAAAAAAAAAAAAAAAAH////////////////////+AAAAAAAA - AAAAAAAAAAAAAH////////////////////wAAAAAAAAAAAAAAAAAAAAAP///////////////////8AAA - AAAAAAAAAAAAAAAAAAAP///////////////////gAAAAAAAAAAAAAAAAAAAAAAf///////////////// - /4AAAAAAAAAAAAAAAAAAAAAAAf//////////////////AAAAAAAAAAAAAAAAAAAAAAAA//////////// - //////wAAAAAAAAAAAAAAAAAAAAAAAA/////////////////+AAAAAAAAAAAAAAAAAAAAAAAAB////// - ///////////gAAAAAAAAAAAAAAAAAAAAAAAAB////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAD - ////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH///////////////8AAAAAAAAAAAAAAAAAAAAA - AAAAAP///////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////4AAAAAAAAAAAAAAAA - AAAAAAAAAAAf//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////4AAAAAAAAAAA - AAAAAAAAAAAAAAAAB//////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////4AAAAAA - AAAAAAAAAAAAAAAAAAAAAAH/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////4A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAf////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////// - ///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/// - ////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAP//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////////AAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAD/////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////////gAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAf////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////gAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAB////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////gAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////// - /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/ - //////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAP//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////gAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAB//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAA/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////4AAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - P////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAB////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//4AAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - Af//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAD///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///+AAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////wAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////+ - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAf////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAP/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////+AAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////wAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAD///////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////+AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// - /4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/ - ///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAH////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////4AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAH/////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////AAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAD/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////////8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD//////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////wAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAD///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////////AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////// - ///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/// - /////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAA - Af/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////+AAAAAAAAAAAAAAAAAAAAAA - AAAAAAf/////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////4AAAAAAAAAAAAAAAA - AAAAAAAAAAAf//////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////wAAAAAAAAAA - AAAAAAAAAAAAAAAA////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAH////////////////AAAAA - AAAAAAAAAAAAAAAAAAAAA////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAH//////////////// - +AAAAAAAAAAAAAAAAAAAAAAAAB/////////////////8AAAAAAAAAAAAAAAAAAAAAAAAP/////////// - //////8AAAAAAAAAAAAAAAAAAAAAAAD//////////////////4AAAAAAAAAAAAAAAAAAAAAAAf////// - ////////////4AAAAAAAAAAAAAAAAAAAAAAH///////////////////wAAAAAAAAAAAAAAAAAAAAAA// - //////////////////wAAAAAAAAAAAAAAAAAAAAAP////////////////////gAAAAAAAAAAAAAAAAAA - AAB/////////////////////gAAAAAAAAAAAAAAAAAAAAf/////////////////////gAAAAAAAAAAAA - AAAAAAAH//////////////////////gAAAAAAAAAAAAAAAAAAB///////////////////////gAAAAAA - AAAAAAAAAAAAf///////////////////////gAAAAAAAAAAAAAAAAAH////////////////////////g - AAAAAAAAAAAAAAAAB/////////////////////////gAAAAAAAAAAAAAAAAf//////////////////// - /////wAAAAAAAAAAAAAAAP//////////////////////////wAAAAAAAAAAAAAAD//////////////// - ///////////4AAAAAAAAAAAAAB////////////////////////////8AAAAAAAAAAAAA//////////// - /////////////////+AAAAAAAAAAAAf//////////////////////////////AAAAAAAAAAAP/////// - ////////////////////////wAAAAAAAAAP////////////////////////////////+AAAAAAAAf/// - ///////////////////////////////wAAAAAA/////////////////////////////////////4AAAf - //////////////////8oAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+xNCw/tiQsP7pELD+9JCw/vzQsP7/0LD - +/9Cw/vzQsP70kLD+6RCw/tiQsP7EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytCw/unQ8P7+kLD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v5QsP7p0LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+w1Dw/uWQ8P7/kLD+/9Cw/v/QsP7/0bE - +/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ/P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srR8X74ULD+/9Cw/v/QsP7/3XT - /P/A6/7/+P3///////////////////////////////////j9///A6/7/ddP8/0LD+/9Cw/v/QsP7/0LD - +9tCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7N0bE+/RCw/v/QsP7/2PO - /P/S8f7/////////////////////////////////////////////////////////////////0vH+/2PO - /P9Cw/v/QsP7/0LD++9Cw/s3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytGxPv1QsP7/0LD - +/+O2/3/+v3///////////////////j9///K7v7/peP9/5Td/f+W3v3/p+P9/87v/v/6/f////////// - ////////+v3//47b/f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sNS8b75kLD - +/9Cw/v/n+D9//////////////////P7//+X3v3/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0/H - +/+d4P3/9vz//////////////////5/g/f9Cw/v/QsP7/0LD+9tCw/sNAAAAAAAAAAAAAAAAAAAAAFDH - +6FCw/v/QsP7/47b/f/////////////////V8v7/Vcn7/0LD+/9Cw/v/QsP7/0LD+/9Dw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Yyvv/2vP+/////////////////47b/f9Cw/v/QsP7/0LD+5UAAAAAAAAAAAAA - AABCw/srQ8P7/kLD+/9jzvz/+v3/////////////1PH+/0nF+/9Cw/v/QsP7/2LN/P+05/3/6Pj///7/ - ///8/v//5Pf+/6/m/f9dzPz/QsP7/0LD+/9Kxvv/2PP+////////////+v3//2PO/P9Cw/v/QsP7/ULD - +ysAAAAAAAAAAFXJ+7lCw/v/QsP7/9Lx/v////////////z+//9Xyvv/QsP7/0LD+/+f4P3//P7///// - //////////////////////////////v+//+Z3/3/QsP7/0LD+/9Xyvv//P7/////////////0vH+/0LD - +/9Cw/v/QsP7pwAAAABCw/sTRcT7/ULD+/910/z/////////////////+v3//0/H+/9Cw/v/nuD9//// - //////////////////////////////////////////////////+c4P3/QsP7/0/H+//7/v////////// - ////////ddP8/0LD+/9Cw/v5QsP7E0/H+2lCw/v/QsP7/8Dr/v//////////////////////5ff+/83v - /v/+//////////////////////////////////////////////////////////7////N7/7/5ff+//// - ///////////////////A6/7/QsP7/0LD+/9Cw/tiXMv8vkLD+/9GxPv/+P3///////////////////// - ////////7fn////////v+v/////////////////////////////////////////////v+v///////+76 - ///+//////////////////////////j9//9GxPv/QsP7/0LD+6RUyfvoQsP7/2rQ/P////////////// - /////////////9Xy/v9GxPv/9fz//0PD+//h9v7/////////////////////////////////7Pn//0LD - +//k9/7/Usj7/8ft/v///////////////////////////2rQ/P9Cw/v/QsP70kjF+/tCw/v/h9n8//// - ///////////////////V8v7/fdb8/0LD+/951Pz/QsP7/3HS/P/T8f7//////////////////////9v0 - /v910/z/QsP7/3HS/P9FxPv/d9T8/9Dw/v//////////////////////h9n8/0LD+/9Cw/vzQsP7/0LD - +/+U3f3/////////////////3vX+/0bE+/9Cw/v/Vcn7/1nK+/9TyPv/QsP7/6Dh/f////////////// - ////////rOX9/0LD+/9SyPv/Wcr7/1XJ+/9Cw/v/Q8P7/9Px/v////////////////+U3f3/QsP7/0LD - +/9Cw/v/QsP7/5Td/f////////////////+l4/3/QsP7/7Tn/f///////////9Dw/v9Cw/v/oOH9//// - //////////////////+s5f3/QsP7/8Ts/v///////////8Dr/v9Cw/v/md/9/////////////////5Td - /f9Cw/v/QsP7/0jF+/tCw/v/h9n8/////////////////6fj/f9Cw/v/vOr+////////////0PD+/0LD - +/+g4f3//////////////////////6zl/f9Cw/v/xOz+////////////x+3+/0LD+/+Z3/3///////// - ////////h9n8/0LD+/9Cw/vzVcn76ULD+/9q0Pz/////////////////7Pn//1TJ+/9Dw/v/WMr7/1nK - +/9TyPv/QsP7/6Dh/f//////////////////////rOX9/0LD+/9SyPv/Wcr7/1nK+/9Dw/v/T8f7/+T3 - /v////////////////9q0Pz/QsP7/0LD+9JezPzBQsP7/0bE+//4/f/////////////z+///Wcr7/0TE - +/9s0Pz/cdL8/2XO/P9Cw/v/oOH9//////////////////////+s5f3/QsP7/2LN/P9x0vz/bND8/0fF - +/9SyPv/7Pn/////////////+P3//0bE+/9Cw/v/QsP7pFTJ+2xCw/v/QsP7/8Dr/v///////////73q - /v9Cw/v/reX9////////////0PD+/0LD+/+g4f3//////////////////////6zl/f9Cw/v/xOz+//// - ////////uun+/0LD+/+v5v3////////////A6/7/QsP7/0LD+/9Cw/tiQsP7E0XE+/1Cw/v/ddP8//// - ////////xOz+/0LD+/+C1/z/4vb+/+f3/v++6v7/QsP7/6Dh/f//////////////////////rOX9/0LD - +/+z5/3/5/f+/+P2/v+M2/3/QsP7/7np/v///////////3XT/P9Cw/v/QsP7+ULD+xMAAAAAWcr7vkLD - +/9Cw/v/0vH+///////4/f//ZM78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/ouL9//////////////////// - //+u5f3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9dy/z/9Pv////////S8f7/QsP7/0LD+/9Cw/unAAAAAAAA - AABCw/srQ8P7/0LD+/9jzvz/+v3////////4/f//peL9/0LD+/+a3/3/QsP7/5Hc/f/o+P////////// - /////////////+76//+X3v3/QsP7/47b/f9Hxfv/m9/9//b8////////+v3//2PO/P9Cw/v/QsP7/ULD - +ysAAAAAAAAAAAAAAABWyfunQsP7/0LD+/+O2/3////////////n9/7/f9b8//r9//961fz/7/r///// - //////////////////////////////b8//961fz/8vv//4fZ/P/e9f7///////////+O2/3/QsP7/0LD - +/9Cw/uVAAAAAAAAAAAAAAAAAAAAAELD+w1Nx/vpQsP7/0LD+/+f4P3///////////////////////// - ////////////////////////////////////////////////////////////////////////n+D9/0LD - +/9Cw/v/QsP720LD+w0AAAAAAAAAAAAAAAAAAAAAAAAAAELD+ytIxfv3QsP7/0LD+/+O2/3/+v3///// - ////////////////////////////////////////////////////////////////////////+v3//47b - /f9Cw/v/QsP7/0LD++9Cw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+zdHxfv2QsP7/0LD - +/9jzvz/0vH+/////////////////////////////////////////////////////////////////9Lx - /v9jzvz/QsP7/0LD+/9Cw/vvQsP7NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD - +ytKxvvlQsP7/0LD+/9Cw/v/dtP8/8Dr/v/4/f//////////////////////////////////+P3//8Dr - /v920/z/QsP7/0LD+/9Cw/v/QsP720LD+ysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+w1IxfuaQ8P7/kLD+/9Cw/v/QsP7/0bE+/9q0Pz/h9n8/5Td/f+U3f3/h9n8/2rQ - /P9GxPv/QsP7/0LD+/9Cw/v/QsP7/ULD+5VCw/sNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/srRcT7qkPD+/tCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ULD+6dCw/srAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7E0LD+2JCw/ukQ8P71EPD - +/VCw/v/QsP7/0LD+/NCw/vSQsP7pELD+2JCw/sTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP/wD///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABgAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gA - AB/8AAA//gAAf/+AAf//8A//KAAAADAAAABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD+/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD - +yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7GELD+3ZCw/vSQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vSQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABCw/sIQsP7gELD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0rG - +/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7+ELD - +4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+y1Cw/vXQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td - /f/E7P7/6vj//////////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD+/hCw/v/QsP7/0LD+/9Cw/v/QsP7/33W - /P/Q8P7//v////////////////////////////////////////////////////////////////////7/ - ///Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// - /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD - +/9Cw/v/R8X7/7Hm/f/+//////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkLD - +/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////7////S8f7/oOH9/3zV - /P9mzvz/Wcr7/1rL/P9pz/z/gNf8/6Xj/f/Z8/7//////////////////////////////////////9vz - /v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABCw/stQ8P7+ULD+/9Cw/v/QsP7/1zL/P/p+P/////////////////////////////4/f//quT9/1jK - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/YMz8/7Ln/f/7/v////////// - ///////////////////p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+whGxPvbQsP7/0LD+/9Cw/v/Vsn7/+n4/////////////////////////////8/w - /v9ay/z/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9izfz/1/L+////////////////////////////6fj//1bJ+/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+4BCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// - ////////p+P9/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/SMX7/0zG+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/v/Q8P7/7Dm/f///////////////////////////9vz/v9Hxfv/QsP7/0LD - +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////// - //////////////////+c3/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9cy/z/pOL9/9by/v/3/P////////// - ///3/P//0PD+/53g/f9Vyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+/+i4v3///////////////////////// - //+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD+x8AAAAAAAAAAAAAAAAAAAAAR8X7nELD+/9Cw/v/QsP7/27R - /P/+/////////////////////////7jo/f9Cw/v/QsP7/0LD+/9Cw/v/Ucj7/7np/v/+//////////// - ///////////////////////////////////7/v//sOb9/0zG+/9Cw/v/QsP7/0LD+/9Cw/v/uen+//// - ///////////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAAAABCw/sYQ8P7/ELD - +/9Cw/v/QsP7/9rz/v//////////////////////+/7//07H+/9Cw/v/QsP7/0LD+/9lzvz/6vj///// - /////////////////////////////////////////////////////////////+X3/v9gzPz/QsP7/0LD - +/9Cw/v/Tsf7//v+////////////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAA - AABDw/t3QsP7/0LD+/9Cw/v/fdb8////////////////////////////+P3//0bE+/9Cw/v/QsP7/1zL - /P/v+v////////////////////////////////////////////////////////////////////////// - ///v+v//Wsv8/0LD+/9Cw/v/RsT7//j9/////////////////////////////33W/P9Cw/v/QsP7/0LD - +/9Cw/t2AAAAAAAAAABMxvvdQsP7/0LD+/9Cw/v/0PD+/////////////////////////////////63l - /f9Lxvv/Yc38/9/1/v////////////////////////////////////////////////////////////// - ////////////////////////3/X+/2HN/P9Lxvv/reX9/////////////////////////////////9Dw - /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAELD+yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////7///9Zyvv/QsP7/0LD+/9Cw/v/QsP7IELD+2BCw/v/QsP7/0LD+/+U3f3///////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YE/H+6RCw/v/QsP7/0LD - +//E7P7///////////////////////////////////////////+s5f3/md/9///////N7/7/gtf8//X8 - ////////////////////////////////////////////////////////+/7//4ra/f/A6/7//////6jj - /f+c4P3////////////////////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mVLI - +9FCw/v/QsP7/0LD+//q+P////////////////////////////////////////////9Zyvv/QsP7//// - //+J2v3/QsP7/9Dw/v//////////////////////////////////////////////////////3vT+/0LD - +/9z0/z//////0/H+/9Dw/v////////////////////////////////////////////q+P//QsP7/0LD - +/9Cw/v/QsP7wEvG+/FCw/v/QsP7/0rG+///////////////////////////////////////9fz//7np - /v9Nx/v/QsP7/5Td/f9gzfz/QsP7/4DX/P+t5f3//v////////////////////////////////////// - //+36P3/hdj8/0LD+/9Wyfv/lN39/0bE+/9Cw/v/s+f9//H7//////////////////////////////// - ////////Ssb7/0LD+/9Cw/v/QsP75kbE+/pCw/v/QsP7/1vL/P////////////////////////////// - ///Y8/7/VMn7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/3/X+//////////////////// - /////////////+76//9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/03H+//P8P7///////// - ////////////////////////W8v8/0LD+/9Cw/v/QsP79ELD+/9Cw/v/QsP7/2XO/P////////////// - //////////////7///9dy/z/QsP7/0LD+/9Nx/v/ZM78/2XO/P9lzvz/V8r7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/1XJ+/9lzvz/Zc78/2XO/P9Px/v/QsP7/0LD - +/9RyPv/9/z/////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/2XO - /P///////////////////////////9vz/v9Cw/v/QsP7/4DX/P/7/v//////////////////uOj9/0LD - +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl/f////////////// - ///+////kdz9/0LD+/9Cw/v/yO7+////////////////////////////Zc78/0LD+/9Cw/v/QsP7/0bE - +/pCw/v/QsP7/1vL/P///////////////////////////8vv/v9Cw/v/QsP7/8Hr/v////////////// - ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl - /f//////////////////////1fL+/0LD+/9Cw/v/uen+////////////////////////////W8v8/0LD - +/9Cw/v/QsP79EvG+/FCw/v/QsP7/0rG+////////////////////////////+X3/v9Cw/v/QsP7/4va - /f/+////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 - /v9Cw/v/QsP7/6zl/f//////////////////////nOD9/0LD+/9Cw/v/0/H+//////////////////// - ////////Ssb7/0LD+/9Cw/v/QsP75lPI+9NCw/v/QsP7/0LD+//q+P////////////////////////// - //971fz/QsP7/0LD+/9Yyvv/cdL8/3HS/P9x0vz/X8z8/0LD+/9Cw/v/2/T+//////////////////// - /////////////+f3/v9Cw/v/QsP7/1zL/P9x0vz/cdL8/3HS/P9dy/z/QsP7/0LD+/9pz/z//v////// - ///////////////////q+P//QsP7/0LD+/9Cw/v/QsP7wFPI+6hCw/v/QsP7/0LD+//E7P7///////// - ///////////////////w+v//T8f7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0fF - +//m9/7////////////////////////////E7P7/QsP7/0LD+/9Cw/v/QsP7mUTE+2FCw/v/QsP7/0LD - +/+U3f3///////////////////////////+R3P3/QsP7/0LD+/9mzvz/htn8/4jZ/P+I2fz/btH8/0LD - +/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/2nP/P+I2fz/iNn8/4jZ - /P9s0Pz/QsP7/0LD+/991vz///////////////////////////+U3f3/QsP7/0LD+/9Cw/v/QsP7YELD - +yBCw/v/QsP7/0LD+/9Zyvv//v////////////////////z+//9Hxfv/QsP7/3zV/P////////////// - ////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3/v9Cw/v/QsP7/6zl - /f//////////////////////j9v9/0LD+/9Cw/v/7/r///////////////////7///9Zyvv/QsP7/0LD - +/9Cw/v/QsP7IAAAAABOx/vgQsP7/0LD+/9Cw/v/0PD+//////////////////P7//9Cw/v/QsP7/5je - /f//////////////////////uOj9/0LD+/9Cw/v/2/T+/////////////////////////////////+f3 - /v9Cw/v/QsP7/6zl/f//////////////////////rOX9/0LD+/9Cw/v/3vT+/////////////////9Dw - /v9Cw/v/QsP7/0LD+/9Cw/vSAAAAAAAAAABGxPt5QsP7/0LD+/9Cw/v/fdb8//////////////////7/ - //9SyPv/QsP7/0/H+/+56f7/2fP+/9v0/v/b9P7/ouH9/0LD+/9Cw/v/2/T+//////////////////// - /////////////+f3/v9Cw/v/QsP7/5je/f/b9P7/2/T+/9vz/v+/6/7/V8r7/0LD+/9GxPv/9vz///// - /////////////33W/P9Cw/v/QsP7/0LD+/9Cw/t2AAAAAAAAAABCw/sYRMT7/ULD+/9Cw/v/QsP7/9rz - /v////////////////+n4/3/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/2/T+//// - /////////////////////////////+f3/v9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/+V3f3/////////////////2vP+/0LD+/9Cw/v/QsP7/0LD+/pCw/sYAAAAAAAAAAAAAAAATMb7oELD - +/9Cw/v/QsP7/27R/P/+///////////////+////peP9/07H+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Hxfv/7Pn///////////////////////////////////f8//9Ox/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/Ssb7/5vf/f/9/v/////////////+////btH8/0LD+/9Cw/v/QsP7/0LD+5gAAAAAAAAAAAAA - AAAAAAAAQsP7H0TE+/tCw/v/QsP7/0LD+/+x5v3///////////////////////z+//9Wyfv/QsP7/9v0 - /v971fz/QsP7/7Xn/f/s+f/////////////////////////////////////////////v+v//v+v+/0LD - +/9oz/z/2/T+/0vG+/9Cw/v/+/7///////////////////////+x5v3/QsP7/0LD+/9Cw/v/QsP7+ELD - +x8AAAAAAAAAAAAAAAAAAAAAAAAAAEbE+4NCw/v/QsP7/0LD+/9Hxfv/2/P+//////////////////// - //9u0fz/Vcn7//////+d4P3/Q8P7/+D1/v////////////////////////////////////////////// - ////////7fn//0jF+/+J2v3//////2bO/P9Zyvv//////////////////////9vz/v9Hxfv/QsP7/0LD - +/9Cw/v/QsP7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+whJxfvfQsP7/0LD+/9Cw/v/Vsn7/+n4 - ///////////////////4/f//9fz////////+////8Pr///////////////////////////////////// - //////////////////////////////H7///9/v////////j9///1/P//////////////////6fj//1bJ - +/9Cw/v/QsP7/0LD+/9Cw/vXQsP7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/stRMT7+kLD - +/9Cw/v/QsP7/1zL/P/p+P////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///p+P//XMv8/0LD+/9Cw/v/QsP7/0LD+/dCw/stAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7WkLD+/9Cw/v/QsP7/0LD+/9Wyfv/2/P+//////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////9vz/v9Wyfv/QsP7/0LD+/9Cw/v/QsP7/0LD+1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+3FCw/v/QsP7/0LD+/9Cw/v/R8X7/7Hm/f/+//////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////+////seb9/0fF+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7cQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/txQsP7/0LD+/9Cw/v/QsP7/0LD - +/9u0fz/2vP+//////////////////////////////////////////////////////////////////// - /////////////////////////////9rz/v9u0fz/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/txAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7WkPD - +/lCw/v/QsP7/0LD+/9Cw/v/QsP7/33W/P/Q8P7//v////////////////////////////////////// - //////////////////////////////7////Q8P7/fdb8/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP790LD - +1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAELD+y1Dw/vZQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/Wcr7/5Td/f/E7P7/6vj///// - /////////////////////////////+r4///E7P7/lN39/1nK+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/vXQsP7LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCw/sIQsP7gEPD+/lCw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0rG+/9by/z/Zc78/2XO/P9by/z/Ssb7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7+ELD+4BCw/sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELD+x9Cw/uYQsP7+kLD - +/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/pCw/uYQsP7HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAQsP7GELD+3ZCw/vTQsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD+/9Cw/v/QsP7/0LD - +/9Cw/v/QsP7/0LD+/9Cw/vTQsP7dkLD+xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQsP7IELD+2BCw/uZQsP7wELD++ZCw/v0QsP7/0LD - +/9Cw/v0QsP75kLD+8BCw/uZQsP7YELD+yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//4Af//wAA//8AAP//AAD/+AAAH/8AAP/g - AAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAP - AADgAAAAAAcAAOAAAAAABwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAA - AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAA - AAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/gAAAAB/ - AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/AAD/4AAAB/8AAP/4AAAf/wAA//8AAP//AAD//+AH//8AAA== - \ No newline at end of file From ec07e29e390ea913f845fe1509f4b6a7e1f623f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 5 Oct 2016 21:20:26 +0200 Subject: [PATCH 067/366] ignore CPU sweet spot only if extra launch params used --- NiceHashMiner/Forms/Form_Benchmark.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 36eefe7..1fef85c 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -405,7 +405,7 @@ void NextBenchmark() { var currentConfig = _currentDevice.DeviceBenchmarkConfig; if (_currentDevice.DeviceGroupType == DeviceGroupType.CPU) { _currentMiner = MinersManager.GetCpuMiner(_currentDevice.Group); - if (_currentAlgorithm != null && _currentAlgorithm.LessThreads == 0 && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { + if (_currentAlgorithm != null && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { __CPUBenchmarkStatus = new CPUBenchmarkStatus(); _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; } From 41a3e2c1c5ce3d2b3ddd597e89fc1c4b8a420a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 17 Oct 2016 22:07:48 +0200 Subject: [PATCH 068/366] remove Blake256r14 for AMD --- NiceHashMiner/Devices/GroupAlgorithms.cs | 6 +++--- NiceHashMiner/Miners/Miner.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 931e8f2..52af17b 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -19,7 +19,7 @@ public static Dictionary CreateDefaultsForGroup(Device }; } if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { - // DisableAMDTempControl = false; so temperature params are enabled by default, not sure if TemperatureParam should be lastly appended + // DisableAMDTempControl = false; TemperatureParam must be appended lastly string DefaultParam = AmdGpuDevice.DefaultParam; return new Dictionary() { { AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") @@ -42,8 +42,8 @@ public static Dictionary CreateDefaultsForGroup(Device { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.Blake256r14 , new Algorithm(AlgorithmType.Blake256r14, "blake") - { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.Blake256r14 , new Algorithm(AlgorithmType.Blake256r14, "blake") + // { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 76d9e67..6e153ae 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -575,7 +575,7 @@ protected void StartCoolDownTimerChecker() { _currentCooldownTimeInSeconds = _MIN_CooldownTimeInMilliseconds; _currentCooldownTimeInSecondsLeft = _currentCooldownTimeInSeconds; _currentMinerReadStatus = MinerAPIReadStatus.NONE; - } + } virtual protected void Miner_Exited() { From 93d715a7836379bae177b125d84c384c3836db31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 18 Oct 2016 14:37:58 +0200 Subject: [PATCH 069/366] AMDDeviceDetection refactor --- .../AMDOpenCLDeviceDetection.cpp | 112 +++++++++--------- .../AMDOpenCLDeviceDetection.h | 10 +- 2 files changed, 62 insertions(+), 60 deletions(-) diff --git a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.cpp b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.cpp index 72735ec..dc8b1a0 100644 --- a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.cpp +++ b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.cpp @@ -57,46 +57,52 @@ bool AMDOpenCLDeviceDetection::QueryDevices() { else { for (auto i_pId = 0u; i_pId < platforms.size(); ++i_pId) { string platformName = StringnNullTerminatorFix(platforms[i_pId].getInfo()); - _platformNumbers.emplace(make_pair(platformName, i_pId)); - // not the best way but it should work - bool isAMD = platformName.find("AMD", 0) != string::npos; - vector platformDevs; - auto clDevs = getDevices(platforms, i_pId); - for (auto i_devId = 0u; i_devId < clDevs.size(); ++i_devId) { - OpenCLDevice curDevice; - curDevice.DeviceID = i_devId; - curDevice._CL_DEVICE_NAME = StringnNullTerminatorFix(clDevs[i_devId].getInfo()); - switch (clDevs[i_devId].getInfo()) { - case CL_DEVICE_TYPE_CPU: - curDevice._CL_DEVICE_TYPE = "CPU"; - break; - case CL_DEVICE_TYPE_GPU: - curDevice._CL_DEVICE_TYPE = "GPU"; - break; - case CL_DEVICE_TYPE_ACCELERATOR: - curDevice._CL_DEVICE_TYPE = "ACCELERATOR"; - break; - default: - curDevice._CL_DEVICE_TYPE = "DEFAULT"; - break; - } - - curDevice._CL_DEVICE_GLOBAL_MEM_SIZE = clDevs[i_devId].getInfo(); - curDevice._CL_DEVICE_VENDOR = StringnNullTerminatorFix(clDevs[i_devId].getInfo()); - curDevice._CL_DEVICE_VERSION = StringnNullTerminatorFix(clDevs[i_devId].getInfo()); - curDevice._CL_DRIVER_VERSION = StringnNullTerminatorFix(clDevs[i_devId].getInfo()); + if (std::find(_platformNames.begin(), _platformNames.end(), platformName) == _platformNames.end()) { + JsonLog current; + _platformNames.push_back(platformName); + // new + current.PlatformName = platformName; + current.PlatformNum = i_pId; + + // not the best way but it should work + bool isAMD = platformName.find("AMD", 0) != string::npos; + auto clDevs = getDevices(platforms, i_pId); + for (auto i_devId = 0u; i_devId < clDevs.size(); ++i_devId) { + OpenCLDevice curDevice; + curDevice.DeviceID = i_devId; + curDevice._CL_DEVICE_NAME = StringnNullTerminatorFix(clDevs[i_devId].getInfo()); + switch (clDevs[i_devId].getInfo()) { + case CL_DEVICE_TYPE_CPU: + curDevice._CL_DEVICE_TYPE = "CPU"; + break; + case CL_DEVICE_TYPE_GPU: + curDevice._CL_DEVICE_TYPE = "GPU"; + break; + case CL_DEVICE_TYPE_ACCELERATOR: + curDevice._CL_DEVICE_TYPE = "ACCELERATOR"; + break; + default: + curDevice._CL_DEVICE_TYPE = "DEFAULT"; + break; + } - // AMD topology get Bus No - if (isAMD) { - cl_device_topology_amd topology = clDevs[i_devId].getInfo(); - if (topology.raw.type == CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD) { - curDevice.AMD_BUS_ID = (int)topology.pcie.bus; + curDevice._CL_DEVICE_GLOBAL_MEM_SIZE = clDevs[i_devId].getInfo(); + curDevice._CL_DEVICE_VENDOR = StringnNullTerminatorFix(clDevs[i_devId].getInfo()); + curDevice._CL_DEVICE_VERSION = StringnNullTerminatorFix(clDevs[i_devId].getInfo()); + curDevice._CL_DRIVER_VERSION = StringnNullTerminatorFix(clDevs[i_devId].getInfo()); + + // AMD topology get Bus No + if (isAMD) { + cl_device_topology_amd topology = clDevs[i_devId].getInfo(); + if (topology.raw.type == CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD) { + curDevice.AMD_BUS_ID = (int)topology.pcie.bus; + } } - } - platformDevs.push_back(curDevice); + current.Devices.push_back(curDevice); + } + _devicesPlatformsDevices.push_back(current); } - _devicesPerPlatform.emplace(make_pair(platformName, platformDevs)); } } } @@ -113,28 +119,18 @@ bool AMDOpenCLDeviceDetection::QueryDevices() { // this function is hardcoded and horrable void AMDOpenCLDeviceDetection::PrintDevicesJson() { - cout << "{" << endl; + cout << "[" << endl; - // platforms array scope - { - cout << "\t\"OCLPlatforms\" : {" << endl; - int platformsComma = _platformNumbers.size(); - for (const auto &plat_name_num : _platformNumbers) { - cout << "\t\t\"" + plat_name_num.first + "\" : " - << plat_name_num.second << COMMA(platformsComma) - << endl; - } - cout << "\t}," << endl; - } - // device per platform array scope { - int devPlatformsComma = _devicesPerPlatform.size(); - cout << "\t\"OCLPlatformDevices\" : {" << endl; - for (const auto &plat_name_devs : _devicesPerPlatform) { - cout << "\t\t\"" + plat_name_devs.first + "\" : [" << endl; + int devPlatformsComma = _devicesPlatformsDevices.size(); + for (const auto &jsonLog : _devicesPlatformsDevices) { + cout << "\t{" << endl; + cout << "\t\t\"PlatformName\": \"" << jsonLog.PlatformName << "\"" << "," << endl; + cout << "\t\t\"PlatformNum\": " << jsonLog.PlatformNum << "," << endl; + cout << "\t\t\"Devices\" : [" << endl; // device print - int devComma = plat_name_devs.second.size(); - for (const auto &dev : plat_name_devs.second) { + int devComma = jsonLog.Devices.size(); + for (const auto &dev : jsonLog.Devices) { cout << "\t\t\t{" << endl; cout << "\t\t\t\t\"" << "DeviceID" << "\" : " << dev.DeviceID << "," << endl; // num cout << "\t\t\t\t\"" << "AMD_BUS_ID" << "\" : " << dev.AMD_BUS_ID << "," << endl; // num @@ -146,10 +142,10 @@ void AMDOpenCLDeviceDetection::PrintDevicesJson() { cout << "\t\t\t\t\"" << "_CL_DRIVER_VERSION" << "\" : \"" << dev._CL_DRIVER_VERSION << "\"" << endl; cout << "\t\t\t}" << COMMA(devComma) << endl; } - cout << "\t\t]" << COMMA(devPlatformsComma) << endl; + cout << "\t\t]" << endl; + cout << "\t}" << COMMA(devPlatformsComma) << endl; } - cout << "\t}" << endl; } - cout << "}" << endl; + cout << "]"; // << endl; } \ No newline at end of file diff --git a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h index 961479b..2e273a6 100644 --- a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h +++ b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h @@ -12,6 +12,12 @@ #include "OpenCLDevice.h" +struct JsonLog { + std::string PlatformName; + int PlatformNum; + std::vector Devices; +}; + class AMDOpenCLDeviceDetection { public: AMDOpenCLDeviceDetection(); @@ -25,8 +31,8 @@ class AMDOpenCLDeviceDetection { static std::vector getDevices(std::vector const& _platforms, unsigned _platformId); static std::vector getPlatforms(); - std::map> _devicesPerPlatform; - std::map _platformNumbers; + std::vector _platformNames; + std::vector _devicesPlatformsDevices; static std::string StringnNullTerminatorFix(const std::string& str); }; From a4b7142beb0d22e5effdbe3572f9b296f75fa588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 22 Oct 2016 19:56:00 +0200 Subject: [PATCH 070/366] NHM update to work with refactored AMDDevDetection --- .../Devices/ComputeDeviceQueryManager.cs | 87 +++++-------------- 1 file changed, 22 insertions(+), 65 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index 828a843..dccc986 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -50,7 +50,6 @@ protected ComputeDeviceQueryManager() { public int CPUs { get; private set; } public int AMDOpenCLPlatformNum { get; private set; } - public string AMDOpenCLPlatformStringKey { get; private set; } public IMessageNotifier MessageNotifier { get; private set; } @@ -120,53 +119,6 @@ public void QueryDevices(IMessageNotifier messageNotifier) Helpers.ConsolePrint(TAG, "AMD GPU device count BAD!!!"); } } - // #7 init ethminer ID mappings offset - if (OpenCLJSONData != null) { - // helper vars - Dictionary openCLGpuCount = new Dictionary(); - Dictionary openCLPlatformIds = new Dictionary(); - foreach (var oclPlatform in OpenCLJSONData.OCLPlatforms) { - ComputePlatformType current = GetPlatformType(oclPlatform.Key); - if(current != ComputePlatformType.NONE) { - openCLPlatformIds[current] = oclPlatform.Value; - } else { - Helpers.ConsolePrint(TAG, "ethminer platforms mapping NONE"); - } - } - foreach (var oclDevs in OpenCLJSONData.OCLPlatformDevices) { - ComputePlatformType current = GetPlatformType(oclDevs.Key); - if (current != ComputePlatformType.NONE) { - foreach (var oclDev in oclDevs.Value) { - if (oclDev._CL_DEVICE_TYPE.Contains("GPU")) { - if (openCLGpuCount.ContainsKey(current)) { - openCLGpuCount[current]++; - } else { - openCLGpuCount[current] = 1; - } - } - } - } else { - Helpers.ConsolePrint(TAG, "ethminer platforms mapping NONE"); - } - } - // sort platforms by platform values - Dictionary openCLPlatformIdsRev = new Dictionary(); - List platformIds = new List(); - foreach (var platId in openCLPlatformIds) { - openCLPlatformIdsRev[platId.Value] = platId.Key; - platformIds.Add(platId.Value); - } - platformIds.Sort(); - // set mappings - int cumulativeCount = 0; - foreach (var curId in platformIds) { - var key = openCLPlatformIdsRev[curId]; - if (openCLGpuCount.ContainsKey(key)) { - _ethminerIdsOffet[key] = cumulativeCount; - cumulativeCount += openCLGpuCount[key]; - } - } - } // allerts _currentNvidiaOpenCLDriver = GetNvidiaOpenCLDriver(); // if we have nvidia cards but no CUDA devices tell the user to upgrade driver @@ -375,13 +327,16 @@ private void QueryAMD() { // get platform version showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query")); + List amdOCLDevices = new List(); + string AMDOpenCLPlatformStringKey = ""; if (IsOpenCLQuerrySuccess) { bool amdPlatformNumFound = false; - foreach (var kvp in OpenCLJSONData.OCLPlatforms) { - if (kvp.Key.Contains("AMD") || kvp.Key.Contains("amd")) { + foreach (var oclEl in OpenCLJSONData) { + if (oclEl.PlatformName.Contains("AMD") || oclEl.PlatformName.Contains("amd")) { amdPlatformNumFound = true; - AMDOpenCLPlatformStringKey = kvp.Key; - AMDOpenCLPlatformNum = kvp.Value; + AMDOpenCLPlatformStringKey = oclEl.PlatformName; + AMDOpenCLPlatformNum = oclEl.PlatformNum; + amdOCLDevices = oclEl.Devices; Helpers.ConsolePrint(TAG, String.Format("AMD platform found: Key: {0}, Num: {1}", AMDOpenCLPlatformStringKey, AMDOpenCLPlatformNum.ToString())); @@ -391,7 +346,6 @@ private void QueryAMD() { if (amdPlatformNumFound) { // get only AMD gpus { - var amdOCLDevices = OpenCLJSONData.OCLPlatformDevices[AMDOpenCLPlatformStringKey]; foreach (var oclDev in amdOCLDevices) { if (oclDev._CL_DEVICE_TYPE.Contains("GPU")) { amdGpus.Add(oclDev); @@ -682,9 +636,9 @@ private void QueryCudaDevices() { private double GetNvidiaOpenCLDriver() { if (OpenCLJSONData != null) { List nvidiaOCLs = null; - foreach (var oclPlatDevs in OpenCLJSONData.OCLPlatformDevices) { - if (oclPlatDevs.Key.ToLower().Contains("nvidia")) { - nvidiaOCLs = oclPlatDevs.Value; + foreach (var oclPlatDevs in OpenCLJSONData) { + if (oclPlatDevs.PlatformName.ToLower().Contains("nvidia")) { + nvidiaOCLs = oclPlatDevs.Devices; } } @@ -701,12 +655,13 @@ private double GetNvidiaOpenCLDriver() { return -1; } - class OpenCLJSON { - public Dictionary OCLPlatforms = new Dictionary(); - public Dictionary> OCLPlatformDevices = new Dictionary>(); + class OpenCLJSONData_t { + public string PlatformName = "NONE"; + public int PlatformNum = 0; + public List Devices = new List(); } string QueryOpenCLDevicesString = ""; - OpenCLJSON OpenCLJSONData = new OpenCLJSON(); + List OpenCLJSONData = new List(); bool IsOpenCLQuerrySuccess = false; private void QueryOpenCLDevicesOutputErrorDataReceived(object sender, DataReceivedEventArgs e) { if (e.Data != null) { @@ -742,8 +697,10 @@ private void QueryOpenCLDevices() { } finally { if (QueryOpenCLDevicesString != "") { try { - OpenCLJSONData = JsonConvert.DeserializeObject(QueryOpenCLDevicesString, Globals.JsonSettings); - } catch { } + OpenCLJSONData = JsonConvert.DeserializeObject>(QueryOpenCLDevicesString, Globals.JsonSettings); + } catch { + OpenCLJSONData = null; + } } } @@ -754,9 +711,9 @@ private void QueryOpenCLDevices() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(""); stringBuilder.AppendLine("AMDOpenCLDeviceDetection found devices success:"); - foreach (var kvp in OpenCLJSONData.OCLPlatformDevices) { - stringBuilder.AppendLine(String.Format("\tFound devices for platform: {0}", kvp.Key)); - foreach (var oclDev in kvp.Value) { + foreach (var oclElem in OpenCLJSONData) { + stringBuilder.AppendLine(String.Format("\tFound devices for platform: {0}", oclElem.PlatformName)); + foreach (var oclDev in oclElem.Devices) { stringBuilder.AppendLine("\t\tDevice:"); stringBuilder.AppendLine(String.Format("\t\t\tDevice ID {0}", oclDev.DeviceID)); stringBuilder.AppendLine(String.Format("\t\t\tDevice NAME {0}", oclDev._CL_DEVICE_NAME)); From f360547e57435493d3b00932720a0dd042dc18db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 22 Oct 2016 21:32:38 +0200 Subject: [PATCH 071/366] increase detection processes wait time --- NiceHashMiner/Devices/ComputeDeviceQueryManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index dccc986..6ccff1e 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -550,7 +550,7 @@ private void QueryCudaDevices() { CudaDevicesDetection.OutputDataReceived += QueryCudaDevicesOutputErrorDataReceived; CudaDevicesDetection.ErrorDataReceived += QueryCudaDevicesOutputErrorDataReceived; - const int waitTime = 5 * 1000; // 5seconds + const int waitTime = 30 * 1000; // 30seconds try { if (!CudaDevicesDetection.Start()) { Helpers.ConsolePrint(TAG, "CudaDevicesDetection process could not start"); @@ -680,7 +680,7 @@ private void QueryOpenCLDevices() { OpenCLDevicesDetection.OutputDataReceived += QueryOpenCLDevicesOutputErrorDataReceived; OpenCLDevicesDetection.ErrorDataReceived += QueryOpenCLDevicesOutputErrorDataReceived; - const int waitTime = 5 * 1000; // 5seconds + const int waitTime = 30 * 1000; // 30seconds try { if (!OpenCLDevicesDetection.Start()) { Helpers.ConsolePrint(TAG, "AMDOpenCLDeviceDetection process could not start"); From 9c54604863c7c02f40047809d6fb0561862484a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 28 Oct 2016 21:11:16 +0200 Subject: [PATCH 072/366] Equihash stubs --- NiceHashMiner/AlgorithmNiceHashNames.cs | 1 + NiceHashMiner/Enums/AlgorithmType.cs | 3 +- NiceHashMiner/Enums/DeviceType.cs | 3 +- NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/Miners/MinerPaths.cs | 4 ++ NiceHashMiner/Miners/ccminer.cs | 2 +- NiceHashMiner/Miners/cpuminer.cs | 2 +- NiceHashMiner/Miners/nheqminer.cs | 90 ++++++++++++++++++++++++ NiceHashMiner/Miners/sgminer.cs | 2 +- NiceHashMiner/NiceHashMiner.csproj | 1 + NiceHashMiner/ProfitabilityCalculator.cs | 1 + 11 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 NiceHashMiner/Miners/nheqminer.cs diff --git a/NiceHashMiner/AlgorithmNiceHashNames.cs b/NiceHashMiner/AlgorithmNiceHashNames.cs index b2ffefe..bc91c01 100644 --- a/NiceHashMiner/AlgorithmNiceHashNames.cs +++ b/NiceHashMiner/AlgorithmNiceHashNames.cs @@ -38,6 +38,7 @@ public static class AlgorithmNiceHashNames { AlgorithmType.Decred , "decred" }, { AlgorithmType.CryptoNight , "cryptonight" }, { AlgorithmType.Lbry , "lbry" }, + { AlgorithmType.Equihash , "equihash" }, }; static private List _keys = null; diff --git a/NiceHashMiner/Enums/AlgorithmType.cs b/NiceHashMiner/Enums/AlgorithmType.cs index 62bc455..2b3ec42 100644 --- a/NiceHashMiner/Enums/AlgorithmType.cs +++ b/NiceHashMiner/Enums/AlgorithmType.cs @@ -36,7 +36,8 @@ public enum AlgorithmType : int DaggerHashimoto = 20, Decred = 21, CryptoNight = 22, - Lbry = 23 + Lbry = 23, + Equihash = 24 #endregion // NiceHashAPI } } diff --git a/NiceHashMiner/Enums/DeviceType.cs b/NiceHashMiner/Enums/DeviceType.cs index 9607111..3331a61 100644 --- a/NiceHashMiner/Enums/DeviceType.cs +++ b/NiceHashMiner/Enums/DeviceType.cs @@ -8,6 +8,7 @@ namespace NiceHashMiner.Enums { public enum DeviceType { CPU, NVIDIA, - AMD + AMD, + ALL } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 6e153ae..7100e32 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -270,7 +270,7 @@ protected void ChangeToNextAvaliablePort() { } } - protected void Stop_cpu_ccminer_sgminer(MinerStopType willswitch) { + protected void Stop_cpu_ccminer_sgminer_nheqminer(MinerStopType willswitch) { if (IsRunning) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Shutting down miner"); } diff --git a/NiceHashMiner/Miners/MinerPaths.cs b/NiceHashMiner/Miners/MinerPaths.cs index 0ada488..84057d7 100644 --- a/NiceHashMiner/Miners/MinerPaths.cs +++ b/NiceHashMiner/Miners/MinerPaths.cs @@ -42,5 +42,9 @@ public static class MinerPaths public const string sgminer_5_5_0_general = _bin + @"\sgminer-5-5-0-general\sgminer.exe"; public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; + /// + /// nheqminer + /// + public const string nheqminer = _bin + @"\nheqminer_v0.3a\nheqminer.exe"; } } diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index 08ffd86..2fab8f5 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -58,7 +58,7 @@ public override void Start(Algorithm miningAlgorithm, string url, string usernam } protected override void _Stop(MinerStopType willswitch) { - Stop_cpu_ccminer_sgminer(willswitch); + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } protected override bool UpdateBindPortCommand(int oldPort, int newPort) { diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index 21be921..7b78d77 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -155,7 +155,7 @@ public override APIData GetSummary() { } protected override void _Stop(MinerStopType willswitch) { - Stop_cpu_ccminer_sgminer(willswitch); + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } protected override NiceHashProcess _Start() { diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/nheqminer.cs new file mode 100644 index 0000000..3b43c66 --- /dev/null +++ b/NiceHashMiner/Miners/nheqminer.cs @@ -0,0 +1,90 @@ +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners { + public class nheqminer : Miner { + private readonly int AMD_OCL_PLATFORM; + + public nheqminer() + : base(DeviceType.ALL, "nheqminer") { + Path = MinerPaths.nheqminer; + AMD_OCL_PLATFORM = ComputeDeviceQueryManager.Instance.AMDOpenCLPlatformNum; + } + + public override void Start(Algorithm miningAlgorithm, string url, string username) { + // TODO + ProcessHandle = _Start(); + } + + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + // TODO + return ""; + } + + protected override string GetDevicesCommandString() { + // TODO + string deviceStringCommand = " "; + + List ids = new List(); + foreach (var cdev in CDevs) { + ids.Add(cdev.ID.ToString()); + } + return deviceStringCommand; + } + + public override APIData GetSummary() { + // TODO + APIData ad = new APIData(); + + FillAlgorithm("equihash", ref ad); + + + _currentMinerReadStatus = MinerAPIReadStatus.NONE; + return null; + } + + // benchmark stuff + protected override bool BenchmarkParseLine(string outdata) { + // TODO + + return false; + } + + protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { + CheckOutdata(outdata); + } + + // DONE + protected override bool UpdateBindPortCommand(int oldPort, int newPort) { + const string MASK = "-a {0}"; + var oldApiBindStr = String.Format(MASK, oldPort); + var newApiBindStr = String.Format(MASK, newPort); + if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { + LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); + return true; + } + return false; + } + protected override void InitSupportedMinerAlgorithms() { + _supportedMinerAlgorithms = new AlgorithmType[] { AlgorithmType.DaggerHashimoto }; + } + + protected override void _Stop(MinerStopType willswitch) { + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); + } + + protected override int GET_MAX_CooldownTimeInMilliseconds() { + return 60 * 1000; // 1 minute max, whole waiting time 75seconds + } + + // STUBS + public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename, bool isOptimized) { + return MinerPaths.nheqminer; + } + } +} diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 0e52eaa..104c9db 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -77,7 +77,7 @@ public override void SetCDevs(string[] deviceUUIDs) { } protected override void _Stop(MinerStopType willswitch) { - Stop_cpu_ccminer_sgminer(willswitch); + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } public override void Start(Algorithm miningAlgorithm, string url, string username) diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index c68b867..75d33de 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -191,6 +191,7 @@ + diff --git a/NiceHashMiner/ProfitabilityCalculator.cs b/NiceHashMiner/ProfitabilityCalculator.cs index d301fb7..c96ef70 100644 --- a/NiceHashMiner/ProfitabilityCalculator.cs +++ b/NiceHashMiner/ProfitabilityCalculator.cs @@ -42,6 +42,7 @@ static class ProfitabilityCalculator { { AlgorithmType.Decred , GHs }, { AlgorithmType.CryptoNight , kHs }, { AlgorithmType.Lbry , GHs }, + { AlgorithmType.Equihash , 1 }, // Sols /s }; public static double GetFormatedSpeed(double speed, AlgorithmType type) { From 3c109b06753033b211e9703580e42eebb4fdc996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 29 Oct 2016 00:59:13 +0200 Subject: [PATCH 073/366] Equihash support added --- NiceHashMiner/Devices/ComputeDevice.cs | 6 +- .../Devices/ComputeDeviceQueryManager.cs | 18 ++- NiceHashMiner/Devices/GroupAlgorithms.cs | 5 +- NiceHashMiner/Forms/Form_Benchmark.cs | 4 +- NiceHashMiner/Forms/Form_Main.cs | 4 + .../Miners/ManagerPrivate/CpuGroupMiner.cs | 24 --- .../Miners/ManagerPrivate/GroupMiners.cs | 8 +- NiceHashMiner/Miners/Miner.cs | 7 +- NiceHashMiner/Miners/MinersManager.cs | 46 +++--- NiceHashMiner/Miners/cpuminer.cs | 89 +++++------ NiceHashMiner/Miners/nheqminer.cs | 142 +++++++++++++++--- NiceHashMiner/NiceHashMiner.csproj | 1 - 12 files changed, 223 insertions(+), 131 deletions(-) delete mode 100644 NiceHashMiner/Miners/ManagerPrivate/CpuGroupMiner.cs diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index c2dcd02..fbacaba 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -45,6 +45,9 @@ public class ComputeDevice [JsonIgnore] readonly public int Threads; + [JsonIgnore] + readonly public ulong AffinityMask; + // CPU, NVIDIA, AMD [JsonIgnore] public DeviceType DeviceType { get; private set; } @@ -117,12 +120,13 @@ private void InitGlobalsList(bool addToGlobalList) { } // CPU - public ComputeDevice(int id, string group, string name, int threads, bool addToGlobalList = false, bool enabled = true) + public ComputeDevice(int id, string group, string name, int threads, ulong affinityMask, bool addToGlobalList = false, bool enabled = true) { ID = id; Group = group; Name = name; Threads = threads; + AffinityMask = affinityMask; _nameNoNums = name; Enabled = enabled; DeviceGroupType = GroupNames.GetType(Group); diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index 6ccff1e..a1e8161 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -260,16 +260,18 @@ private void QueryCPUs() { // TODO important move this to settings int ThreadsPerCPUMask = ThreadsPerCPU; Globals.ThreadsPerCPU = ThreadsPerCPU; - - if (CPUs == 1) { - MinersManager.Instance.AddCpuMiner(new cpuminer(0, ThreadsPerCPU, 0), 0, CPUID.GetCPUName().Trim()); - } - else { - for (int i = 0; i < CPUs; i++) { - MinersManager.Instance.AddCpuMiner(new cpuminer(i, ThreadsPerCPU, CPUID.CreateAffinityMask(i, ThreadsPerCPUMask)), - i, CPUID.GetCPUName().Trim()); + + if (cpuminer.InitializeMinerPaths()) { + if (CPUs == 1) { + new ComputeDevice(0, "CPU0", CPUID.GetCPUName().Trim(), ThreadsPerCPU, (ulong)0, true); + //MinersManager.Instance.AddCpuMiner(new cpuminer(0, ThreadsPerCPU, 0), 0, CPUID.GetCPUName().Trim()); + } else { + for (int i = 0; i < CPUs; i++) { + new ComputeDevice(0, "CPU"+i, CPUID.GetCPUName().Trim(), ThreadsPerCPU, CPUID.CreateAffinityMask(i, ThreadsPerCPUMask), true); + } } } + Helpers.ConsolePrint(TAG, "QueryCPUs END"); } diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 52af17b..894675e 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -15,7 +15,8 @@ public static Dictionary CreateDefaultsForGroup(Device return new Dictionary() { { AlgorithmType.Lyra2RE, new Algorithm(AlgorithmType.Lyra2RE, "lyra2") }, { AlgorithmType.Hodl, new Algorithm(AlgorithmType.Hodl, "hodl") }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") } + { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, + { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; } if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { @@ -51,6 +52,7 @@ public static Dictionary CreateDefaultsForGroup(Device { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; } // NVIDIA @@ -73,6 +75,7 @@ public static Dictionary CreateDefaultsForGroup(Device { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") }, { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") }, + { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { // minerName change => "whirlpoolx" => "whirlpool" diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 1fef85c..e9fb9ba 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -403,8 +403,8 @@ void NextBenchmark() { } var currentConfig = _currentDevice.DeviceBenchmarkConfig; - if (_currentDevice.DeviceGroupType == DeviceGroupType.CPU) { - _currentMiner = MinersManager.GetCpuMiner(_currentDevice.Group); + if (_currentDevice.DeviceGroupType == DeviceGroupType.CPU && (_currentAlgorithm != null && _currentAlgorithm.NiceHashID != AlgorithmType.Equihash)) { + _currentMiner = MinersManager.CreateMiner(DeviceGroupType.CPU, AlgorithmType.NONE); if (_currentAlgorithm != null && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { __CPUBenchmarkStatus = new CPUBenchmarkStatus(); _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 8e9c178..36bdd0b 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -431,6 +431,10 @@ public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPID string ApiGetExceptionString = isApiGetException ? "**" : ""; string speedString = Helpers.FormatSpeedOutput(iAPIData.Speed) + iAPIData.AlgorithmName + ApiGetExceptionString; + if (iAPIData.AlgorithmID == AlgorithmType.Equihash) { + speedString = speedString.Replace("H/s", "Sols/s"); + } + string rateBTCString = FormatPayingOutput(paying); string rateCurrencyString = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying * Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) + String.Format(" {0}/", ConfigManager.Instance.GeneralConfig.DisplayCurrency) + International.GetText("Day"); diff --git a/NiceHashMiner/Miners/ManagerPrivate/CpuGroupMiner.cs b/NiceHashMiner/Miners/ManagerPrivate/CpuGroupMiner.cs deleted file mode 100644 index 5c91c54..0000000 --- a/NiceHashMiner/Miners/ManagerPrivate/CpuGroupMiner.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NiceHashMiner.Miners { - using NiceHashMiner.Enums; - using NiceHashMiner.Devices; - using NiceHashMiner.Configs; - // typedefs - using GroupedDevices = SortedSet; - using GroupedDevicesKey = SortedSet>; - - public partial class MinersManager { - private class CpuGroupMiner : GroupMiners { - - public CpuGroupMiner(GroupedDevices deviceUUIDSet, cpuminer miner) - : base(deviceUUIDSet) { - _miners.Add(miner); - } - } - } -} diff --git a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs index 7200eea..eb886ff 100644 --- a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs +++ b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs @@ -81,7 +81,7 @@ public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string wo } } // check if contains miner if not create one - if (!containsSupportedMiner && _deviceGroupType != DeviceGroupType.CPU) { + if (!containsSupportedMiner) { startSwitchMiner = CreateMiner(_deviceGroupType, algorithmType); startSwitchMiner.SetCDevs(_deviceUUIDs); _miners.Add(startSwitchMiner); @@ -114,12 +114,16 @@ private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string minin // Wait before new start System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - m.Start(algorithm, + if (MaxProfitKey == AlgorithmType.Equihash) { + m.Start(algorithm, miningLocation, worker); + } else { + m.Start(algorithm, "stratum+tcp://" + Globals.NiceHashData[MaxProfitKey].name + "." + miningLocation + ".nicehash.com:" + Globals.NiceHashData[MaxProfitKey].port, worker); + } } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 7100e32..99e0609 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -41,7 +41,7 @@ public abstract class Miner { // used to identify miner instance protected readonly long MINER_ID; private string _minetTag = null; - public string MinerDeviceName { get; private set; } + public string MinerDeviceName { get; set; } protected int APIPort { get; private set; } // if miner has no API bind port for reading curentlly only CryptoNight on ccminer public bool IsAPIReadException { get; protected set; } @@ -349,6 +349,9 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { } else { BenchmarkProcessPath = BenchmarkHandle.StartInfo.FileName; Helpers.ConsolePrint(MinerTAG(), "Using miner: " + BenchmarkHandle.StartInfo.FileName); + if (CurrentBenchmarkAlgorithmType == AlgorithmType.Equihash) { + BenchmarkHandle.StartInfo.WorkingDirectory = WorkingDirectory; + } } BenchmarkHandle.StartInfo.Arguments = (string)CommandLine; @@ -630,7 +633,7 @@ protected string GetAPIData(int port, string cmd) "User-Agent: NiceHashMiner/" + Application.ProductVersion + "\r\n" + "\r\n"; - if (DeviceType == DeviceType.AMD /*MinerDeviceName.Equals("AMD_OpenCL")*/) + if (DeviceType == DeviceType.AMD || CurrentAlgorithmType == AlgorithmType.Equihash) DataToSend = cmd; byte[] BytesToSend = ASCIIEncoding.ASCII.GetBytes(DataToSend); diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index b9e7f03..f953531 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -73,10 +73,7 @@ public partial class MinersManager : BaseLazySingleton { private Timer _preventSleepTimer; // check internet connection private Timer _internetCheckTimer; - - // we save cpu miners string group name - Dictionary _cpuMiners = new Dictionary(); - + private bool IsProfitable = true; private bool IsConnectedToInternet = true; @@ -117,10 +114,6 @@ private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { Helpers.PreventSleep(); } - public void AddCpuMiner(cpuminer miner, int deviceID, string deviceName) { - _cpuMiners.Add(miner.MinerDeviceName, miner); - } - public void StopAllMiners() { IsCurrentlyIdle = true; if (_groupedDevicesMiners != null) { @@ -171,15 +164,11 @@ public string GetActiveMinersGroup() { return ActiveMinersGroup; } - public static Miner GetCpuMiner(string groupName) { - if (Instance._cpuMiners.Count > 0) { - return Instance._cpuMiners[groupName]; - } - return null; - } // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType algorithmType) { - if (AlgorithmType.DaggerHashimoto == algorithmType) { + if (AlgorithmType.Equihash == algorithmType) { + return new nheqminer(); + } else if (AlgorithmType.DaggerHashimoto == algorithmType) { if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { return new MinerEtherumOCL(); } else { @@ -197,6 +186,8 @@ public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType a return new ccminer_sm5x(); case DeviceGroupType.NVIDIA_6_x: return new ccminer_sm6x(); + case DeviceGroupType.CPU: + return new cpuminer(); } } @@ -250,14 +241,6 @@ public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication foreach (var cdev in ComputeDevice.AllAvaliableDevices) { if (cdev.Enabled) { _enabledDevices.Add(cdev); - // check if in CPU group and add the saved CPU miners - if (cdev.DeviceGroupType == DeviceGroupType.CPU) { - GroupedDevices gdevs = new GroupedDevices(); - gdevs.Add(cdev.UUID); - cpuminer miner = _cpuMiners[cdev.Group]; - CpuGroupMiner cpuGroupMiner = new CpuGroupMiner(gdevs, miner); - _groupedDevicesMiners.Add(CalcGroupedDevicesKey(gdevs), cpuGroupMiner); - } // check if any algorithm enabled if(!isMiningEnabled) { foreach (var algorithm in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { @@ -267,7 +250,6 @@ public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication } } } - } } @@ -432,6 +414,18 @@ private bool IsNvidiaDevice(ComputeDevice a) { return false; } + private bool IsEquihashAndOneCPU(ComputeDevice a, ComputeDevice b) { + return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash + && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID + && ComputeDeviceQueryManager.Instance.CPUs == 1; + } + + private bool IsEquihashAndOneNOTCPU(ComputeDevice a, ComputeDevice b) { + return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash + && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID + && a.DeviceType != DeviceType.CPU && b.DeviceType != DeviceType.CPU; + } + // checks if dagger algo, same settings and if compute platform is same private bool IsDaggerAndSameComputePlatform(ComputeDevice a, ComputeDevice b) { return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto @@ -570,7 +564,9 @@ public void SwichMostProfitableGroupUpMethod(Dictionary /// /// Returns False if CPUExtensionType.Automatic, otherwise True and initializes paths - private bool InitializeMinerPaths(CPUExtensionType type) { - bool isInitialized = false; + public static string GetOptimizedMinerPath(CPUExtensionType type) { // if type not automatic and has extension support set initialized if (HasExtensionSupport(type)) { - isInitialized = true; switch (type) { case CPUExtensionType.AVX2_AES: - CPUMinerPath = MinerPaths.cpuminer_opt_AVX2_AES; - break; + return MinerPaths.cpuminer_opt_AVX2_AES; case CPUExtensionType.AVX2: - CPUMinerPath = MinerPaths.cpuminer_opt_AVX2; - break; + return MinerPaths.cpuminer_opt_AVX2; case CPUExtensionType.AVX_AES: - CPUMinerPath = MinerPaths.cpuminer_opt_AVX_AES; - break; + return MinerPaths.cpuminer_opt_AVX_AES; case CPUExtensionType.AVX: - CPUMinerPath = MinerPaths.cpuminer_opt_AVX; - break; + return MinerPaths.cpuminer_opt_AVX; case CPUExtensionType.AES: - CPUMinerPath = MinerPaths.cpuminer_opt_AES; - break; + return MinerPaths.cpuminer_opt_AES; case CPUExtensionType.SSE2: - CPUMinerPath = MinerPaths.cpuminer_opt_SSE2; - break; + return MinerPaths.cpuminer_opt_SSE2; default: // CPUExtensionType.Automatic break; } } - return isInitialized; + return ""; } public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename = "", bool isOptimized = false) { - return CPUMinerPath; + return GetOptimizedMinerPath(GetMostOptimized()); } /// @@ -111,7 +114,7 @@ public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string /// /// /// False if type Automatic otherwise True if supported - private bool HasExtensionSupport(CPUExtensionType type) { + public static bool HasExtensionSupport(CPUExtensionType type) { switch (type) { case CPUExtensionType.AVX2_AES: return (CPUID.SupportsAVX2() == 1) && (CPUID.SupportsAES() == 1); case CPUExtensionType.AVX2: return CPUID.SupportsAVX2() == 1; @@ -161,8 +164,8 @@ protected override void _Stop(MinerStopType willswitch) { protected override NiceHashProcess _Start() { NiceHashProcess P = base._Start(); - if (AffinityMask != 0 && P != null) - CPUID.AdjustAffinity(P.Id, AffinityMask); + if (CDevs[0].AffinityMask != 0 && P != null) + CPUID.AdjustAffinity(P.Id, CDevs[0].AffinityMask); return P; } @@ -192,8 +195,8 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti protected override Process BenchmarkStartProcess(string CommandLine) { Process BenchmarkHandle = base.BenchmarkStartProcess(CommandLine); - if (AffinityMask != 0 && BenchmarkHandle != null) - CPUID.AdjustAffinity(BenchmarkHandle.Id, AffinityMask); + if (CDevs[0].AffinityMask != 0 && BenchmarkHandle != null) + CPUID.AdjustAffinity(BenchmarkHandle.Id, CDevs[0].AffinityMask); return BenchmarkHandle; } diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/nheqminer.cs index 3b43c66..b3b8ecb 100644 --- a/NiceHashMiner/Miners/nheqminer.cs +++ b/NiceHashMiner/Miners/nheqminer.cs @@ -1,8 +1,10 @@ -using NiceHashMiner.Devices; +using Newtonsoft.Json; +using NiceHashMiner.Devices; using NiceHashMiner.Enums; using System; using System.Collections.Generic; using System.Linq; +using System.Net.Sockets; using System.Text; using System.Threading.Tasks; @@ -10,54 +12,128 @@ namespace NiceHashMiner.Miners { public class nheqminer : Miner { private readonly int AMD_OCL_PLATFORM; + List CPUs = new List(); + List NVIDIAs = new List(); + List AMDs = new List(); + + private class Result { + public double interval_seconds { get; set; } + public double speed_ips { get; set; } + public double speed_sps { get; set; } + public double accepted_per_minute { get; set; } + public double rejected_per_minute { get; set; } + } + + private class JsonApiResponse { + public string method { get; set; } + public Result result { get; set; } + public object error { get; set; } + } + public nheqminer() : base(DeviceType.ALL, "nheqminer") { Path = MinerPaths.nheqminer; + WorkingDirectory = MinerPaths.nheqminer.Replace("nheqminer.exe", ""); AMD_OCL_PLATFORM = ComputeDeviceQueryManager.Instance.AMDOpenCLPlatformNum; } public override void Start(Algorithm miningAlgorithm, string url, string username) { - // TODO + CurrentMiningAlgorithm = miningAlgorithm; + LastCommandLine = GetDevicesCommandString() + " -a " + APIPort + " -l " + url + " -u " + username; ProcessHandle = _Start(); } + public override void SetCDevs(string[] deviceUUIDs) { + base.SetCDevs(deviceUUIDs); + foreach (var cDev in CDevs) { + if(cDev.DeviceType == DeviceType.CPU) { + CPUs.Add(cDev); + } + if (cDev.DeviceType == DeviceType.NVIDIA) { + NVIDIAs.Add(cDev); + } + if (cDev.DeviceType == DeviceType.AMD) { + AMDs.Add(cDev); + } + } + } + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - // TODO - return ""; + // TODO nvidia extras + String ret = "-b " + GetDevicesCommandString(); + return ret; } protected override string GetDevicesCommandString() { - // TODO string deviceStringCommand = " "; - List ids = new List(); - foreach (var cdev in CDevs) { - ids.Add(cdev.ID.ToString()); + if (CPUs.Count > 0) { + deviceStringCommand += " -t " + CPUs[0].Threads; + } else { + // disable CPU + deviceStringCommand += " -t 0 "; + } + + if (NVIDIAs.Count > 0) { + deviceStringCommand += " -cd "; + foreach (var nvidia in NVIDIAs) { + deviceStringCommand += nvidia.ID + " "; + } } + + if (AMDs.Count > 0) { + deviceStringCommand += " -op " + AMD_OCL_PLATFORM.ToString(); + deviceStringCommand += " -od "; + foreach (var amd in AMDs) { + deviceStringCommand += amd.ID + " "; + } + } + return deviceStringCommand; } + public override APIData GetSummary() { - // TODO + _currentMinerReadStatus = MinerAPIReadStatus.NONE; APIData ad = new APIData(); + ad.AlgorithmID = AlgorithmType.Equihash; + ad.AlgorithmName = "equihash"; + + TcpClient client = null; + JsonApiResponse resp = null; + try { + byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("status\n"); + client = new TcpClient("127.0.0.1", APIPort); + NetworkStream nwStream = client.GetStream(); + nwStream.Write(bytesToSend, 0, bytesToSend.Length); + byte[] bytesToRead = new byte[client.ReceiveBufferSize]; + int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); + string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); + resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); + } catch(Exception ex) { + Helpers.ConsolePrint("ERROR", ex.Message); + } finally { + client.Close(); + } - FillAlgorithm("equihash", ref ad); - + if (resp != null && resp.error == null) { + ad.Speed = resp.result.speed_sps; + _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + if (ad.Speed == 0) { + _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; + } + } - _currentMinerReadStatus = MinerAPIReadStatus.NONE; - return null; + return ad; } - // benchmark stuff - protected override bool BenchmarkParseLine(string outdata) { - // TODO + protected override NiceHashProcess _Start() { + NiceHashProcess P = base._Start(); + if(CPUs.Count > 0 && CPUs[0].AffinityMask != 0 && P != null) + CPUID.AdjustAffinity(P.Id, CPUs[0].AffinityMask); - return false; - } - - protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { - CheckOutdata(outdata); - } + return P; + } // DONE protected override bool UpdateBindPortCommand(int oldPort, int newPort) { @@ -82,6 +158,28 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { return 60 * 1000; // 1 minute max, whole waiting time 75seconds } + // benchmark stuff + static private readonly String Iter_PER_SEC = "I/s"; + //static private readonly String Sols_PER_SEC = "Sols/s"; + private const double SolMultFactor = 1.9; + protected override bool BenchmarkParseLine(string outdata) { + + if (outdata.Contains(Iter_PER_SEC)) { + int speedStart = outdata.IndexOf("Speed: "); + String speed = outdata.Substring(speedStart, outdata.Length - speedStart); + speed = speed.Replace("Speed:", ""); + speed = speed.Replace(Iter_PER_SEC, ""); + speed = speed.Trim(); + BenchmarkAlgorithm.BenchmarkSpeed = Double.Parse(speed) * SolMultFactor; + return true; + } + return false; + } + + protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { + CheckOutdata(outdata); + } + // STUBS public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename, bool isOptimized) { return MinerPaths.nheqminer; diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 75d33de..ba06e9a 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -181,7 +181,6 @@ - From 49d2b306a66cf51f0ce98eee61ea144d7b42099c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 29 Oct 2016 01:05:25 +0200 Subject: [PATCH 074/366] version bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index c6c5599..869c0a4 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.2.0")] -[assembly: AssemblyFileVersion("1.7.2.0")] +[assembly: AssemblyVersion("1.7.3.0")] +[assembly: AssemblyFileVersion("1.7.3.0")] From ce5989a053e2f07e89ab76d6e4ba99c671fbfb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 29 Oct 2016 01:14:45 +0200 Subject: [PATCH 075/366] update bins dl link --- NiceHashMiner/Utils/MinersDownloadManager.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 3233bfd..84b8cb5 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -22,12 +22,9 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Sat, 29 Oct 2016 17:49:13 +0200 Subject: [PATCH 076/366] Equihash fixes --- NiceHashMiner/Miners/MinersManager.cs | 14 ++++++ NiceHashMiner/Miners/nheqminer.cs | 46 ++++++++++++++------ NiceHashMiner/Utils/MinersDownloadManager.cs | 5 ++- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index f953531..edc11c9 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -21,6 +21,7 @@ namespace NiceHashMiner.Miners { using GroupedDevices = SortedSet; using AllGroupedDevices = List>; using NiceHashMiner.Interfaces; + using System.IO; @@ -129,6 +130,19 @@ public void StopAllMiners() { _preventSleepTimer.Stop(); _internetCheckTimer.Stop(); Helpers.AllowMonitorPowerdownAndSleep(); + + // delete generated bin files + // check for bins files + var dirInfo = new DirectoryInfo(MinerPaths.nheqminer.Replace("nheqminer.exe", "")); + var DONT_DELETE = "equiw200k9.bin"; + var deleteContains = "equiw200k9"; + if (dirInfo != null && dirInfo.Exists) { + foreach (FileInfo file in dirInfo.GetFiles()) { + if (file.Name != DONT_DELETE && file.Name.Contains(deleteContains)) { + file.Delete(); + } + } + } } public void StopAllMinersNonProfitable() { diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/nheqminer.cs index b3b8ecb..e02a859 100644 --- a/NiceHashMiner/Miners/nheqminer.cs +++ b/NiceHashMiner/Miners/nheqminer.cs @@ -3,6 +3,8 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; +using System.Globalization; +using System.IO; using System.Linq; using System.Net.Sockets; using System.Text; @@ -16,6 +18,9 @@ public class nheqminer : Miner { List NVIDIAs = new List(); List AMDs = new List(); + // extra benchmark stuff + double curSpeed = 0; + private class Result { public double interval_seconds { get; set; } public double speed_ips { get; set; } @@ -60,6 +65,7 @@ public override void SetCDevs(string[] deviceUUIDs) { protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { // TODO nvidia extras + CurrentMiningAlgorithm = algorithm; String ret = "-b " + GetDevicesCommandString(); return ret; } @@ -68,7 +74,7 @@ protected override string GetDevicesCommandString() { string deviceStringCommand = " "; if (CPUs.Count > 0) { - deviceStringCommand += " -t " + CPUs[0].Threads; + deviceStringCommand += " -t " + (CPUs[0].Threads - CPUs[0].MostProfitableAlgorithm.LessThreads); } else { // disable CPU deviceStringCommand += " -t 0 "; @@ -98,6 +104,7 @@ public override APIData GetSummary() { APIData ad = new APIData(); ad.AlgorithmID = AlgorithmType.Equihash; ad.AlgorithmName = "equihash"; + ad.Speed = 0; TcpClient client = null; JsonApiResponse resp = null; @@ -110,10 +117,9 @@ public override APIData GetSummary() { int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); + client.Close(); } catch(Exception ex) { Helpers.ConsolePrint("ERROR", ex.Message); - } finally { - client.Close(); } if (resp != null && resp.error == null) { @@ -133,7 +139,7 @@ protected override NiceHashProcess _Start() { CPUID.AdjustAffinity(P.Id, CPUs[0].AffinityMask); return P; - } + } // DONE protected override bool UpdateBindPortCommand(int oldPort, int newPort) { @@ -147,7 +153,7 @@ protected override bool UpdateBindPortCommand(int oldPort, int newPort) { return false; } protected override void InitSupportedMinerAlgorithms() { - _supportedMinerAlgorithms = new AlgorithmType[] { AlgorithmType.DaggerHashimoto }; + _supportedMinerAlgorithms = new AlgorithmType[] { AlgorithmType.Equihash }; } protected override void _Stop(MinerStopType willswitch) { @@ -158,20 +164,34 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { return 60 * 1000; // 1 minute max, whole waiting time 75seconds } + private double getNumber(string outdata, string startF, string remF) { + try { + int speedStart = outdata.IndexOf(startF); + String speed = outdata.Substring(speedStart, outdata.Length - speedStart); + speed = speed.Replace(startF, ""); + speed = speed.Replace(remF, ""); + speed = speed.Trim(); + return Double.Parse(speed, CultureInfo.InvariantCulture); + } catch { + } + return 0; + } + // benchmark stuff static private readonly String Iter_PER_SEC = "I/s"; - //static private readonly String Sols_PER_SEC = "Sols/s"; + static private readonly String Sols_PER_SEC = "Sols/s"; private const double SolMultFactor = 1.9; protected override bool BenchmarkParseLine(string outdata) { if (outdata.Contains(Iter_PER_SEC)) { - int speedStart = outdata.IndexOf("Speed: "); - String speed = outdata.Substring(speedStart, outdata.Length - speedStart); - speed = speed.Replace("Speed:", ""); - speed = speed.Replace(Iter_PER_SEC, ""); - speed = speed.Trim(); - BenchmarkAlgorithm.BenchmarkSpeed = Double.Parse(speed) * SolMultFactor; - return true; + curSpeed = getNumber(outdata, "Speed: ", Iter_PER_SEC) * SolMultFactor; + } + if (outdata.Contains(Sols_PER_SEC)) { + var sols = getNumber(outdata, "Speed: ", Sols_PER_SEC); + if (sols > 0) { + BenchmarkAlgorithm.BenchmarkSpeed = curSpeed; + return true; + } } return false; } diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 84b8cb5..50714a8 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -22,9 +22,10 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Sat, 29 Oct 2016 17:51:23 +0200 Subject: [PATCH 077/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 869c0a4..2d19199 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.0")] -[assembly: AssemblyFileVersion("1.7.3.0")] +[assembly: AssemblyVersion("1.7.3.1")] +[assembly: AssemblyFileVersion("1.7.3.1")] From 2e9c5876c397ae1ef2505f2e5eabb2c0ad887ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 3 Nov 2016 13:36:30 +0100 Subject: [PATCH 078/366] 1 or 0 CPU equihash grouping --- NiceHashMiner/Miners/MinersManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index edc11c9..0e1541d 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -431,7 +431,7 @@ private bool IsNvidiaDevice(ComputeDevice a) { private bool IsEquihashAndOneCPU(ComputeDevice a, ComputeDevice b) { return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID - && ComputeDeviceQueryManager.Instance.CPUs == 1; + && ComputeDeviceQueryManager.Instance.CPUs <= 1; } private bool IsEquihashAndOneNOTCPU(ComputeDevice a, ComputeDevice b) { From 03a3b80167c890551f02494140d76d8825413971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 01:34:12 +0100 Subject: [PATCH 079/366] update nheqminer path, and -l params --- NiceHashMiner/Enums/MinerOptionType.cs | 9 ++++++++- NiceHashMiner/Miners/ExtraLaunchParametersParser.cs | 1 + NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs | 7 ++++++- NiceHashMiner/Miners/MinerPaths.cs | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index b950257..17df9fe 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -41,6 +41,13 @@ public enum MinerOptionType { // cpuminer Threads, CpuAffinity, - CpuPriority + CpuPriority, + // nheqminer + // nheqminer CUDA + CUDA_Solver_Version, + + // nheqminer OpenCL + OpenCL_Solver_Version, + //OpenCL_ } } diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index 8192657..f75d715 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -66,6 +66,7 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.CpuAffinity, "", "--cpu-affinity", "-1"), // default none new MinerOption(MinerOptionType.CpuPriority, "", "--cpu-priority", "-1"), // default none }; + // nheqminer private static bool _showLog = true; diff --git a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs index eb886ff..b3cf95f 100644 --- a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs +++ b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs @@ -115,7 +115,12 @@ private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string minin System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); if (MaxProfitKey == AlgorithmType.Equihash) { - m.Start(algorithm, miningLocation, worker); + //m.Start(algorithm, miningLocation, worker); + m.Start(algorithm, + Globals.NiceHashData[MaxProfitKey].name + + "." + miningLocation + + ".nicehash.com:" + + Globals.NiceHashData[MaxProfitKey].port, worker); } else { m.Start(algorithm, "stratum+tcp://" diff --git a/NiceHashMiner/Miners/MinerPaths.cs b/NiceHashMiner/Miners/MinerPaths.cs index 84057d7..ad402c6 100644 --- a/NiceHashMiner/Miners/MinerPaths.cs +++ b/NiceHashMiner/Miners/MinerPaths.cs @@ -45,6 +45,6 @@ public static class MinerPaths /// /// nheqminer /// - public const string nheqminer = _bin + @"\nheqminer_v0.3a\nheqminer.exe"; + public const string nheqminer = _bin + @"\nheqminer_v0.4a\nheqminer.exe"; } } From 8c38108615c0491293b80c888d9e2251daa41da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 01:37:29 +0100 Subject: [PATCH 080/366] clean generated bin files --- NiceHashMiner/Miners/MinersManager.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 0e1541d..3f3d143 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -136,11 +136,15 @@ public void StopAllMiners() { var dirInfo = new DirectoryInfo(MinerPaths.nheqminer.Replace("nheqminer.exe", "")); var DONT_DELETE = "equiw200k9.bin"; var deleteContains = "equiw200k9"; + var alwaysDeleteContains2 = "silentarmy_gpu"; if (dirInfo != null && dirInfo.Exists) { foreach (FileInfo file in dirInfo.GetFiles()) { if (file.Name != DONT_DELETE && file.Name.Contains(deleteContains)) { file.Delete(); } + if (file.Name.Contains(alwaysDeleteContains2)) { + file.Delete(); + } } } } From f376dafcfcd122f7491d393a45e98fd47dbae152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 01:38:34 +0100 Subject: [PATCH 081/366] increase benchmark time wait for nheqminer --- NiceHashMiner/Miners/nheqminer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/nheqminer.cs index e02a859..8fa5f9c 100644 --- a/NiceHashMiner/Miners/nheqminer.cs +++ b/NiceHashMiner/Miners/nheqminer.cs @@ -161,7 +161,7 @@ protected override void _Stop(MinerStopType willswitch) { } protected override int GET_MAX_CooldownTimeInMilliseconds() { - return 60 * 1000; // 1 minute max, whole waiting time 75seconds + return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds } private double getNumber(string outdata, string startF, string remF) { From 75895a5d02e395d93f40ed2225f41055df9372de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 02:26:53 +0100 Subject: [PATCH 082/366] extra params parsing nheqminer --- NiceHashMiner/Enums/MinerOptionType.cs | 9 +++--- .../Miners/ExtraLaunchParametersParser.cs | 32 ++++++++++++++++++- NiceHashMiner/Miners/nheqminer.cs | 9 +++++- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 17df9fe..2d62fbd 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -44,10 +44,11 @@ public enum MinerOptionType { CpuPriority, // nheqminer // nheqminer CUDA - CUDA_Solver_Version, - + CUDA_Solver_Version, // -cb + CUDA_Solver_Block, // -cb + CUDA_Solver_Thread, // -ct // nheqminer OpenCL - OpenCL_Solver_Version, - //OpenCL_ + OpenCL_Solver_Version, //-ov + OpenCL_Solver_Dev_Thread // -ot } } diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index f75d715..aabc4bf 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -66,7 +66,23 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.CpuAffinity, "", "--cpu-affinity", "-1"), // default none new MinerOption(MinerOptionType.CpuPriority, "", "--cpu-priority", "-1"), // default none }; - // nheqminer + // nheqminer + private static List _nheqminer_CPU_Options = new List() { + // temperature stuff + new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1"), // default none + }; + private static List _nheqminer_CUDA_Options = new List() { + // temperature stuff + // use always -cv 1 + //new MinerOption(MinerOptionType.CUDA_Solver_Version, "-cv", "-cv", "0", MinerOptionFlagType.SingleParam), // default 0 + new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0"), // default 0 + new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0"), // default 0 + }; + private static List _nheqminer_AMD_Options = new List() { + // temperature stuff + new MinerOption(MinerOptionType.OpenCL_Solver_Version, "-ov", "-ov", "0", MinerOptionFlagType.SingleParam), // default none + new MinerOption(MinerOptionType.OpenCL_Solver_Dev_Thread, "-ot", "-ot", "1"), // default none + }; private static bool _showLog = true; @@ -233,6 +249,20 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo foreach (var cDev in CDevs) { cDev.CurrentExtraLaunchParameters = cDev.MostProfitableAlgorithm.ExtraLaunchParameters; } + + // parse for nheqminer + if (algorithmType == AlgorithmType.Equihash) { + if(deviceType == DeviceType.CPU) { + return Parse(CDevs, _nheqminer_CPU_Options); + } + if (deviceType == DeviceType.NVIDIA) { + return Parse(CDevs, _nheqminer_CUDA_Options); + } + if (deviceType == DeviceType.AMD) { + return Parse(CDevs, _nheqminer_AMD_Options); + } + } + // parse for device if (deviceType == DeviceType.NVIDIA) { if (algorithmType != AlgorithmType.DaggerHashimoto && algorithmType != AlgorithmType.CryptoNight) { diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/nheqminer.cs index 8fa5f9c..5e717e7 100644 --- a/NiceHashMiner/Miners/nheqminer.cs +++ b/NiceHashMiner/Miners/nheqminer.cs @@ -74,7 +74,10 @@ protected override string GetDevicesCommandString() { string deviceStringCommand = " "; if (CPUs.Count > 0) { - deviceStringCommand += " -t " + (CPUs[0].Threads - CPUs[0].MostProfitableAlgorithm.LessThreads); + if (CPUs[0].MostProfitableAlgorithm.LessThreads == 0 && string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { + // TODO parse + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU); + } } else { // disable CPU deviceStringCommand += " -t 0 "; @@ -85,6 +88,9 @@ protected override string GetDevicesCommandString() { foreach (var nvidia in NVIDIAs) { deviceStringCommand += nvidia.ID + " "; } + // use always -cv 1 + deviceStringCommand += " -cv 1"; + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(NVIDIAs, AlgorithmType.Equihash, DeviceType.NVIDIA); } if (AMDs.Count > 0) { @@ -93,6 +99,7 @@ protected override string GetDevicesCommandString() { foreach (var amd in AMDs) { deviceStringCommand += amd.ID + " "; } + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(AMDs, AlgorithmType.Equihash, DeviceType.AMD); } return deviceStringCommand; From 70f75567db396337c360b2f64a69744e570bffc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 02:29:21 +0100 Subject: [PATCH 083/366] update dl link --- NiceHashMiner/Utils/MinersDownloadManager.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 50714a8..96ab794 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -22,10 +22,11 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Fri, 4 Nov 2016 02:30:15 +0100 Subject: [PATCH 084/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 2d19199..b4701c4 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.1")] -[assembly: AssemblyFileVersion("1.7.3.1")] +[assembly: AssemblyVersion("1.7.3.2")] +[assembly: AssemblyFileVersion("1.7.3.2")] From e31622c8d49c4f2737d6d3c0f8f2c9d95852cb32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 09:31:02 +0100 Subject: [PATCH 085/366] correct parameter separators for nheqminer --- .../Miners/ExtraLaunchParametersParser.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs index aabc4bf..ebafb68 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs @@ -69,19 +69,19 @@ static class ExtraLaunchParametersParser { // nheqminer private static List _nheqminer_CPU_Options = new List() { // temperature stuff - new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1"), // default none + new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none }; private static List _nheqminer_CUDA_Options = new List() { // temperature stuff // use always -cv 1 //new MinerOption(MinerOptionType.CUDA_Solver_Version, "-cv", "-cv", "0", MinerOptionFlagType.SingleParam), // default 0 - new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0"), // default 0 - new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0"), // default 0 + new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 }; private static List _nheqminer_AMD_Options = new List() { // temperature stuff - new MinerOption(MinerOptionType.OpenCL_Solver_Version, "-ov", "-ov", "0", MinerOptionFlagType.SingleParam), // default none - new MinerOption(MinerOptionType.OpenCL_Solver_Dev_Thread, "-ot", "-ot", "1"), // default none + new MinerOption(MinerOptionType.OpenCL_Solver_Version, "-ov", "-ov", "0", MinerOptionFlagType.SingleParam, " "), // default none + new MinerOption(MinerOptionType.OpenCL_Solver_Dev_Thread, "-ot", "-ot", "1", MinerOptionFlagType.MultiParam, " "), // default none }; private static bool _showLog = true; @@ -253,6 +253,14 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo // parse for nheqminer if (algorithmType == AlgorithmType.Equihash) { if(deviceType == DeviceType.CPU) { + foreach (var cDev in CDevs) { + // extra thread check + if (cDev.CurrentExtraLaunchParameters.Contains("-t")) { + // nothing + } else { // add threads params mandatory + cDev.CurrentExtraLaunchParameters += " -t " + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); + } + } return Parse(CDevs, _nheqminer_CPU_Options); } if (deviceType == DeviceType.NVIDIA) { From 6c3076438b09d99e9c234e0a189025084c8f9c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 11:33:21 +0100 Subject: [PATCH 086/366] remove Equihash support from ccminer resolves Issue#306 --- NiceHashMiner/Miners/ccminer_sm21.cs | 1 + NiceHashMiner/Miners/ccminer_sm3x.cs | 1 + NiceHashMiner/Miners/ccminer_sm5x.cs | 1 + 3 files changed, 3 insertions(+) diff --git a/NiceHashMiner/Miners/ccminer_sm21.cs b/NiceHashMiner/Miners/ccminer_sm21.cs index 9235e32..9a466a8 100644 --- a/NiceHashMiner/Miners/ccminer_sm21.cs +++ b/NiceHashMiner/Miners/ccminer_sm21.cs @@ -17,6 +17,7 @@ public ccminer_sm21() : base("NVIDIA2.1") protected override void InitSupportedMinerAlgorithms() { var allGroupSupportedList = GroupAlgorithms.GetAlgorithmKeysForGroup(DeviceGroupType.NVIDIA_2_1); allGroupSupportedList.Remove(AlgorithmType.DaggerHashimoto); + allGroupSupportedList.Remove(AlgorithmType.Equihash); _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); } diff --git a/NiceHashMiner/Miners/ccminer_sm3x.cs b/NiceHashMiner/Miners/ccminer_sm3x.cs index 6aa9f2d..5611a24 100644 --- a/NiceHashMiner/Miners/ccminer_sm3x.cs +++ b/NiceHashMiner/Miners/ccminer_sm3x.cs @@ -17,6 +17,7 @@ public ccminer_sm3x() : base("NVIDIA3.x") protected override void InitSupportedMinerAlgorithms() { var allGroupSupportedList = GroupAlgorithms.GetAlgorithmKeysForGroup(DeviceGroupType.NVIDIA_3_x); allGroupSupportedList.Remove(AlgorithmType.DaggerHashimoto); + allGroupSupportedList.Remove(AlgorithmType.Equihash); _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); } diff --git a/NiceHashMiner/Miners/ccminer_sm5x.cs b/NiceHashMiner/Miners/ccminer_sm5x.cs index fdb854d..a4877f5 100644 --- a/NiceHashMiner/Miners/ccminer_sm5x.cs +++ b/NiceHashMiner/Miners/ccminer_sm5x.cs @@ -19,6 +19,7 @@ public ccminer_sm5x(string minerDeviceName = "NVIDIA5.x") : protected override void InitSupportedMinerAlgorithms() { var allGroupSupportedList = GroupAlgorithms.GetAlgorithmKeysForGroup(DeviceGroupType.NVIDIA_5_x); allGroupSupportedList.Remove(AlgorithmType.DaggerHashimoto); + allGroupSupportedList.Remove(AlgorithmType.Equihash); _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); } From b9ee5f24556783efe243619ae274839a804db328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 12:56:07 +0100 Subject: [PATCH 087/366] increase SMACheck interval from 1minute to 5minutes --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 36bdd0b..a3777f1 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -238,7 +238,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) SMACheck = new SystemTimer(); SMACheck.Elapsed += SMACheck_Tick; - SMACheck.Interval = 60 * 1000; // every 60 seconds + SMACheck.Interval = 60 * 1000 * 5; // every 5 minutes SMACheck.Start(); // increase timeout From 497b594f83628e2d11d62fba9177dbdf0d383896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 12:59:29 +0100 Subject: [PATCH 088/366] change update intervals SMA, balance --- NiceHashMiner/Forms/Form_Main.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index a3777f1..eea3f56 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -238,7 +238,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) SMACheck = new SystemTimer(); SMACheck.Elapsed += SMACheck_Tick; - SMACheck.Interval = 60 * 1000 * 5; // every 5 minutes + SMACheck.Interval = 60 * 1000 * 2; // every 2 minutes SMACheck.Start(); // increase timeout @@ -262,7 +262,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) BalanceCheck = new Timer(); BalanceCheck.Tick += BalanceCheck_Tick; - BalanceCheck.Interval = 61 * 1000; // every 61 seconds + BalanceCheck.Interval = 61 * 1000 * 5; // every ~5 minutes BalanceCheck.Start(); BalanceCheck_Tick(null, null); From 8b53775ed70902e6d53fadff811d4a917f7e675b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 14:46:05 +0100 Subject: [PATCH 089/366] handle nheqminer CPU params --- NiceHashMiner/Miners/nheqminer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/nheqminer.cs index 5e717e7..dbc2599 100644 --- a/NiceHashMiner/Miners/nheqminer.cs +++ b/NiceHashMiner/Miners/nheqminer.cs @@ -74,7 +74,7 @@ protected override string GetDevicesCommandString() { string deviceStringCommand = " "; if (CPUs.Count > 0) { - if (CPUs[0].MostProfitableAlgorithm.LessThreads == 0 && string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { + if (CPUs[0].MostProfitableAlgorithm.LessThreads > 0 || string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { // TODO parse deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU); } From 8c6a52d3b75d85d5d10c78f0c4c04d28db46c00b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 15:51:07 +0100 Subject: [PATCH 090/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index b4701c4..54e6338 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.2")] -[assembly: AssemblyFileVersion("1.7.3.2")] +[assembly: AssemblyVersion("1.7.3.3")] +[assembly: AssemblyFileVersion("1.7.3.3")] From 4469af5c929e57c1e91337323134b664aa211cf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 4 Nov 2016 15:53:12 +0100 Subject: [PATCH 091/366] update nheqminer path and dl link --- NiceHashMiner/Miners/MinerPaths.cs | 2 +- NiceHashMiner/Utils/MinersDownloadManager.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Miners/MinerPaths.cs b/NiceHashMiner/Miners/MinerPaths.cs index ad402c6..aa22d35 100644 --- a/NiceHashMiner/Miners/MinerPaths.cs +++ b/NiceHashMiner/Miners/MinerPaths.cs @@ -45,6 +45,6 @@ public static class MinerPaths /// /// nheqminer /// - public const string nheqminer = _bin + @"\nheqminer_v0.4a\nheqminer.exe"; + public const string nheqminer = _bin + @"\nheqminer_v0.4b\nheqminer.exe"; } } diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 96ab794..b3019a5 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -25,8 +25,8 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Fri, 4 Nov 2016 16:17:02 +0100 Subject: [PATCH 092/366] logic check error fix --- NiceHashMiner/Miners/nheqminer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/nheqminer.cs index dbc2599..5b6dee5 100644 --- a/NiceHashMiner/Miners/nheqminer.cs +++ b/NiceHashMiner/Miners/nheqminer.cs @@ -74,7 +74,7 @@ protected override string GetDevicesCommandString() { string deviceStringCommand = " "; if (CPUs.Count > 0) { - if (CPUs[0].MostProfitableAlgorithm.LessThreads > 0 || string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { + if (CPUs[0].MostProfitableAlgorithm.LessThreads > 0 || !string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { // TODO parse deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU); } From 139df26a49cafb1aa57a44da239943225ab31de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 14 Nov 2016 14:27:45 +0100 Subject: [PATCH 093/366] miner paths refactor --- NiceHashMiner/Devices/CPUUtils.cs | 67 ++++++++++ .../Devices/ComputeDeviceQueryManager.cs | 2 +- NiceHashMiner/Miners/Miner.cs | 9 +- NiceHashMiner/Miners/MinerEtherum.cs | 6 +- NiceHashMiner/Miners/MinerPaths.cs | 116 +++++++++++++++++- NiceHashMiner/Miners/MinersManager.cs | 34 +---- NiceHashMiner/Miners/ccminer.cs | 2 +- NiceHashMiner/Miners/ccminer_sm21.cs | 13 +- NiceHashMiner/Miners/ccminer_sm3x.cs | 12 +- NiceHashMiner/Miners/ccminer_sm5x.cs | 24 +--- NiceHashMiner/Miners/ccminer_sm6x.cs | 2 +- NiceHashMiner/Miners/cpuminer.cs | 113 +---------------- NiceHashMiner/Miners/nheqminer.cs | 7 +- NiceHashMiner/Miners/sgminer.cs | 21 +--- NiceHashMiner/NiceHashMiner.csproj | 1 + 15 files changed, 206 insertions(+), 223 deletions(-) create mode 100644 NiceHashMiner/Devices/CPUUtils.cs diff --git a/NiceHashMiner/Devices/CPUUtils.cs b/NiceHashMiner/Devices/CPUUtils.cs new file mode 100644 index 0000000..fcfd2b5 --- /dev/null +++ b/NiceHashMiner/Devices/CPUUtils.cs @@ -0,0 +1,67 @@ +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; +using NiceHashMiner.Miners; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Devices { + public static class CPUUtils { + // this is the order we check and initialize if automatic + private static CPUExtensionType[] _detectOrder = new CPUExtensionType[] { + CPUExtensionType.AVX2_AES, + CPUExtensionType.AVX2, + CPUExtensionType.AVX_AES, + CPUExtensionType.AVX, + CPUExtensionType.AES, + CPUExtensionType.SSE2, + }; + + /// + /// HasExtensionSupport checks CPU extensions support, if type automatic just return false. + /// + /// + /// False if type Automatic otherwise True if supported + private static bool HasExtensionSupport(CPUExtensionType type) { + switch (type) { + case CPUExtensionType.AVX2_AES: return (CPUID.SupportsAVX2() == 1) && (CPUID.SupportsAES() == 1); + case CPUExtensionType.AVX2: return CPUID.SupportsAVX2() == 1; + case CPUExtensionType.AVX_AES: return (CPUID.SupportsAVX() == 1) && (CPUID.SupportsAES() == 1); + case CPUExtensionType.AVX: return CPUID.SupportsAVX() == 1; + case CPUExtensionType.AES: return CPUID.SupportsAES() == 1; + case CPUExtensionType.SSE2: return CPUID.SupportsSSE2() == 1; + default: // CPUExtensionType.Automatic + break; + } + return false; + } + + /// + /// Returns most performant CPU extension based on settings. + /// Returns automatic if NO extension is avaliable + /// + /// + public static CPUExtensionType GetMostOptimized() { + if (ConfigManager.Instance.GeneralConfig.ForceCPUExtension == CPUExtensionType.Automatic) { + for (int i = 0; i < _detectOrder.Length; ++i) { + if (HasExtensionSupport(_detectOrder[i])) { + return _detectOrder[i]; + } + } + } else if (HasExtensionSupport(ConfigManager.Instance.GeneralConfig.ForceCPUExtension)) { + return ConfigManager.Instance.GeneralConfig.ForceCPUExtension; + } + return CPUExtensionType.Automatic; + } + + /// + /// Checks if CPU mining is capable by checking GetMostOptimized is not automatic + /// + /// + public static bool IsCPUMiningCapable() { + return CPUExtensionType.Automatic != GetMostOptimized(); + } + } +} diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index a1e8161..d47b449 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -261,7 +261,7 @@ private void QueryCPUs() { int ThreadsPerCPUMask = ThreadsPerCPU; Globals.ThreadsPerCPU = ThreadsPerCPU; - if (cpuminer.InitializeMinerPaths()) { + if (CPUUtils.IsCPUMiningCapable()) { if (CPUs == 1) { new ComputeDevice(0, "CPU0", CPUID.GetCPUName().Trim(), ThreadsPerCPU, (ulong)0, true); //MinersManager.Instance.AddCpuMiner(new cpuminer(0, ThreadsPerCPU, 0), 0, CPUID.GetCPUName().Trim()); diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 99e0609..b6cdc40 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -47,6 +47,7 @@ public abstract class Miner { public bool IsAPIReadException { get; protected set; } protected List CDevs; public DeviceType DeviceType { get; private set; } + public DeviceGroupType DeviceGroupType { get; private set; } // mining algorithm stuff public AlgorithmType CurrentAlgorithmType { get; protected set; } @@ -121,11 +122,12 @@ protected Algorithm BenchmarkAlgorithm { private bool isEnded = false; - public Miner(DeviceType deviceType, string minerDeviceName) + public Miner(DeviceType deviceType, DeviceGroupType deviceGroupType, string minerDeviceName) { MINER_ID = MINER_ID_COUNT++; CDevs = new List(); DeviceType = deviceType; + DeviceGroupType = deviceGroupType; // Group types are not always important refactoring needed MinerDeviceName = minerDeviceName; //WorkingDirectory = @"bin\dlls"; @@ -197,6 +199,7 @@ public bool IsSupportedMinerAlgorithms(AlgorithmType algorithmType) { protected abstract void InitSupportedMinerAlgorithms(); + // TODO remove somehow /// /// GetOptimizedMinerPath returns optimized miner path based on algorithm type and device codename. /// Device codename is a quickfix for sgminer, other miners don't use it @@ -205,7 +208,9 @@ public bool IsSupportedMinerAlgorithms(AlgorithmType algorithmType) { /// sgminer extra /// sgminer extra /// - abstract public string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename = "", bool isOptimized = true); + protected string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename = "", bool isOptimized = true) { + return MinerPaths.GetOptimizedMinerPath(algorithmType, DeviceType, DeviceGroupType, devCodename, isOptimized); + } public void KillAllUsedMinerProcesses() { List toRemovePidData = new List(); diff --git a/NiceHashMiner/Miners/MinerEtherum.cs b/NiceHashMiner/Miners/MinerEtherum.cs index fabbf2f..b840219 100644 --- a/NiceHashMiner/Miners/MinerEtherum.cs +++ b/NiceHashMiner/Miners/MinerEtherum.cs @@ -25,7 +25,7 @@ public abstract class MinerEtherum : Miner { protected bool IsPaused = false; public MinerEtherum(DeviceType deviceType, string minerDeviceName, string blockString) - : base(deviceType, minerDeviceName) { + : base(deviceType, DeviceGroupType.NONE, minerDeviceName) { Path = Ethereum.EtherMinerPath; _isEthMinerExit = true; CurrentBlockString = blockString; @@ -176,10 +176,6 @@ protected override void _Stop(MinerStopType willswitch) { } } - public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename, bool isOptimized) { - return Ethereum.EtherMinerPath; - } - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { // --api-port const string MASK = "--api-port {0}"; diff --git a/NiceHashMiner/Miners/MinerPaths.cs b/NiceHashMiner/Miners/MinerPaths.cs index aa22d35..e2c9b38 100644 --- a/NiceHashMiner/Miners/MinerPaths.cs +++ b/NiceHashMiner/Miners/MinerPaths.cs @@ -1,4 +1,6 @@ -using System; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using System; using System.Collections.Generic; using System.Text; @@ -46,5 +48,117 @@ public static class MinerPaths /// nheqminer /// public const string nheqminer = _bin + @"\nheqminer_v0.4b\nheqminer.exe"; + + public const string NONE = ""; + + + public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceType deviceType, DeviceGroupType deviceGroupType, string devCodename, bool isOptimized) { + // special cases + // AlgorithmType.DaggerHashimoto special shared case + if (algorithmType == AlgorithmType.DaggerHashimoto + && (deviceType == DeviceType.AMD || deviceType == DeviceType.NVIDIA)) { + return MinerPaths.ethminer; + } + // AlgorithmType.Equihash special shared case + if (algorithmType == AlgorithmType.Equihash) { + // TODO two different miners SM5.0+ and AVX+ + //if (deviceType == DeviceType.ALL) { + //} + return MinerPaths.nheqminer; + } + // normal stuff + // CPU + if (deviceType == DeviceType.CPU) { + return CPU_GROUP.cpu_miner_opt(CPUUtils.GetMostOptimized()); + } + // NVIDIA + if (deviceType == DeviceType.NVIDIA) { + var nvidiaGroup = deviceGroupType; + // sm21 and sm3x have same settings + if (nvidiaGroup == DeviceGroupType.NVIDIA_2_1 || nvidiaGroup == DeviceGroupType.NVIDIA_3_x) { + return NVIDIA_GROUPS.ccminer_sm21_or_sm3x(algorithmType); + } + // sm5x and sm6x have same settings + if (nvidiaGroup == DeviceGroupType.NVIDIA_5_x || nvidiaGroup == DeviceGroupType.NVIDIA_6_x) { + return NVIDIA_GROUPS.ccminer_sm5x_or_sm6x(algorithmType); + } + } + // AMD + if (deviceType == DeviceType.AMD) { + return AMD_GROUP.sgminer_path(algorithmType, devCodename, isOptimized); + } + + return NONE; + } + + ////// private stuff from here on + static class NVIDIA_GROUPS { + public static string ccminer_sm21_or_sm3x(AlgorithmType algorithmType) { + if (AlgorithmType.Decred == algorithmType) { + return MinerPaths.ccminer_decred; + } + if (AlgorithmType.CryptoNight == algorithmType) { + return MinerPaths.ccminer_cryptonight; + } + return MinerPaths.ccminer_tpruvot; + } + + public static string ccminer_sm5x_or_sm6x(AlgorithmType algorithmType) { + if (AlgorithmType.Decred == algorithmType) { + return MinerPaths.ccminer_decred; + } + if (AlgorithmType.NeoScrypt == algorithmType) { + return MinerPaths.ccminer_neoscrypt; + } + if (AlgorithmType.Lyra2RE == algorithmType || AlgorithmType.Lyra2REv2 == algorithmType) { + return MinerPaths.ccminer_nanashi; + } + if (AlgorithmType.CryptoNight == algorithmType) { + return MinerPaths.ccminer_cryptonight; + } + if (AlgorithmType.Lbry == algorithmType) { + return MinerPaths.ccminer_tpruvot; + } + + return MinerPaths.ccminer_sp; + } + } + + static class AMD_GROUP { + public static string sgminer_path(AlgorithmType type, string gpuCodename, bool isOptimized) { + if (isOptimized) { + if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type || AlgorithmType.Qubit == type) { + if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { + if (!Helpers.InternalCheckIsWow64()) + return MinerPaths.sgminer_5_5_0_general; + + return MinerPaths.sgminer_5_4_0_tweaked; + } + if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type) + return MinerPaths.sgminer_5_1_0_optimized; + else + return MinerPaths.sgminer_5_1_1_optimized; + } + } + + return MinerPaths.sgminer_5_5_0_general; + } + } + + static class CPU_GROUP { + public static string cpu_miner_opt(CPUExtensionType type) { + // algorithmType is not needed ATM + // algorithmType: AlgorithmType + if (CPUExtensionType.AVX2_AES == type) { return MinerPaths.cpuminer_opt_AVX2_AES; } + if (CPUExtensionType.AVX2 == type) { return MinerPaths.cpuminer_opt_AVX2; } + if (CPUExtensionType.AVX_AES == type) { return MinerPaths.cpuminer_opt_AVX_AES; } + if (CPUExtensionType.AVX == type) { return MinerPaths.cpuminer_opt_AVX; } + if (CPUExtensionType.AES == type) { return MinerPaths.cpuminer_opt_AES; } + if (CPUExtensionType.SSE2 == type) { return MinerPaths.cpuminer_opt_SSE2; } + + return NONE; // should not happen + } + } + } } diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 3f3d143..1a344cb 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -35,24 +35,6 @@ public partial class MinersManager : BaseLazySingleton { string _workerBtcStringWorker; - readonly DeviceGroupType[] _nvidiaTypes = new DeviceGroupType[] { - DeviceGroupType.NVIDIA_2_1, - DeviceGroupType.NVIDIA_3_x, - DeviceGroupType.NVIDIA_5_x, - DeviceGroupType.NVIDIA_6_x - }; - - readonly DeviceGroupType[] _gpuTypes = new DeviceGroupType[] { - DeviceGroupType.AMD_OpenCL, - DeviceGroupType.NVIDIA_2_1, - DeviceGroupType.NVIDIA_3_x, - DeviceGroupType.NVIDIA_5_x, - DeviceGroupType.NVIDIA_6_x - }; - - // these miners are just used for binary path checking - public readonly Dictionary MinerPathChecker; - // ccminers intensity checking public readonly Dictionary> CCMinersIntensitiesBoundries = new Dictionary>() { { MinerPaths.ccminer_decred, Tuple.Create(8.0, 25.0) }, @@ -95,13 +77,6 @@ protected MinersManager() { _internetCheckTimer = new Timer(); _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; _internetCheckTimer.Interval = 1000 * 30 * 1; // every minute or 5?? // 1000 * 60 * 1 - - // path checker - Helpers.ConsolePrint(TAG, "Creating MinerPathChecker miners"); - MinerPathChecker = new Dictionary(); - foreach (var gpuGroup in _gpuTypes) { - MinerPathChecker.Add(gpuGroup, CreateMiner(gpuGroup, AlgorithmType.NONE)); - } } private void InternetCheckTimer_Tick(object sender, EventArgs e) { @@ -426,10 +401,7 @@ private bool IsAlgorithmSettingsSame(Algorithm a, Algorithm b) { //} private bool IsNvidiaDevice(ComputeDevice a) { - foreach (var type in _nvidiaTypes) { - if (a.DeviceGroupType == type) return true; - } - return false; + return a.DeviceType == DeviceType.NVIDIA; } private bool IsEquihashAndOneCPU(ComputeDevice a, ComputeDevice b) { @@ -466,8 +438,8 @@ private bool IsSameBinPath(ComputeDevice a, ComputeDevice b) { var a_algoType = a.MostProfitableAlgorithm.NiceHashID; var b_algoType = b.MostProfitableAlgorithm.NiceHashID; // a and b algorithm settings should be the same if we call this function - return MinerPathChecker[a.DeviceGroupType].GetOptimizedMinerPath(a_algoType, a.Codename, a.IsOptimizedVersion) - == MinerPathChecker[b.DeviceGroupType].GetOptimizedMinerPath(b_algoType, b.Codename, b.IsOptimizedVersion); + return MinerPaths.GetOptimizedMinerPath(a_algoType, a.DeviceType, a.DeviceGroupType, a.Codename, a.IsOptimizedVersion) + == MinerPaths.GetOptimizedMinerPath(b_algoType, b.DeviceType, b.DeviceGroupType, b.Codename, b.IsOptimizedVersion); } return true; diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index 2fab8f5..b9b0a03 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Miners { abstract public class ccminer : Miner { - public ccminer(string minerDeviceName) : base(DeviceType.NVIDIA, minerDeviceName) { } + public ccminer(DeviceGroupType deviceGroupType, string minerDeviceName) : base(DeviceType.NVIDIA, deviceGroupType, minerDeviceName) { } // cryptonight benchmark exception int _cryptonightTotalCount = 0; diff --git a/NiceHashMiner/Miners/ccminer_sm21.cs b/NiceHashMiner/Miners/ccminer_sm21.cs index 9a466a8..0f9de5b 100644 --- a/NiceHashMiner/Miners/ccminer_sm21.cs +++ b/NiceHashMiner/Miners/ccminer_sm21.cs @@ -9,7 +9,8 @@ namespace NiceHashMiner.Miners { class ccminer_sm21 : ccminer { - public ccminer_sm21() : base("NVIDIA2.1") + public ccminer_sm21() + : base(DeviceGroupType.NVIDIA_2_1, "NVIDIA2.1") { Path = MinerPaths.ccminer_tpruvot; } @@ -20,15 +21,5 @@ protected override void InitSupportedMinerAlgorithms() { allGroupSupportedList.Remove(AlgorithmType.Equihash); _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); } - - public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename, bool isOptimized) { - if (AlgorithmType.Decred == algorithmType) { - return MinerPaths.ccminer_decred; - } - if (AlgorithmType.CryptoNight == algorithmType) { - return MinerPaths.ccminer_cryptonight; - } - return MinerPaths.ccminer_tpruvot; - } } } diff --git a/NiceHashMiner/Miners/ccminer_sm3x.cs b/NiceHashMiner/Miners/ccminer_sm3x.cs index 5611a24..d7bdbba 100644 --- a/NiceHashMiner/Miners/ccminer_sm3x.cs +++ b/NiceHashMiner/Miners/ccminer_sm3x.cs @@ -9,7 +9,7 @@ namespace NiceHashMiner.Miners { class ccminer_sm3x : ccminer { - public ccminer_sm3x() : base("NVIDIA3.x") + public ccminer_sm3x() : base(DeviceGroupType.NVIDIA_3_x, "NVIDIA3.x") { Path = MinerPaths.ccminer_tpruvot; } @@ -20,15 +20,5 @@ protected override void InitSupportedMinerAlgorithms() { allGroupSupportedList.Remove(AlgorithmType.Equihash); _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); } - - public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename, bool isOptimized) { - if (AlgorithmType.Decred == algorithmType) { - return MinerPaths.ccminer_decred; - } - if (AlgorithmType.CryptoNight == algorithmType) { - return MinerPaths.ccminer_cryptonight; - } - return MinerPaths.ccminer_tpruvot; - } } } diff --git a/NiceHashMiner/Miners/ccminer_sm5x.cs b/NiceHashMiner/Miners/ccminer_sm5x.cs index a4877f5..4b5ad13 100644 --- a/NiceHashMiner/Miners/ccminer_sm5x.cs +++ b/NiceHashMiner/Miners/ccminer_sm5x.cs @@ -10,8 +10,8 @@ namespace NiceHashMiner.Miners { class ccminer_sm5x : ccminer { - public ccminer_sm5x(string minerDeviceName = "NVIDIA5.x") : - base(minerDeviceName) + public ccminer_sm5x(DeviceGroupType deviceGroupType = DeviceGroupType.NVIDIA_5_x, string minerDeviceName = "NVIDIA5.x") : + base(deviceGroupType, minerDeviceName) { Path = MinerPaths.ccminer_sp; } @@ -22,25 +22,5 @@ protected override void InitSupportedMinerAlgorithms() { allGroupSupportedList.Remove(AlgorithmType.Equihash); _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); } - - public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename, bool isOptimized) { - if (AlgorithmType.Decred == algorithmType) { - return MinerPaths.ccminer_decred; - } - if (AlgorithmType.NeoScrypt == algorithmType) { - return MinerPaths.ccminer_neoscrypt; - } - if (AlgorithmType.Lyra2RE == algorithmType || AlgorithmType.Lyra2REv2 == algorithmType) { - return MinerPaths.ccminer_nanashi; - } - if (AlgorithmType.CryptoNight == algorithmType) { - return MinerPaths.ccminer_cryptonight; - } - if (AlgorithmType.Lbry == algorithmType) { - return MinerPaths.ccminer_tpruvot; - } - - return MinerPaths.ccminer_sp; - } } } diff --git a/NiceHashMiner/Miners/ccminer_sm6x.cs b/NiceHashMiner/Miners/ccminer_sm6x.cs index 7af0409..fb78f1c 100644 --- a/NiceHashMiner/Miners/ccminer_sm6x.cs +++ b/NiceHashMiner/Miners/ccminer_sm6x.cs @@ -11,7 +11,7 @@ namespace NiceHashMiner.Miners { class ccminer_sm6x : ccminer_sm5x { public ccminer_sm6x() : - base("NVIDIA6.x") + base(DeviceGroupType.NVIDIA_6_x, "NVIDIA6.x") { } } diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index e31cc7d..6b75965 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -13,59 +13,8 @@ public class cpuminer : Miner { //private ulong AffinityMask; public cpuminer() - : base(DeviceType.CPU, "CPU") { - } - - public static CPUExtensionType GetMostOptimized() { - // this is the order we check and initialize if automatic - CPUExtensionType ret = CPUExtensionType.Automatic; - CPUExtensionType[] detectOrder = new CPUExtensionType[] { - CPUExtensionType.AVX2_AES, - CPUExtensionType.AVX2, - CPUExtensionType.AVX_AES, - CPUExtensionType.AVX, - CPUExtensionType.AES, - CPUExtensionType.SSE2, - }; - - if (ConfigManager.Instance.GeneralConfig.ForceCPUExtension == CPUExtensionType.Automatic) { - for (int i = 0; i < detectOrder.Length; ++i) { - if (HasExtensionSupport(detectOrder[i])) { - return detectOrder[i]; - } - } - } else if (HasExtensionSupport(ConfigManager.Instance.GeneralConfig.ForceCPUExtension)) { - return ConfigManager.Instance.GeneralConfig.ForceCPUExtension; - } - - return ret; - } - - public static bool InitializeMinerPaths() { - // this is the order we check and initialize if automatic - CPUExtensionType[] detectOrder = new CPUExtensionType[] { - CPUExtensionType.AVX2_AES, - CPUExtensionType.AVX2, - CPUExtensionType.AVX_AES, - CPUExtensionType.AVX, - CPUExtensionType.AES, - CPUExtensionType.SSE2, - }; - - // #1 try to initialize with Configured extension - bool isInitialized = "" != GetOptimizedMinerPath(ConfigManager.Instance.GeneralConfig.ForceCPUExtension); - // #2 if automatic or does not support then initialize in order - if (isInitialized == false) { - ConfigManager.Instance.GeneralConfig.ForceCPUExtension = CPUExtensionType.Automatic; // set to automatic if not supported - for (int i = 0; i < detectOrder.Length; ++i) { - isInitialized = "" != GetOptimizedMinerPath(detectOrder[i]); - if (isInitialized) { - break; // stop if initialized - } - } - } - return isInitialized; - } + : base(DeviceType.CPU, DeviceGroupType.CPU, "CPU") { + } protected override int GET_MAX_CooldownTimeInMilliseconds() { return 60 * 1000; // 1 minute max, whole waiting time 75seconds @@ -76,62 +25,7 @@ protected override void InitSupportedMinerAlgorithms() { _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); } - /// - /// InitializeMinerPaths initializes cpuminer paths based on CPUExtensionType. - /// Make sure to check if extensions enabled. Currently using CPUID fo checking - /// - /// - /// Returns False if CPUExtensionType.Automatic, otherwise True and initializes paths - public static string GetOptimizedMinerPath(CPUExtensionType type) { - // if type not automatic and has extension support set initialized - if (HasExtensionSupport(type)) { - switch (type) { - case CPUExtensionType.AVX2_AES: - return MinerPaths.cpuminer_opt_AVX2_AES; - case CPUExtensionType.AVX2: - return MinerPaths.cpuminer_opt_AVX2; - case CPUExtensionType.AVX_AES: - return MinerPaths.cpuminer_opt_AVX_AES; - case CPUExtensionType.AVX: - return MinerPaths.cpuminer_opt_AVX; - case CPUExtensionType.AES: - return MinerPaths.cpuminer_opt_AES; - case CPUExtensionType.SSE2: - return MinerPaths.cpuminer_opt_SSE2; - default: // CPUExtensionType.Automatic - break; - } - } - return ""; - } - - public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename = "", bool isOptimized = false) { - return GetOptimizedMinerPath(GetMostOptimized()); - } - - /// - /// HasExtensionSupport checks CPU extensions support, if type automatic just return false. - /// - /// - /// False if type Automatic otherwise True if supported - public static bool HasExtensionSupport(CPUExtensionType type) { - switch (type) { - case CPUExtensionType.AVX2_AES: return (CPUID.SupportsAVX2() == 1) && (CPUID.SupportsAES() == 1); - case CPUExtensionType.AVX2: return CPUID.SupportsAVX2() == 1; - case CPUExtensionType.AVX_AES: return (CPUID.SupportsAVX() == 1) && (CPUID.SupportsAES() == 1); - case CPUExtensionType.AVX: return CPUID.SupportsAVX() == 1; - case CPUExtensionType.AES: return CPUID.SupportsAES() == 1; - case CPUExtensionType.SSE2: return CPUID.SupportsSSE2() == 1; - default: // CPUExtensionType.Automatic - break; - } - return false; - } - public override void Start(Algorithm miningAlgorithm, string url, string username) { - // to set miner paths - InitializeMinerPaths(); - CurrentMiningAlgorithm = miningAlgorithm; if (ProcessHandle != null) return; // ignore, already running @@ -178,9 +72,6 @@ protected override bool UpdateBindPortCommand(int oldPort, int newPort) { #region Decoupled benchmarking routines protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - // to set miner paths - InitializeMinerPaths(); - Path = GetOptimizedMinerPath(algorithm.NiceHashID); return "--algo=" + algorithm.MinerName + diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/nheqminer.cs index 5b6dee5..987d6eb 100644 --- a/NiceHashMiner/Miners/nheqminer.cs +++ b/NiceHashMiner/Miners/nheqminer.cs @@ -36,7 +36,7 @@ private class JsonApiResponse { } public nheqminer() - : base(DeviceType.ALL, "nheqminer") { + : base(DeviceType.ALL, DeviceGroupType.NONE, "nheqminer") { Path = MinerPaths.nheqminer; WorkingDirectory = MinerPaths.nheqminer.Replace("nheqminer.exe", ""); AMD_OCL_PLATFORM = ComputeDeviceQueryManager.Instance.AMDOpenCLPlatformNum; @@ -206,10 +206,5 @@ protected override bool BenchmarkParseLine(string outdata) { protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { CheckOutdata(outdata); } - - // STUBS - public override string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename, bool isOptimized) { - return MinerPaths.nheqminer; - } } } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 104c9db..590b319 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -29,7 +29,7 @@ class sgminer : Miner Stopwatch _benchmarkTimer = new Stopwatch(); public sgminer() - : base(DeviceType.AMD, "AMD_OpenCL") + : base(DeviceType.AMD, DeviceGroupType.AMD_OpenCL, "AMD_OpenCL") { Path = MinerPaths.sgminer_5_5_0_general; EnableOptimizedVersion = true; @@ -122,25 +122,6 @@ protected override bool UpdateBindPortCommand(int oldPort, int newPort) { return false; } - public override string GetOptimizedMinerPath(AlgorithmType type, string gpuCodename, bool isOptimized) { - if (EnableOptimizedVersion) { - if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type || AlgorithmType.Qubit == type) { - if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { - if (!Helpers.InternalCheckIsWow64()) - return MinerPaths.sgminer_5_5_0_general; - - return MinerPaths.sgminer_5_4_0_tweaked; - } - if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type) - return MinerPaths.sgminer_5_1_0_optimized; - else - return MinerPaths.sgminer_5_1_1_optimized; - } - } - - return MinerPaths.sgminer_5_5_0_general; - } - // new decoupled benchmarking routines #region Decoupled benchmarking routines diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index ba06e9a..6479823 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -89,6 +89,7 @@ + From 405ed9d1cba27f8a8f5f3a3bd42d71eaafd9642a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 14 Nov 2016 17:18:18 +0100 Subject: [PATCH 094/366] remove unused, regroup stuff --- NiceHashMiner/Devices/ComputeDevice.cs | 2 - .../Devices/ComputeDeviceGroupManager.cs | 52 ++++++---------- .../Devices/ComputeDeviceQueryManager.cs | 3 +- NiceHashMiner/Enums/DeviceGroupType.cs | 3 +- NiceHashMiner/Enums/DeviceType.cs | 4 +- NiceHashMiner/Forms/Form_Main.cs | 4 +- NiceHashMiner/Miners/Equihash/eqm.cs | 10 +++ .../Miners/{ => Equihash}/nheqminer.cs | 0 .../ExtraLaunchParametersParser.cs | 62 +++++++++---------- .../Miners/{ => Grouping}/MinerOption.cs | 2 +- .../Miners/{ => Grouping}/MinerPaths.cs | 5 ++ NiceHashMiner/Miners/MinersManager.cs | 16 ++--- NiceHashMiner/Miners/{ => ccminer}/ccminer.cs | 0 .../Miners/{ => ccminer}/ccminer_sm21.cs | 0 .../Miners/{ => ccminer}/ccminer_sm3x.cs | 0 .../Miners/{ => ccminer}/ccminer_sm5x.cs | 0 .../Miners/{ => ccminer}/ccminer_sm6x.cs | 0 .../Miners/{ => ethminer}/MinerEtherum.cs | 0 .../Miners/{ => ethminer}/MinerEtherumCUDA.cs | 0 .../Miners/{ => ethminer}/MinerEtherumOCL.cs | 0 NiceHashMiner/NiceHashMiner.csproj | 25 ++++---- 21 files changed, 93 insertions(+), 95 deletions(-) create mode 100644 NiceHashMiner/Miners/Equihash/eqm.cs rename NiceHashMiner/Miners/{ => Equihash}/nheqminer.cs (100%) rename NiceHashMiner/Miners/{ => Grouping}/ExtraLaunchParametersParser.cs (91%) rename NiceHashMiner/Miners/{ => Grouping}/MinerOption.cs (92%) rename NiceHashMiner/Miners/{ => Grouping}/MinerPaths.cs (98%) rename NiceHashMiner/Miners/{ => ccminer}/ccminer.cs (100%) rename NiceHashMiner/Miners/{ => ccminer}/ccminer_sm21.cs (100%) rename NiceHashMiner/Miners/{ => ccminer}/ccminer_sm3x.cs (100%) rename NiceHashMiner/Miners/{ => ccminer}/ccminer_sm5x.cs (100%) rename NiceHashMiner/Miners/{ => ccminer}/ccminer_sm6x.cs (100%) rename NiceHashMiner/Miners/{ => ethminer}/MinerEtherum.cs (100%) rename NiceHashMiner/Miners/{ => ethminer}/MinerEtherumCUDA.cs (100%) rename NiceHashMiner/Miners/{ => ethminer}/MinerEtherumOCL.cs (100%) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index fbacaba..fbda6ed 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -114,8 +114,6 @@ private void InitGlobalsList(bool addToGlobalList) { UniqueAvaliableDevices.Add(this); } } - // add to group manager - ComputeDeviceGroupManager.Instance.AddDevice(this); } } diff --git a/NiceHashMiner/Devices/ComputeDeviceGroupManager.cs b/NiceHashMiner/Devices/ComputeDeviceGroupManager.cs index 2adb5d3..e94d367 100644 --- a/NiceHashMiner/Devices/ComputeDeviceGroupManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceGroupManager.cs @@ -9,47 +9,31 @@ namespace NiceHashMiner.Devices /// ComputeDeviceGroupManager class manages all the avaliable groups. /// For now used only for the settings. /// - public class ComputeDeviceGroupManager : BaseLazySingleton - { - - private Dictionary _groupCount; - - DeviceGroupType[] _gpuGroups = new DeviceGroupType[] { - DeviceGroupType.AMD_OpenCL, - DeviceGroupType.NVIDIA_2_1, - DeviceGroupType.NVIDIA_3_x, - DeviceGroupType.NVIDIA_5_x, - DeviceGroupType.NVIDIA_6_x - }; - - protected ComputeDeviceGroupManager() - : base() { - - _groupCount = new Dictionary(); - for (DeviceGroupType type = 0; type < DeviceGroupType.LAST; ++type) { - _groupCount.Add(type, 0); + public static class ComputeDeviceGroupManager { + public static void DisableCpuGroup() { + foreach (var device in ComputeDevice.AllAvaliableDevices) { + if (device.DeviceType == DeviceType.CPU) { + device.Enabled = false; + } } } - public int GetGroupCount(DeviceGroupType type) { - return _groupCount[type]; - } - - public void AddDevice(ComputeDevice computeDevice) { - _groupCount[computeDevice.DeviceGroupType]++; - } - - public void DisableCpuGroup() { - foreach (var device in ComputeDevice.AllAvaliableDevices) { - if (device.DeviceGroupType == DeviceGroupType.CPU) { - device.Enabled = false; + public static bool ContainsAMD_GPUs { + get { + foreach (var device in ComputeDevice.AllAvaliableDevices) { + if (device.DeviceType == DeviceType.AMD) { + return true; + } } + return false; } } - public bool ContainsGPUs { + + public static bool ContainsGPUs { get { - foreach (var groupType in _gpuGroups) { - if (_groupCount[groupType] > 0) { + foreach (var device in ComputeDevice.AllAvaliableDevices) { + if (device.DeviceType == DeviceType.NVIDIA + || device.DeviceType == DeviceType.AMD) { return true; } } diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs index d47b449..36640d9 100644 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs @@ -509,8 +509,7 @@ private void QueryAMD() { private void UncheckedCPU() { // Auto uncheck CPU if any GPU is found - var cdgm = ComputeDeviceGroupManager.Instance; - if (cdgm.ContainsGPUs) cdgm.DisableCpuGroup(); + if (ComputeDeviceGroupManager.ContainsGPUs) ComputeDeviceGroupManager.DisableCpuGroup(); } #region NEW IMPLEMENTATION diff --git a/NiceHashMiner/Enums/DeviceGroupType.cs b/NiceHashMiner/Enums/DeviceGroupType.cs index 89c89c0..77415f1 100644 --- a/NiceHashMiner/Enums/DeviceGroupType.cs +++ b/NiceHashMiner/Enums/DeviceGroupType.cs @@ -12,7 +12,6 @@ public enum DeviceGroupType : int NVIDIA_2_1, NVIDIA_3_x, NVIDIA_5_x, - NVIDIA_6_x, - LAST + NVIDIA_6_x } } diff --git a/NiceHashMiner/Enums/DeviceType.cs b/NiceHashMiner/Enums/DeviceType.cs index 3331a61..a0f8c41 100644 --- a/NiceHashMiner/Enums/DeviceType.cs +++ b/NiceHashMiner/Enums/DeviceType.cs @@ -9,6 +9,8 @@ public enum DeviceType { CPU, NVIDIA, AMD, - ALL + // combined types used for miner identification only + ALL, + NVIDIA_CPU } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index eea3f56..92bde89 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -224,7 +224,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) SMAMinerCheck = new Timer(); SMAMinerCheck.Tick += SMAMinerCheck_Tick; SMAMinerCheck.Interval = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); - if (ComputeDeviceGroupManager.Instance.GetGroupCount(DeviceGroupType.AMD_OpenCL) > 0) { + if (ComputeDeviceGroupManager.ContainsAMD_GPUs) { SMAMinerCheck.Interval = (ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); } @@ -366,7 +366,7 @@ private void Form_Main_Shown(object sender, EventArgs e) private void SMAMinerCheck_Tick(object sender, EventArgs e) { SMAMinerCheck.Interval = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); - if (ComputeDeviceGroupManager.Instance.GetGroupCount(DeviceGroupType.AMD_OpenCL) > 0) { + if (ComputeDeviceGroupManager.ContainsAMD_GPUs) { SMAMinerCheck.Interval = (ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); } diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs new file mode 100644 index 0000000..cab21f8 --- /dev/null +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners { + class eqm { + } +} diff --git a/NiceHashMiner/Miners/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs similarity index 100% rename from NiceHashMiner/Miners/nheqminer.cs rename to NiceHashMiner/Miners/Equihash/nheqminer.cs diff --git a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs similarity index 91% rename from NiceHashMiner/Miners/ExtraLaunchParametersParser.cs rename to NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs index ebafb68..db5a2f0 100644 --- a/NiceHashMiner/Miners/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs @@ -14,57 +14,57 @@ static class ExtraLaunchParametersParser { // Order of miner options tpyes is important make sure to implement it corectly // ccminer private static List _ccimerOptions = new List() { - new MinerOption(MinerOptionType.Intensity, "-i", "--intensity=", "0") + new MinerOption(MinerOptionType.Intensity, "-i", "--intensity=", "0", MinerOptionFlagType.MultiParam, ",") }; // ccminer CryptoNight private static List _ccimerCryptoNightOptions = new List() { - new MinerOption(MinerOptionType.Ccminer_CryptoNightLaunch, "-l", "--launch=", "8x40"), // default is 8x40 - new MinerOption(MinerOptionType.Ccminer_CryptoNightBfactor, "", "--bfactor=", "0"), - new MinerOption(MinerOptionType.Ccminer_CryptoNightBsleep, "", "--bsleep=", "0") // TODO check default + new MinerOption(MinerOptionType.Ccminer_CryptoNightLaunch, "-l", "--launch=", "8x40", MinerOptionFlagType.MultiParam, ","), // default is 8x40 + new MinerOption(MinerOptionType.Ccminer_CryptoNightBfactor, "", "--bfactor=", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.Ccminer_CryptoNightBsleep, "", "--bsleep=", "0", MinerOptionFlagType.MultiParam, ",") // TODO check default }; // OCL ethminer private static List _oclEthminerOptions = new List() { - new MinerOption(MinerOptionType.Ethminer_OCL_LocalWork, "", "--cl-local-work", "0"), - new MinerOption(MinerOptionType.Ethminer_OCL_GlobalWork, "", "--cl-global-work", "0"), + new MinerOption(MinerOptionType.Ethminer_OCL_LocalWork, "", "--cl-local-work", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.Ethminer_OCL_GlobalWork, "", "--cl-global-work", "0", MinerOptionFlagType.MultiParam, ","), }; // CUDA ethminer private static List _cudaEthminerOptions = new List() { - new MinerOption(MinerOptionType.CudaBlockSize, "", "--cuda-block-size", "0"), - new MinerOption(MinerOptionType.CudaGridSize, "", "--cuda-grid-size", "0"), + new MinerOption(MinerOptionType.CudaBlockSize, "", "--cuda-block-size", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.CudaGridSize, "", "--cuda-grid-size", "0", MinerOptionFlagType.MultiParam, ","), }; // sgminer private static List _sgminerOptions = new List() { // SingleParam - new MinerOption(MinerOptionType.KeccakUnroll, "", "--keccak-unroll", "0", MinerOptionFlagType.SingleParam), - new MinerOption(MinerOptionType.HamsiExpandBig, "", "--hamsi-expand-big", "4", MinerOptionFlagType.SingleParam), - new MinerOption(MinerOptionType.Nfactor, "", "--nfactor", "10", MinerOptionFlagType.SingleParam), + new MinerOption(MinerOptionType.KeccakUnroll, "", "--keccak-unroll", "0", MinerOptionFlagType.SingleParam, ""), + new MinerOption(MinerOptionType.HamsiExpandBig, "", "--hamsi-expand-big", "4", MinerOptionFlagType.SingleParam, ""), + new MinerOption(MinerOptionType.Nfactor, "", "--nfactor", "10", MinerOptionFlagType.SingleParam, ""), // MultiParam TODO IMPORTANT check defaults - new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d"), // default is "d" check if -1 works - new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1"), // default none - new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1"), // default none - new MinerOption(MinerOptionType.ThreadConcurrency, "", "--thread-concurrency", "-1"), // default none - new MinerOption(MinerOptionType.Worksize, "-w", "--worksize", "-1"), // default none - new MinerOption(MinerOptionType.GpuThreads, "-g", "--gpu-threads", "1"), - new MinerOption(MinerOptionType.LookupGap, "", "--lookup-gap", "-1"), // default none + new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d", MinerOptionFlagType.MultiParam, ","), // default is "d" check if -1 works + new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption(MinerOptionType.ThreadConcurrency, "", "--thread-concurrency", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption(MinerOptionType.Worksize, "-w", "--worksize", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption(MinerOptionType.GpuThreads, "-g", "--gpu-threads", "1", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.LookupGap, "", "--lookup-gap", "-1", MinerOptionFlagType.MultiParam, ","), // default none // Uni }; private static List _sgminerTemperatureOptions = new List() { // temperature stuff - new MinerOption(MinerOptionType.GpuFan, "", "--gpu-fan", "30-60"), // default none - new MinerOption(MinerOptionType.TempCutoff, "", "--temp-cutoff", "95"), - new MinerOption(MinerOptionType.TempOverheat, "", "--temp-overheat", "85"), - new MinerOption(MinerOptionType.TempTarget, "", "--temp-target", "75"), - new MinerOption(MinerOptionType.AutoFan, "", "--auto-fan", null, MinerOptionFlagType.Uni), - new MinerOption(MinerOptionType.AutoGpu, "", "--auto-gpu", null, MinerOptionFlagType.Uni) + new MinerOption(MinerOptionType.GpuFan, "", "--gpu-fan", "30-60", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption(MinerOptionType.TempCutoff, "", "--temp-cutoff", "95", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.TempOverheat, "", "--temp-overheat", "85", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.TempTarget, "", "--temp-target", "75", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.AutoFan, "", "--auto-fan", null, MinerOptionFlagType.Uni, ""), + new MinerOption(MinerOptionType.AutoGpu, "", "--auto-gpu", null, MinerOptionFlagType.Uni, "") }; private static List _cpuminerOptions = new List() { // temperature stuff - new MinerOption(MinerOptionType.Threads, "-t", "--threads=", "-1"), // default none - new MinerOption(MinerOptionType.CpuAffinity, "", "--cpu-affinity", "-1"), // default none - new MinerOption(MinerOptionType.CpuPriority, "", "--cpu-priority", "-1"), // default none + new MinerOption(MinerOptionType.Threads, "-t", "--threads=", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption(MinerOptionType.CpuAffinity, "", "--cpu-affinity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption(MinerOptionType.CpuPriority, "", "--cpu-priority", "-1", MinerOptionFlagType.MultiParam, ","), // default none }; // nheqminer private static List _nheqminer_CPU_Options = new List() { @@ -74,7 +74,7 @@ static class ExtraLaunchParametersParser { private static List _nheqminer_CUDA_Options = new List() { // temperature stuff // use always -cv 1 - //new MinerOption(MinerOptionType.CUDA_Solver_Version, "-cv", "-cv", "0", MinerOptionFlagType.SingleParam), // default 0 + new MinerOption(MinerOptionType.CUDA_Solver_Version, "-cv", "-cv", "0", MinerOptionFlagType.SingleParam, " "), // default 0 new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 }; @@ -302,9 +302,9 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo if (algorithmType != AlgorithmType.DaggerHashimoto) { // rawIntensity overrides xintensity, xintensity overrides intensity var sgminer_intensities = new List() { - new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d"), // default is "d" check if -1 works - new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1"), // default none - new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1"), // default none + new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d", MinerOptionFlagType.MultiParam, ","), // default is "d" check if -1 works + new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none }; var contains_intensity = new Dictionary() { { MinerOptionType.Intensity, false }, diff --git a/NiceHashMiner/Miners/MinerOption.cs b/NiceHashMiner/Miners/Grouping/MinerOption.cs similarity index 92% rename from NiceHashMiner/Miners/MinerOption.cs rename to NiceHashMiner/Miners/Grouping/MinerOption.cs index 8d4762f..1933f0c 100644 --- a/NiceHashMiner/Miners/MinerOption.cs +++ b/NiceHashMiner/Miners/Grouping/MinerOption.cs @@ -7,7 +7,7 @@ namespace NiceHashMiner.Miners { public class MinerOption { - public MinerOption(MinerOptionType iType, string iShortName, string iLongName, string iDefault, MinerOptionFlagType iFlagType = MinerOptionFlagType.MultiParam, string iSeparator = ",") { + public MinerOption(MinerOptionType iType, string iShortName, string iLongName, string iDefault, MinerOptionFlagType iFlagType, string iSeparator) { this.Type = iType; this.ShortName = iShortName; this.LongName = iLongName; diff --git a/NiceHashMiner/Miners/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs similarity index 98% rename from NiceHashMiner/Miners/MinerPaths.cs rename to NiceHashMiner/Miners/Grouping/MinerPaths.cs index e2c9b38..6cf9a4b 100644 --- a/NiceHashMiner/Miners/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -49,6 +49,11 @@ public static class MinerPaths /// public const string nheqminer = _bin + @"\nheqminer_v0.4b\nheqminer.exe"; + /// + /// eqm + /// + public const string eqm = _bin + @"\eqm\eqm.exe"; + public const string NONE = ""; diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 1a344cb..7a0787e 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -35,14 +35,14 @@ public partial class MinersManager : BaseLazySingleton { string _workerBtcStringWorker; - // ccminers intensity checking - public readonly Dictionary> CCMinersIntensitiesBoundries = new Dictionary>() { - { MinerPaths.ccminer_decred, Tuple.Create(8.0, 25.0) }, - { MinerPaths.ccminer_nanashi, Tuple.Create(8.0, 25.0) }, - { MinerPaths.ccminer_tpruvot, Tuple.Create(8.0, 25.0) }, - { MinerPaths.ccminer_neoscrypt, Tuple.Create(8.0, 31.0) }, - { MinerPaths.ccminer_sp, Tuple.Create(8.0, 31.0) }, - }; + //// ccminers intensity checking + //public readonly Dictionary> CCMinersIntensitiesBoundries = new Dictionary>() { + // { MinerPaths.ccminer_decred, Tuple.Create(8.0, 25.0) }, + // { MinerPaths.ccminer_nanashi, Tuple.Create(8.0, 25.0) }, + // { MinerPaths.ccminer_tpruvot, Tuple.Create(8.0, 25.0) }, + // { MinerPaths.ccminer_neoscrypt, Tuple.Create(8.0, 31.0) }, + // { MinerPaths.ccminer_sp, Tuple.Create(8.0, 31.0) }, + //}; // GroupDevices hash code doesn't work correctly use string instead //Dictionary _groupedDevicesMiners; diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer/ccminer.cs similarity index 100% rename from NiceHashMiner/Miners/ccminer.cs rename to NiceHashMiner/Miners/ccminer/ccminer.cs diff --git a/NiceHashMiner/Miners/ccminer_sm21.cs b/NiceHashMiner/Miners/ccminer/ccminer_sm21.cs similarity index 100% rename from NiceHashMiner/Miners/ccminer_sm21.cs rename to NiceHashMiner/Miners/ccminer/ccminer_sm21.cs diff --git a/NiceHashMiner/Miners/ccminer_sm3x.cs b/NiceHashMiner/Miners/ccminer/ccminer_sm3x.cs similarity index 100% rename from NiceHashMiner/Miners/ccminer_sm3x.cs rename to NiceHashMiner/Miners/ccminer/ccminer_sm3x.cs diff --git a/NiceHashMiner/Miners/ccminer_sm5x.cs b/NiceHashMiner/Miners/ccminer/ccminer_sm5x.cs similarity index 100% rename from NiceHashMiner/Miners/ccminer_sm5x.cs rename to NiceHashMiner/Miners/ccminer/ccminer_sm5x.cs diff --git a/NiceHashMiner/Miners/ccminer_sm6x.cs b/NiceHashMiner/Miners/ccminer/ccminer_sm6x.cs similarity index 100% rename from NiceHashMiner/Miners/ccminer_sm6x.cs rename to NiceHashMiner/Miners/ccminer/ccminer_sm6x.cs diff --git a/NiceHashMiner/Miners/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs similarity index 100% rename from NiceHashMiner/Miners/MinerEtherum.cs rename to NiceHashMiner/Miners/ethminer/MinerEtherum.cs diff --git a/NiceHashMiner/Miners/MinerEtherumCUDA.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs similarity index 100% rename from NiceHashMiner/Miners/MinerEtherumCUDA.cs rename to NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs diff --git a/NiceHashMiner/Miners/MinerEtherumOCL.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs similarity index 100% rename from NiceHashMiner/Miners/MinerEtherumOCL.cs rename to NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 6479823..4476080 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -180,25 +180,26 @@ - - + + + - - - - - + + + + + - + - - - - + + + + Form From 8ff8a6e69dc397987b1c443f667ca983c19f5770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 14 Nov 2016 21:09:22 +0100 Subject: [PATCH 095/366] code cleanup --- NiceHashMiner/Configs/ConfigManager.cs | 6 +- .../Configs/DeviceBenchmarkConfigManager.cs | 2 +- NiceHashMiner/Configs/GeneralConfig.cs | 4 +- NiceHashMiner/Devices/ComputeDevice.cs | 98 +-- .../Devices/ComputeDeviceGroupManager.cs | 45 -- NiceHashMiner/Devices/ComputeDeviceManager.cs | 754 ++++++++++++++++++ .../Devices/ComputeDeviceQueryManager.cs | 735 ----------------- .../DevicesListViewEnableControl.cs | 4 +- NiceHashMiner/Forms/Form_Benchmark.cs | 14 +- NiceHashMiner/Forms/Form_Main.cs | 18 +- NiceHashMiner/Forms/Form_Settings.cs | 18 +- NiceHashMiner/Miners/Equihash/nheqminer.cs | 2 +- .../Miners/ManagerPrivate/GroupMiners.cs | 4 +- NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/Miners/MinersManager.cs | 14 +- .../Miners/ethminer/MinerEtherumOCL.cs | 2 +- NiceHashMiner/Miners/sgminer.cs | 2 +- NiceHashMiner/NiceHashMiner.csproj | 3 +- NiceHashMiner/Utils/MinersDownloadManager.cs | 50 -- 19 files changed, 811 insertions(+), 966 deletions(-) delete mode 100644 NiceHashMiner/Devices/ComputeDeviceGroupManager.cs create mode 100644 NiceHashMiner/Devices/ComputeDeviceManager.cs delete mode 100644 NiceHashMiner/Devices/ComputeDeviceQueryManager.cs diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index af5bff6..73d28f3 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -74,7 +74,7 @@ public void CommitBenchmarks() { } private void LoadBenchmarks() { - foreach (var CDev in ComputeDevice.AllAvaliableDevices) { + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { // doubly check if not added if (BenchmarkConfigs.ContainsKey(CDev.UUID)) { Helpers.ConsolePrint(TAG, "BUG - LoadBenchmarks() already added for {0}", CDev.UUID); @@ -97,7 +97,7 @@ public void AfterDeviceQueryInitialization() { // check ethminers and remove from settings if no device supports it in config foreach (var config in BenchmarkConfigs) { bool removeDagger = true; - var cDev = ComputeDevice.GetDeviceWithUUID(config.Value.DeviceUUID); + var cDev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(config.Value.DeviceUUID); if (cDev != null) { // if only one dev ing roup supports terminate if (cDev.IsEtherumCapale) { @@ -120,7 +120,7 @@ public void SetDeviceBenchmarkReferences() { DeviceBenchmarkConfigManager.Instance.BenchmarkConfigs = BenchmarkConfigs; BenchmarkConfigs = DeviceBenchmarkConfigManager.Instance.BenchmarkConfigs; // set Benchmarks for devices - foreach (var cdev in ComputeDevice.AllAvaliableDevices) { + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { cdev.SetDeviceBenchmarkConfig(DeviceBenchmarkConfigManager.Instance.GetConfig(cdev.DeviceGroupType, cdev.UUID, cdev.Name)); } } diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs index a753c9a..b1325e8 100644 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs +++ b/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs @@ -50,7 +50,7 @@ public Tuple> > IsEnabledBenchmarks bool isEnabledBenchmarksInitialized = true; // first get all enabled devices names HashSet enabledDevicesNames = new HashSet(); - foreach (var device in ComputeDevice.AllAvaliableDevices) { + foreach (var device in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (device.Enabled) { enabledDevicesNames.Add(device.UUID); } diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index 20c3314..1475410 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -263,7 +263,7 @@ public void AfterDeviceQueryInitialization() { if (_file != null && _file.LastDevicesSettup != null) { foreach (var configDevice in _file.LastDevicesSettup) { - foreach (var usedDevice in ComputeDevice.AllAvaliableDevices) { + foreach (var usedDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (configDevice.UUID == usedDevice.UUID) { usedDevice.Enabled = configDevice.Enabled; continue; @@ -272,7 +272,7 @@ public void AfterDeviceQueryInitialization() { } } - LastDevicesSettup = ComputeDevice.AllAvaliableDevices; + LastDevicesSettup = ComputeDeviceManager.Avaliable.AllAvaliableDevices; } } } diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index fbda6ed..b6f58e9 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -11,9 +11,6 @@ namespace NiceHashMiner.Devices [Serializable] public class ComputeDevice { - //[JsonIgnore] - //readonly public int PlatformId; - [JsonIgnore] readonly public int ID; [JsonIgnore] @@ -79,14 +76,6 @@ public class ComputeDevice [field: NonSerialized] public NiceHashMiner.Forms.Components.DevicesListViewEnableControl.ComputeDeviceEnabledOption ComputeDeviceEnabledOption { get; set; } - // used for ewverythinf - readonly public static List AllAvaliableDevices = new List(); - // used for numbering - readonly public static List UniqueAvaliableDevices = new List(); - - private static int CPUCount = 0; - private static int GPUCount = 0; - [JsonConstructor] public ComputeDevice(int id, string group, string name, string uuid, bool enabled = true) { ID = id; @@ -97,28 +86,8 @@ public ComputeDevice(int id, string group, string name, string uuid, bool enable Enabled = enabled; } - private void InitGlobalsList(bool addToGlobalList) { - if (addToGlobalList) { - // add to all devices - AllAvaliableDevices.Add(this); - // compare new device with unique list scope - { - bool isNewUnique = true; - foreach (var d in UniqueAvaliableDevices) { - if (this.Name == d.Name) { - isNewUnique = false; - break; - } - } - if (isNewUnique) { - UniqueAvaliableDevices.Add(this); - } - } - } - } - // CPU - public ComputeDevice(int id, string group, string name, int threads, ulong affinityMask, bool addToGlobalList = false, bool enabled = true) + public ComputeDevice(int id, string group, string name, int threads, ulong affinityMask, int CPUCount) { ID = id; Group = group; @@ -126,34 +95,32 @@ public ComputeDevice(int id, string group, string name, int threads, ulong affin Threads = threads; AffinityMask = affinityMask; _nameNoNums = name; - Enabled = enabled; + Enabled = true; DeviceGroupType = GroupNames.GetType(Group); DeviceGroupString = GroupNames.GetNameGeneral(DeviceGroupType); DeviceType = DeviceType.CPU; - InitGlobalsList(addToGlobalList); - NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_CPU"), ++CPUCount); + NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_CPU"), CPUCount); UUID = GetUUID(ID, Group, Name, DeviceGroupType); } // GPU NVIDIA - public ComputeDevice(CudaDevice cudaDevice, string group, bool addToGlobalList = false, bool enabled = true) { + public ComputeDevice(CudaDevice cudaDevice, string group, int GPUCount) { _cudaDevice = cudaDevice; ID = (int)cudaDevice.DeviceID; Group = group; Name = cudaDevice.GetName(); _nameNoNums = cudaDevice.GetName(); - Enabled = enabled; + Enabled = true; DeviceGroupType = GroupNames.GetType(Group); DeviceGroupString = GroupNames.GetNameGeneral(DeviceGroupType); IsEtherumCapale = cudaDevice.IsEtherumCapable(); DeviceType = DeviceType.NVIDIA; - InitGlobalsList(addToGlobalList); - NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_NVIDIA_GPU"), ++GPUCount); + NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_NVIDIA_GPU"), GPUCount); UUID = cudaDevice.UUID; } // GPU AMD - public ComputeDevice(AmdGpuDevice amdDevice, bool addToGlobalList = false, bool enabled = true) { + public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount) { _amdDevice = amdDevice; ID = amdDevice.DeviceID; DeviceGroupType = DeviceGroupType.AMD_OpenCL; @@ -161,11 +128,10 @@ public ComputeDevice(AmdGpuDevice amdDevice, bool addToGlobalList = false, bool DeviceGroupString = GroupNames.GetNameGeneral(DeviceGroupType); Name = amdDevice.DeviceName; _nameNoNums = amdDevice.DeviceName; - Enabled = enabled; + Enabled = true; IsEtherumCapale = amdDevice.IsEtherumCapable(); DeviceType = DeviceType.AMD; - InitGlobalsList(addToGlobalList); - NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_AMD_GPU"), ++GPUCount); + NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_AMD_GPU"), GPUCount); UUID = amdDevice.UUID; // sgminer extra IsOptimizedVersion = amdDevice.UseOptimizedVersion; @@ -226,21 +192,7 @@ public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { } // static methods - public static ComputeDevice GetDeviceWithUUID(string uuid) { - foreach (var dev in AllAvaliableDevices) { - if (uuid == dev.UUID) return dev; - } - return null; - } - - public static int GetEnabledDeviceNameCount(string name) { - int count = 0; - foreach (var dev in AllAvaliableDevices) { - if (dev.Enabled && name == dev.Name) ++count; - } - return count; - } - + private static string GetUUID(int id, string group, string name, DeviceGroupType deviceGroupType) { var SHA256 = new SHA256Managed(); var hash = new StringBuilder(); @@ -252,35 +204,5 @@ private static string GetUUID(int id, string group, string name, DeviceGroupType // GEN indicates the UUID has been generated and cannot be presumed to be immutable return "GEN-" + hash.ToString(); } - - public static string GetNameForUUID(string uuid) { - foreach (var dev in AllAvaliableDevices) { - if (uuid == dev.UUID) { - return dev.Name; - } - } - return International.GetText("ComputeDevice_Get_With_UUID_NONE"); - } - - public static List GetSameDevicesTypeAsDeviceWithUUID(string uuid) { - List sameTypes = new List(); - var compareDev = GetDeviceWithUUID(uuid); - foreach (var dev in AllAvaliableDevices) { - if (uuid != dev.UUID && compareDev.DeviceType == dev.DeviceType) { - sameTypes.Add(GetDeviceWithUUID(dev.UUID)); - } - } - return sameTypes; - } - - public static ComputeDevice GetCurrentlySelectedComputeDevice(int index, bool unique) { - //// TODO index checking - //if (unique) { - // return ComputeDevice.UniqueAvaliableDevices[index]; - //} else { - // return ComputeDevice.AllAvaliableDevices[index]; - //} - return ComputeDevice.AllAvaliableDevices[index]; - } } } diff --git a/NiceHashMiner/Devices/ComputeDeviceGroupManager.cs b/NiceHashMiner/Devices/ComputeDeviceGroupManager.cs deleted file mode 100644 index e94d367..0000000 --- a/NiceHashMiner/Devices/ComputeDeviceGroupManager.cs +++ /dev/null @@ -1,45 +0,0 @@ -using NiceHashMiner.Enums; -using System; -using System.Collections.Generic; -using System.Text; - -namespace NiceHashMiner.Devices -{ - /// - /// ComputeDeviceGroupManager class manages all the avaliable groups. - /// For now used only for the settings. - /// - public static class ComputeDeviceGroupManager { - public static void DisableCpuGroup() { - foreach (var device in ComputeDevice.AllAvaliableDevices) { - if (device.DeviceType == DeviceType.CPU) { - device.Enabled = false; - } - } - } - - public static bool ContainsAMD_GPUs { - get { - foreach (var device in ComputeDevice.AllAvaliableDevices) { - if (device.DeviceType == DeviceType.AMD) { - return true; - } - } - return false; - } - } - - public static bool ContainsGPUs { - get { - foreach (var device in ComputeDevice.AllAvaliableDevices) { - if (device.DeviceType == DeviceType.NVIDIA - || device.DeviceType == DeviceType.AMD) { - return true; - } - } - return false; - } - } - - } -} diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs new file mode 100644 index 0000000..52ff100 --- /dev/null +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -0,0 +1,754 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using NiceHashMiner.Configs; +using NiceHashMiner.Interfaces; +using NiceHashMiner.Enums; +using NiceHashMiner.Miners; +using System.Diagnostics; +using Newtonsoft.Json; +using ATI.ADL; +using System.Runtime.InteropServices; +using System.Management; +using System.IO; +using System.Globalization; +using NiceHashMiner.Utils; + +namespace NiceHashMiner.Devices +{ + /// + /// ComputeDeviceManager class is used to query ComputeDevices avaliable on the system. + /// Query CPUs, GPUs [Nvidia, AMD] + /// + public class ComputeDeviceManager + { + public static class Query { + const string TAG = "ComputeDeviceManager.Query"; + + const int AMD_VENDOR_ID = 1002; + const double NVIDIA_RECOMENDED_DRIVER = 372.54; + const double NVIDIA_MIN_DETECTION_DRIVER = 362.61; + static double _currentNvidiaOpenCLDriver = -1; + + // naming purposes + private static int CPUCount = 0; + private static int GPUCount = 0; + + static private double GetNvidiaOpenCLDriver() { + if (OpenCLJSONData != null) { + List nvidiaOCLs = null; + foreach (var oclPlatDevs in OpenCLJSONData) { + if (oclPlatDevs.PlatformName.ToLower().Contains("nvidia")) { + nvidiaOCLs = oclPlatDevs.Devices; + } + } + + if (nvidiaOCLs != null && nvidiaOCLs.Count > 0) { + if (Double.TryParse(nvidiaOCLs[0]._CL_DRIVER_VERSION, + NumberStyles.Any, + CultureInfo.InvariantCulture, + out _currentNvidiaOpenCLDriver)) { + return _currentNvidiaOpenCLDriver; + } + } + } + return -1; + } + + private static void showMessageAndStep(string infoMsg) { + if (MessageNotifier != null) MessageNotifier.SetMessageAndIncrementStep(infoMsg); + } + + public static IMessageNotifier MessageNotifier { get; private set; } + + public static void QueryDevices(IMessageNotifier messageNotifier) { + MessageNotifier = messageNotifier; + // #0 get video controllers, used for cross checking + WindowsDisplayAdapters.QueryVideoControllers(); + // Order important CPU Query must be first + // #1 CPU + CPU.QueryCPUs(); + // #2 CUDA + showMessageAndStep(International.GetText("Compute_Device_Query_Manager_CUDA_Query")); + NVIDIA.QueryCudaDevices(); + // #3 OpenCL + showMessageAndStep(International.GetText("Compute_Device_Query_Manager_OpenCL_Query")); + OpenCL.QueryOpenCLDevices(); + // #4 AMD query AMD from OpenCL devices, get serial and add devices + AMD.QueryAMD(); + // #5 uncheck CPU if GPUs present, call it after we Query all devices + Group.UncheckedCPU(); + + // TODO update this to report undetected hardware + // #6 check NVIDIA, AMD devices count + { + int NVIDIA_count = 0; + int AMD_count = 0; + foreach (var vidCtrl in AvaliableVideoControllers) { + NVIDIA_count += (vidCtrl.Name.ToLower().Contains("nvidia")) ? 1 : 0; + AMD_count += (vidCtrl.Name.ToLower().Contains("amd")) ? 1 : 0; + } + if (NVIDIA_count == CudaDevices.Count) { + Helpers.ConsolePrint(TAG, "Cuda NVIDIA/CUDA device count GOOD"); + } else { + Helpers.ConsolePrint(TAG, "Cuda NVIDIA/CUDA device count BAD!!!"); + } + if (AMD_count == amdGpus.Count) { + Helpers.ConsolePrint(TAG, "AMD GPU device count GOOD"); + } else { + Helpers.ConsolePrint(TAG, "AMD GPU device count BAD!!!"); + } + } + // allerts + _currentNvidiaOpenCLDriver = GetNvidiaOpenCLDriver(); + // if we have nvidia cards but no CUDA devices tell the user to upgrade driver + bool isNvidiaErrorShown = false; // to prevent showing twice + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController() && CudaDevices.Count == 0) { + isNvidiaErrorShown = true; + var minDriver = NVIDIA_MIN_DETECTION_DRIVER.ToString(); + var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); + MessageBox.Show(String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Detection"), + minDriver, recomendDrvier), + International.GetText("Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title"), + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + // recomended driver + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController() && _currentNvidiaOpenCLDriver < NVIDIA_RECOMENDED_DRIVER && !isNvidiaErrorShown && _currentNvidiaOpenCLDriver > -1) { + var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); + var nvdriverString = _currentNvidiaOpenCLDriver > -1 ? String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART"), _currentNvidiaOpenCLDriver.ToString()) + : ""; + MessageBox.Show(String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended"), + recomendDrvier, nvdriverString, recomendDrvier), + International.GetText("Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title"), + MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + // #x remove reference + MessageNotifier = null; + } + + #region Helpers + private class VideoControllerData { + public string Name { get; set; } + public string Description { get; set; } + public string PNPDeviceID { get; set; } + public string DriverVersion { get; set; } + public string Status { get; set; } + } + private static List AvaliableVideoControllers = new List(); + static class WindowsDisplayAdapters { + public static void QueryVideoControllers() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(""); + stringBuilder.AppendLine("QueryVideoControllers: "); + ManagementObjectCollection moc = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController").Get(); + bool allVideoContollersOK = true; + foreach (var manObj in moc) { + var vidController = new VideoControllerData() { + Name = manObj["Name"] as string, + Description = manObj["Description"] as string, + PNPDeviceID = manObj["PNPDeviceID"] as string, + DriverVersion = manObj["DriverVersion"] as string, + Status = manObj["Status"] as string + }; + stringBuilder.AppendLine("\tWin32_VideoController detected:"); + stringBuilder.AppendLine(String.Format("\t\tName {0}", vidController.Name)); + stringBuilder.AppendLine(String.Format("\t\tDescription {0}", vidController.Description)); + stringBuilder.AppendLine(String.Format("\t\tPNPDeviceID {0}", vidController.PNPDeviceID)); + stringBuilder.AppendLine(String.Format("\t\tDriverVersion {0}", vidController.DriverVersion)); + stringBuilder.AppendLine(String.Format("\t\tStatus {0}", vidController.Status)); + + // check if controller ok + if (allVideoContollersOK && !vidController.Status.ToLower().Equals("ok")) { + allVideoContollersOK = false; + } + + AvaliableVideoControllers.Add(vidController); + } + Helpers.ConsolePrint(TAG, stringBuilder.ToString()); + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && !allVideoContollersOK) { + string msg = International.GetText("QueryVideoControllers_NOT_ALL_OK_Msg"); + foreach (var vc in AvaliableVideoControllers) { + if (!vc.Status.ToLower().Equals("ok")) { + msg += Environment.NewLine + + String.Format(International.GetText("QueryVideoControllers_NOT_ALL_OK_Msg_Append"), vc.Name, vc.Status, vc.PNPDeviceID); + } + } + MessageBox.Show(msg, + International.GetText("QueryVideoControllers_NOT_ALL_OK_Title"), + MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + public static bool HasNvidiaVideoController() { + foreach (var vctrl in AvaliableVideoControllers) { + if (vctrl.Name.ToLower().Contains("nvidia")) return true; + } + return false; + } + } + + static class CPU { + public static void QueryCPUs() { + Helpers.ConsolePrint(TAG, "QueryCPUs START"); + // get all CPUs + Avaliable.CPUsCount = CPUID.GetPhysicalProcessorCount(); + + // get all cores (including virtual - HT can benefit mining) + int ThreadsPerCPU = CPUID.GetVirtualCoresCount() / Avaliable.CPUsCount; + + if (!Helpers.InternalCheckIsWow64()) { + MessageBox.Show(International.GetText("Form_Main_msgbox_CPUMining64bitMsg"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.OK, MessageBoxIcon.Warning); + Avaliable.CPUsCount = 0; + } + + if (ThreadsPerCPU * Avaliable.CPUsCount > 64) { + MessageBox.Show(International.GetText("Form_Main_msgbox_CPUMining64CoresMsg"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.OK, MessageBoxIcon.Warning); + Avaliable.CPUsCount = 0; + } + + // TODO important move this to settings + int ThreadsPerCPUMask = ThreadsPerCPU; + Globals.ThreadsPerCPU = ThreadsPerCPU; + + if (CPUUtils.IsCPUMiningCapable()) { + if (Avaliable.CPUsCount == 1) { + Avaliable.AllAvaliableDevices.Add( + new ComputeDevice(0, "CPU0", CPUID.GetCPUName().Trim(), ThreadsPerCPU, (ulong)0, ++CPUCount) + ); + } else { + for (int i = 0; i < Avaliable.CPUsCount; i++) { + Avaliable.AllAvaliableDevices.Add( + new ComputeDevice(0, "CPU" + i, CPUID.GetCPUName().Trim(), ThreadsPerCPU, CPUID.CreateAffinityMask(i, ThreadsPerCPUMask), ++CPUCount) + ); + } + } + } + + Helpers.ConsolePrint(TAG, "QueryCPUs END"); + } + + } + + static List CudaDevices = new List(); + static class NVIDIA { + static string QueryCudaDevicesString = ""; + static private void QueryCudaDevicesOutputErrorDataReceived(object sender, DataReceivedEventArgs e) { + if (e.Data != null) { + QueryCudaDevicesString += e.Data; + } + } + + static private bool IsSMGroupSkip(int sm_major) { + if (sm_major == 6) { + return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X; + } + if (sm_major == 5) { + return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia5X; + } + if (sm_major == 3) { + return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia3X; + } + if (sm_major == 2) { + return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia2X; + } + return false; + } + + static public void QueryCudaDevices() { + Helpers.ConsolePrint(TAG, "QueryCudaDevices START"); + Process CudaDevicesDetection = new Process(); + CudaDevicesDetection.StartInfo.FileName = "CudaDeviceDetection.exe"; + CudaDevicesDetection.StartInfo.UseShellExecute = false; + CudaDevicesDetection.StartInfo.RedirectStandardError = true; + CudaDevicesDetection.StartInfo.RedirectStandardOutput = true; + CudaDevicesDetection.StartInfo.CreateNoWindow = true; + CudaDevicesDetection.OutputDataReceived += QueryCudaDevicesOutputErrorDataReceived; + CudaDevicesDetection.ErrorDataReceived += QueryCudaDevicesOutputErrorDataReceived; + + const int waitTime = 30 * 1000; // 30seconds + try { + if (!CudaDevicesDetection.Start()) { + Helpers.ConsolePrint(TAG, "CudaDevicesDetection process could not start"); + } else { + CudaDevicesDetection.BeginErrorReadLine(); + CudaDevicesDetection.BeginOutputReadLine(); + if (CudaDevicesDetection.WaitForExit(waitTime)) { + CudaDevicesDetection.Close(); + } + } + } catch (Exception ex) { + // TODO + Helpers.ConsolePrint(TAG, "CudaDevicesDetection threw Exception: " + ex.Message); + } finally { + if (QueryCudaDevicesString != "") { + try { + CudaDevices = JsonConvert.DeserializeObject>(QueryCudaDevicesString, Globals.JsonSettings); + } catch { } + } + } + if (CudaDevices != null && CudaDevices.Count != 0) { + Avaliable.HasNVIDIA = true; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(""); + stringBuilder.AppendLine("CudaDevicesDetection:"); + foreach (var cudaDev in CudaDevices) { + // check sm vesrions + bool isUnderSM21; + { + bool isUnderSM2_major = cudaDev.SM_major < 2; + bool isUnderSM1_minor = cudaDev.SM_minor < 1; + isUnderSM21 = isUnderSM2_major && isUnderSM1_minor; + } + //bool isOverSM6 = cudaDev.SM_major > 6; + bool isDisabledGroup = IsSMGroupSkip(cudaDev.SM_major); + bool skip = isUnderSM21 || isDisabledGroup; + string skipOrAdd = skip ? "SKIPED" : "ADDED"; + string isDisabledGroupStr = isDisabledGroup ? " (SM group disabled)" : ""; + string etherumCapableStr = cudaDev.IsEtherumCapable() ? "YES" : "NO"; + stringBuilder.AppendLine(String.Format("\t{0} device{1}:", skipOrAdd, isDisabledGroupStr)); + stringBuilder.AppendLine(String.Format("\t\tID: {0}", cudaDev.DeviceID.ToString())); + stringBuilder.AppendLine(String.Format("\t\tNAME: {0}", cudaDev.GetName())); + stringBuilder.AppendLine(String.Format("\t\tVENDOR: {0}", cudaDev.VendorName)); + stringBuilder.AppendLine(String.Format("\t\tUUID: {0}", cudaDev.UUID)); + stringBuilder.AppendLine(String.Format("\t\tSM: {0}", cudaDev.SMVersionString)); + stringBuilder.AppendLine(String.Format("\t\tMEMORY: {0}", cudaDev.DeviceGlobalMemory.ToString())); + stringBuilder.AppendLine(String.Format("\t\tETHEREUM: {0}", etherumCapableStr)); + + if (!skip) { + string group; + switch (cudaDev.SM_major) { + case 2: + group = GroupNames.GetName(DeviceGroupType.NVIDIA_2_1); + break; + case 3: + group = GroupNames.GetName(DeviceGroupType.NVIDIA_3_x); + break; + case 5: + group = GroupNames.GetName(DeviceGroupType.NVIDIA_5_x); + break; + case 6: + group = GroupNames.GetName(DeviceGroupType.NVIDIA_6_x); + break; + default: + group = GroupNames.GetName(DeviceGroupType.NVIDIA_6_x); + break; + } + Avaliable.AllAvaliableDevices.Add( + new ComputeDevice(cudaDev, group, ++GPUCount) + ); + } + } + Helpers.ConsolePrint(TAG, stringBuilder.ToString()); + } else { + Helpers.ConsolePrint(TAG, "CudaDevicesDetection found no devices. CudaDevicesDetection returned: " + QueryCudaDevicesString); + } + Helpers.ConsolePrint(TAG, "QueryCudaDevices END"); + } + } + + class OpenCLJSONData_t { + public string PlatformName = "NONE"; + public int PlatformNum = 0; + public List Devices = new List(); + } + static List OpenCLJSONData = new List(); + static bool IsOpenCLQuerrySuccess = false; + static class OpenCL { + static string QueryOpenCLDevicesString = ""; + static private void QueryOpenCLDevicesOutputErrorDataReceived(object sender, DataReceivedEventArgs e) { + if (e.Data != null) { + QueryOpenCLDevicesString += e.Data; + } + } + + static public void QueryOpenCLDevices() { + Helpers.ConsolePrint(TAG, "QueryOpenCLDevices START"); + Process OpenCLDevicesDetection = new Process(); + OpenCLDevicesDetection.StartInfo.FileName = "AMDOpenCLDeviceDetection.exe"; + OpenCLDevicesDetection.StartInfo.UseShellExecute = false; + OpenCLDevicesDetection.StartInfo.RedirectStandardError = true; + OpenCLDevicesDetection.StartInfo.RedirectStandardOutput = true; + OpenCLDevicesDetection.StartInfo.CreateNoWindow = true; + OpenCLDevicesDetection.OutputDataReceived += QueryOpenCLDevicesOutputErrorDataReceived; + OpenCLDevicesDetection.ErrorDataReceived += QueryOpenCLDevicesOutputErrorDataReceived; + + const int waitTime = 30 * 1000; // 30seconds + try { + if (!OpenCLDevicesDetection.Start()) { + Helpers.ConsolePrint(TAG, "AMDOpenCLDeviceDetection process could not start"); + } else { + OpenCLDevicesDetection.BeginErrorReadLine(); + OpenCLDevicesDetection.BeginOutputReadLine(); + if (OpenCLDevicesDetection.WaitForExit(waitTime)) { + OpenCLDevicesDetection.Close(); + } + } + } catch (Exception ex) { + // TODO + Helpers.ConsolePrint(TAG, "AMDOpenCLDeviceDetection threw Exception: " + ex.Message); + } finally { + if (QueryOpenCLDevicesString != "") { + try { + OpenCLJSONData = JsonConvert.DeserializeObject>(QueryOpenCLDevicesString, Globals.JsonSettings); + } catch { + OpenCLJSONData = null; + } + } + } + + if (OpenCLJSONData == null) { + Helpers.ConsolePrint(TAG, "AMDOpenCLDeviceDetection found no devices. AMDOpenCLDeviceDetection returned: " + QueryOpenCLDevicesString); + } else { + IsOpenCLQuerrySuccess = true; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(""); + stringBuilder.AppendLine("AMDOpenCLDeviceDetection found devices success:"); + foreach (var oclElem in OpenCLJSONData) { + stringBuilder.AppendLine(String.Format("\tFound devices for platform: {0}", oclElem.PlatformName)); + foreach (var oclDev in oclElem.Devices) { + stringBuilder.AppendLine("\t\tDevice:"); + stringBuilder.AppendLine(String.Format("\t\t\tDevice ID {0}", oclDev.DeviceID)); + stringBuilder.AppendLine(String.Format("\t\t\tDevice NAME {0}", oclDev._CL_DEVICE_NAME)); + stringBuilder.AppendLine(String.Format("\t\t\tDevice TYPE {0}", oclDev._CL_DEVICE_TYPE)); + } + } + Helpers.ConsolePrint(TAG, stringBuilder.ToString()); + } + Helpers.ConsolePrint(TAG, "QueryOpenCLDevices END"); + } + } + + static List amdGpus = new List(); + static class AMD { + static public void QueryAMD() { + Helpers.ConsolePrint(TAG, "QueryAMD START"); + //showMessageAndStep(International.GetText("Form_Main_loadtext_AMD")); + //var dump = new sgminer(true); + + if (ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD) { + Helpers.ConsolePrint(TAG, "Skipping AMD device detection, settings set to disabled"); + showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query_Skip")); + return; + } + + #region AMD driver check, ADL returns 0 + // check the driver version bool EnableOptimizedVersion = true; + Dictionary deviceDriverOld = new Dictionary(); + string minerPath = MinerPaths.sgminer_5_5_0_general; + bool ShowWarningDialog = false; + + foreach (var vidContrllr in AvaliableVideoControllers) { + Helpers.ConsolePrint(TAG, String.Format("Checking AMD device (driver): {0} ({1})", vidContrllr.Name, vidContrllr.DriverVersion)); + + deviceDriverOld[vidContrllr.Name] = false; + // TODO checking radeon drivers only? + if ((vidContrllr.Name.Contains("AMD") || vidContrllr.Name.Contains("Radeon")) && ShowWarningDialog == false) { + Version AMDDriverVersion = new Version(vidContrllr.DriverVersion); + + if (AMDDriverVersion.Major < 15) { + ShowWarningDialog = true; + deviceDriverOld[vidContrllr.Name] = true; + Helpers.ConsolePrint(TAG, "WARNING!!! Old AMD GPU driver detected! All optimized versions disabled, mining " + + "speed will not be optimal. Consider upgrading AMD GPU driver. Recommended AMD GPU driver version is 15.7.1."); + } else if (AMDDriverVersion.Major == 16 && AMDDriverVersion.Minor >= 150) { + if (MinersDownloadManager.Instance.IsMinerBinFolder()) { + // TODO why this copy? + string src = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\" + + minerPath.Split('\\')[0] + "\\" + minerPath.Split('\\')[1] + "\\kernel"; + + foreach (var file in Directory.GetFiles(src)) { + string dest = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Temp\\" + System.IO.Path.GetFileName(file); + if (!File.Exists(dest)) File.Copy(file, dest, false); + } + } + } + } + } + if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && ShowWarningDialog == true) { + Form WarningDialog = new DriverVersionConfirmationDialog(); + WarningDialog.ShowDialog(); + WarningDialog = null; + } + #endregion // AMD driver check + + // get platform version + showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query")); + List amdOCLDevices = new List(); + string AMDOpenCLPlatformStringKey = ""; + if (IsOpenCLQuerrySuccess) { + bool amdPlatformNumFound = false; + foreach (var oclEl in OpenCLJSONData) { + if (oclEl.PlatformName.Contains("AMD") || oclEl.PlatformName.Contains("amd")) { + amdPlatformNumFound = true; + AMDOpenCLPlatformStringKey = oclEl.PlatformName; + Avaliable.AMDOpenCLPlatformNum = oclEl.PlatformNum; + amdOCLDevices = oclEl.Devices; + Helpers.ConsolePrint(TAG, String.Format("AMD platform found: Key: {0}, Num: {1}", + AMDOpenCLPlatformStringKey, + Avaliable.AMDOpenCLPlatformNum.ToString())); + break; + } + } + if (amdPlatformNumFound) { + // get only AMD gpus + { + foreach (var oclDev in amdOCLDevices) { + if (oclDev._CL_DEVICE_TYPE.Contains("GPU")) { + amdGpus.Add(oclDev); + } + } + } + if (amdGpus.Count == 0) { + Helpers.ConsolePrint(TAG, "AMD GPUs count is 0"); + } else { + Helpers.ConsolePrint(TAG, "AMD GPUs count : " + amdGpus.Count.ToString()); + Helpers.ConsolePrint(TAG, "AMD Getting device name and serial from ADL"); + // ADL + bool isAdlInit = true; + // ADL does not get devices in order map devices by bus number + // bus id, + Dictionary> _busIdsInfo = new Dictionary>(); + List _amdDeviceName = new List(); + List _amdDeviceUUID = new List(); + try { + int ADLRet = -1; + int NumberOfAdapters = 0; + if (null != ADL.ADL_Main_Control_Create) + // Second parameter is 1: Get only the present adapters + ADLRet = ADL.ADL_Main_Control_Create(ADL.ADL_Main_Memory_Alloc, 1); + if (ADL.ADL_SUCCESS == ADLRet) { + if (null != ADL.ADL_Adapter_NumberOfAdapters_Get) { + ADL.ADL_Adapter_NumberOfAdapters_Get(ref NumberOfAdapters); + } + Helpers.ConsolePrint(TAG, "Number Of Adapters: " + NumberOfAdapters.ToString()); + + if (0 < NumberOfAdapters) { + // Get OS adpater info from ADL + ADLAdapterInfoArray OSAdapterInfoData; + OSAdapterInfoData = new ADLAdapterInfoArray(); + + if (null != ADL.ADL_Adapter_AdapterInfo_Get) { + IntPtr AdapterBuffer = IntPtr.Zero; + int size = Marshal.SizeOf(OSAdapterInfoData); + AdapterBuffer = Marshal.AllocCoTaskMem((int)size); + Marshal.StructureToPtr(OSAdapterInfoData, AdapterBuffer, false); + + if (null != ADL.ADL_Adapter_AdapterInfo_Get) { + ADLRet = ADL.ADL_Adapter_AdapterInfo_Get(AdapterBuffer, size); + if (ADL.ADL_SUCCESS == ADLRet) { + OSAdapterInfoData = (ADLAdapterInfoArray)Marshal.PtrToStructure(AdapterBuffer, OSAdapterInfoData.GetType()); + int IsActive = 0; + + for (int i = 0; i < NumberOfAdapters; i++) { + // Check if the adapter is active + if (null != ADL.ADL_Adapter_Active_Get) + ADLRet = ADL.ADL_Adapter_Active_Get(OSAdapterInfoData.ADLAdapterInfo[i].AdapterIndex, ref IsActive); + + if (ADL.ADL_SUCCESS == ADLRet) { + // we are looking for amd + // TODO check discrete and integrated GPU separation + var vendorID = OSAdapterInfoData.ADLAdapterInfo[i].VendorID; + var devName = OSAdapterInfoData.ADLAdapterInfo[i].AdapterName; + if (vendorID == AMD_VENDOR_ID + || devName.ToLower().Contains("amd") + || devName.ToLower().Contains("radeon") + || devName.ToLower().Contains("firepro")) { + + string PNPStr = OSAdapterInfoData.ADLAdapterInfo[i].PNPString; + var backSlashLast = PNPStr.LastIndexOf('\\'); + var serial = PNPStr.Substring(backSlashLast, PNPStr.Length - backSlashLast); + var end_0 = serial.IndexOf('&'); + var end_1 = serial.IndexOf('&', end_0 + 1); + // get serial + serial = serial.Substring(end_0 + 1, (end_1 - end_0) - 1); + + var udid = OSAdapterInfoData.ADLAdapterInfo[i].UDID; + var pciVen_id_strSize = 21; // PCI_VEN_XXXX&DEV_XXXX + var uuid = udid.Substring(0, pciVen_id_strSize) + "_" + serial; + int budId = OSAdapterInfoData.ADLAdapterInfo[i].BusNumber; + if (!_amdDeviceUUID.Contains(uuid)) { + try { + Helpers.ConsolePrint(TAG, String.Format("ADL device added BusNumber:{0} NAME:{1} UUID:{2}"), + budId, + devName, + uuid); + } catch { } + + _amdDeviceUUID.Add(uuid); + //_busIds.Add(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber); + _amdDeviceName.Add(devName); + if (!_busIdsInfo.ContainsKey(budId)) { + var nameUuid = new Tuple(devName, uuid); + _busIdsInfo.Add(budId, nameUuid); + } + } + } + } + } + } else { + Helpers.ConsolePrint(TAG, "ADL_Adapter_AdapterInfo_Get() returned error code " + ADLRet.ToString()); + } + } + // Release the memory for the AdapterInfo structure + if (IntPtr.Zero != AdapterBuffer) + Marshal.FreeCoTaskMem(AdapterBuffer); + } + } + if (null != ADL.ADL_Main_Control_Destroy) + ADL.ADL_Main_Control_Destroy(); + } else { + // TODO + Helpers.ConsolePrint(TAG, "ADL_Main_Control_Create() returned error code " + ADLRet.ToString()); + Helpers.ConsolePrint(TAG, "Check if ADL is properly installed!"); + } + } catch (Exception ex) { + Helpers.ConsolePrint(TAG, "AMD ADL exception: " + ex.Message); + isAdlInit = false; + } + if (isAdlInit) { + if (amdGpus.Count == _amdDeviceUUID.Count) { + Helpers.ConsolePrint(TAG, "AMD OpenCL and ADL AMD query COUNTS GOOD/SAME"); + } else { + Helpers.ConsolePrint(TAG, "AMD OpenCL and ADL AMD query COUNTS DIFFERENT/BAD"); + } + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(""); + stringBuilder.AppendLine("QueryAMD devices: "); + for (int i_id = 0; i_id < amdGpus.Count; ++i_id) { + Avaliable.HasAMD = true; + + int busID = amdGpus[i_id].AMD_BUS_ID; + if (busID != -1 && _busIdsInfo.ContainsKey(busID)) { + var deviceName = _busIdsInfo[busID].Item1; + var newAmdDev = new AmdGpuDevice(amdGpus[i_id], deviceDriverOld[deviceName]); + newAmdDev.DeviceName = deviceName; + newAmdDev.UUID = _busIdsInfo[busID].Item2; + bool isDisabledGroup = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; + string skipOrAdd = isDisabledGroup ? "SKIPED" : "ADDED"; + string isDisabledGroupStr = isDisabledGroup ? " (AMD group disabled)" : ""; + string etherumCapableStr = newAmdDev.IsEtherumCapable() ? "YES" : "NO"; + + Avaliable.AllAvaliableDevices.Add( + new ComputeDevice(newAmdDev, ++GPUCount)); + // just in case + try { + stringBuilder.AppendLine(String.Format("\t{0} device{1}:", skipOrAdd, isDisabledGroupStr)); + stringBuilder.AppendLine(String.Format("\t\tID: {0}", newAmdDev.DeviceID.ToString())); + stringBuilder.AppendLine(String.Format("\t\tNAME: {0}", newAmdDev.DeviceName)); + stringBuilder.AppendLine(String.Format("\t\tCODE_NAME: {0}", newAmdDev.Codename)); + stringBuilder.AppendLine(String.Format("\t\tUUID: {0}", newAmdDev.UUID)); + stringBuilder.AppendLine(String.Format("\t\tMEMORY: {0}", newAmdDev.DeviceGlobalMemory.ToString())); + stringBuilder.AppendLine(String.Format("\t\tETHEREUM: {0}", etherumCapableStr)); + } catch { } + } else { + stringBuilder.AppendLine(String.Format("\tDevice not added, Bus No. {0} not found:", busID)); + } + } + Helpers.ConsolePrint(TAG, stringBuilder.ToString()); + } + } + } + } + Helpers.ConsolePrint(TAG, "QueryAMD END"); + } + + } + #endregion Helpers + } + + public static class Avaliable { + public static bool HasNVIDIA = false; + public static bool HasAMD = false; + public static bool HasCPU = false; + public static int CPUsCount = 0; + public static int GPUsCount = 0; + public static int AMDOpenCLPlatformNum = -1; + + public static List AllAvaliableDevices = new List(); + + // methods + public static ComputeDevice GetDeviceWithUUID(string uuid) { + foreach (var dev in AllAvaliableDevices) { + if (uuid == dev.UUID) return dev; + } + return null; + } + + public static int GetEnabledDeviceNameCount(string name) { + int count = 0; + foreach (var dev in AllAvaliableDevices) { + if (dev.Enabled && name == dev.Name) ++count; + } + return count; + } + + public static string GetNameForUUID(string uuid) { + foreach (var dev in AllAvaliableDevices) { + if (uuid == dev.UUID) { + return dev.Name; + } + } + return International.GetText("ComputeDevice_Get_With_UUID_NONE"); + } + + public static List GetSameDevicesTypeAsDeviceWithUUID(string uuid) { + List sameTypes = new List(); + var compareDev = GetDeviceWithUUID(uuid); + foreach (var dev in AllAvaliableDevices) { + if (uuid != dev.UUID && compareDev.DeviceType == dev.DeviceType) { + sameTypes.Add(GetDeviceWithUUID(dev.UUID)); + } + } + return sameTypes; + } + + public static ComputeDevice GetCurrentlySelectedComputeDevice(int index, bool unique) { + return AllAvaliableDevices[index]; + } + } + + public static class Group { + public static void DisableCpuGroup() { + foreach (var device in Avaliable.AllAvaliableDevices) { + if (device.DeviceType == DeviceType.CPU) { + device.Enabled = false; + } + } + } + + public static bool ContainsAMD_GPUs { + get { + foreach (var device in Avaliable.AllAvaliableDevices) { + if (device.DeviceType == DeviceType.AMD) { + return true; + } + } + return false; + } + } + + public static bool ContainsGPUs { + get { + foreach (var device in Avaliable.AllAvaliableDevices) { + if (device.DeviceType == DeviceType.NVIDIA + || device.DeviceType == DeviceType.AMD) { + return true; + } + } + return false; + } + } + public static void UncheckedCPU() { + // Auto uncheck CPU if any GPU is found + if (ContainsGPUs) DisableCpuGroup(); + } + } + + } +} diff --git a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs b/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs deleted file mode 100644 index 36640d9..0000000 --- a/NiceHashMiner/Devices/ComputeDeviceQueryManager.cs +++ /dev/null @@ -1,735 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using NiceHashMiner.Configs; -using NiceHashMiner.Interfaces; -using NiceHashMiner.Enums; -using NiceHashMiner.Miners; -using System.Diagnostics; -using Newtonsoft.Json; -using ATI.ADL; -using System.Runtime.InteropServices; -using System.Management; -using System.IO; -using System.Globalization; -using NiceHashMiner.Utils; - -namespace NiceHashMiner.Devices -{ - /// - /// ComputeDeviceQueryManager class is used to query ComputeDevices avaliable on the system. - /// Query CPUs, GPUs [Nvidia, AMD] - /// - public class ComputeDeviceQueryManager : BaseLazySingleton - { - - const int AMD_VENDOR_ID = 1002; - readonly string TAG; - - const double NVIDIA_RECOMENDED_DRIVER = 372.54; - const double NVIDIA_MIN_DETECTION_DRIVER = 362.61; - double _currentNvidiaOpenCLDriver = -1; - JsonSerializerSettings _jsonSettings = null; - - // for downloading - public bool HasNVIDIA { get; private set; } - public bool HasAMD { get; private set; } - - protected ComputeDeviceQueryManager() { - TAG = this.GetType().Name; - HasNVIDIA = false; - HasAMD = false; - _jsonSettings = new JsonSerializerSettings { - NullValueHandling = NullValueHandling.Ignore, - MissingMemberHandling = MissingMemberHandling.Ignore, - Culture = CultureInfo.InvariantCulture - }; - } - - public int CPUs { get; private set; } - - public int AMDOpenCLPlatformNum { get; private set; } - - public IMessageNotifier MessageNotifier { get; private set; } - - public void QueryDevices(IMessageNotifier messageNotifier) - { - MessageNotifier = messageNotifier; - // #0 get video controllers, used for cross checking - QueryVideoControllers(); - // Order important CPU Query must be first - // #1 CPU - QueryCPUs(); - // #2 CUDA - showMessageAndStep(International.GetText("Compute_Device_Query_Manager_CUDA_Query")); - QueryCudaDevices(); - // #3 OpenCL - showMessageAndStep(International.GetText("Compute_Device_Query_Manager_OpenCL_Query")); - QueryOpenCLDevices(); - // #4 AMD query AMD from OpenCL devices, get serial and add devices - QueryAMD(); - // #5 uncheck CPU if GPUs present, call it after we Query all devices - UncheckedCPU(); - // add numberings to same devices - if (ComputeDevice.AllAvaliableDevices.Count != ComputeDevice.UniqueAvaliableDevices.Count) { - // name count - Dictionary namesCount = new Dictionary(); - // init keys and counters - foreach (var uniqueCdev in ComputeDevice.UniqueAvaliableDevices) { - namesCount.Add(uniqueCdev.Name, 0); - } - // count - foreach (var cDev in ComputeDevice.AllAvaliableDevices) { - namesCount[cDev.Name]++; - } - foreach (var nameCount in namesCount) { - string name = nameCount.Key; - int deviceCount = nameCount.Value; - if (deviceCount > 1) { - int numID = 1; - foreach (var cDev in ComputeDevice.AllAvaliableDevices) { - if (cDev.Name == name) { - cDev.Name = cDev.Name + " #" + numID.ToString(); - ++numID; - } - } - } - } - } - - - // TODO update this to report undetected hardware - // #6 check NVIDIA, AMD devices count - { - int NVIDIA_count = 0; - int AMD_count = 0; - foreach (var vidCtrl in AvaliableVideoControllers) { - NVIDIA_count += (vidCtrl.Name.ToLower().Contains("nvidia")) ? 1 : 0; - AMD_count += (vidCtrl.Name.ToLower().Contains("amd")) ? 1 : 0; - } - if (NVIDIA_count == CudaDevices.Count) { - Helpers.ConsolePrint(TAG, "Cuda NVIDIA/CUDA device count GOOD"); - } else { - Helpers.ConsolePrint(TAG, "Cuda NVIDIA/CUDA device count BAD!!!"); - } - if (AMD_count == amdGpus.Count) { - Helpers.ConsolePrint(TAG, "AMD GPU device count GOOD"); - } else { - Helpers.ConsolePrint(TAG, "AMD GPU device count BAD!!!"); - } - } - // allerts - _currentNvidiaOpenCLDriver = GetNvidiaOpenCLDriver(); - // if we have nvidia cards but no CUDA devices tell the user to upgrade driver - bool isNvidiaErrorShown = false; // to prevent showing twice - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && HasNvidiaVideoController() && CudaDevices.Count == 0) { - isNvidiaErrorShown = true; - var minDriver = NVIDIA_MIN_DETECTION_DRIVER.ToString(); - var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); - MessageBox.Show(String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Detection"), - minDriver, recomendDrvier), - International.GetText("Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title"), - MessageBoxButtons.OK, MessageBoxIcon.Error); - } - // recomended driver - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && HasNvidiaVideoController() && _currentNvidiaOpenCLDriver < NVIDIA_RECOMENDED_DRIVER && !isNvidiaErrorShown && _currentNvidiaOpenCLDriver > -1) { - var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); - var nvdriverString = _currentNvidiaOpenCLDriver > -1 ? String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART"), _currentNvidiaOpenCLDriver.ToString()) - : ""; - MessageBox.Show(String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended"), - recomendDrvier, nvdriverString, recomendDrvier), - International.GetText("Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - - // #x remove reference - MessageNotifier = null; - } - - private Dictionary _ethminerIdsOffet = new Dictionary(); - public int GetEthminerOpenCLID(ComputePlatformType platformType, int id) { - return _ethminerIdsOffet[platformType] + id; - } - - private ComputePlatformType GetPlatformType(string name) { - if (name.Contains("Intel")) { - return ComputePlatformType.Intel; - } - if (name.Contains("AMD")) { - return ComputePlatformType.AMD; - } - if (name.Contains("NVIDIA")) { - return ComputePlatformType.NVIDIA; - } - return ComputePlatformType.NONE; - } - - private void showMessageAndStep(string infoMsg) { - if (MessageNotifier != null) MessageNotifier.SetMessageAndIncrementStep(infoMsg); - } - - #region Video controllers, driver versions - - private class VideoControllerData { - public string Name { get; set; } - public string Description { get; set; } - public string PNPDeviceID { get; set; } - public string DriverVersion { get; set; } - public string Status { get; set; } - } - - private List AvaliableVideoControllers = new List(); - - private void QueryVideoControllers() { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendLine(""); - stringBuilder.AppendLine("QueryVideoControllers: "); - ManagementObjectCollection moc = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController").Get(); - bool allVideoContollersOK = true; - foreach (var manObj in moc) { - var vidController = new VideoControllerData() { - Name = manObj["Name"] as string, - Description = manObj["Description"] as string, - PNPDeviceID = manObj["PNPDeviceID"] as string, - DriverVersion = manObj["DriverVersion"] as string, - Status = manObj["Status"] as string - }; - stringBuilder.AppendLine("\tWin32_VideoController detected:"); - stringBuilder.AppendLine(String.Format("\t\tName {0}", vidController.Name)); - stringBuilder.AppendLine(String.Format("\t\tDescription {0}", vidController.Description)); - stringBuilder.AppendLine(String.Format("\t\tPNPDeviceID {0}", vidController.PNPDeviceID)); - stringBuilder.AppendLine(String.Format("\t\tDriverVersion {0}", vidController.DriverVersion)); - stringBuilder.AppendLine(String.Format("\t\tStatus {0}", vidController.Status)); - - // check if controller ok - if (allVideoContollersOK && !vidController.Status.ToLower().Equals("ok")) { - allVideoContollersOK = false; - } - - AvaliableVideoControllers.Add(vidController); - } - Helpers.ConsolePrint(TAG, stringBuilder.ToString()); - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && !allVideoContollersOK) { - string msg = International.GetText("QueryVideoControllers_NOT_ALL_OK_Msg"); - foreach (var vc in AvaliableVideoControllers) { - if(!vc.Status.ToLower().Equals("ok")) { - msg += Environment.NewLine - + String.Format(International.GetText("QueryVideoControllers_NOT_ALL_OK_Msg_Append"), vc.Name, vc.Status, vc.PNPDeviceID); - } - } - MessageBox.Show(msg, - International.GetText("QueryVideoControllers_NOT_ALL_OK_Title"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - - private bool HasNvidiaVideoController() { - foreach (var vctrl in AvaliableVideoControllers) { - if (vctrl.Name.ToLower().Contains("nvidia")) return true; - } - return false; - } - - #endregion // Video controllers, driver versions - - private void QueryCPUs() { - Helpers.ConsolePrint(TAG, "QueryCPUs START"); - // get all CPUs - CPUs = CPUID.GetPhysicalProcessorCount(); - - // get all cores (including virtual - HT can benefit mining) - int ThreadsPerCPU = CPUID.GetVirtualCoresCount() / CPUs; - - if (!Helpers.InternalCheckIsWow64()) - { - MessageBox.Show(International.GetText("Form_Main_msgbox_CPUMining64bitMsg"), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - CPUs = 0; - } - - if (ThreadsPerCPU * CPUs > 64) - { - MessageBox.Show(International.GetText("Form_Main_msgbox_CPUMining64CoresMsg"), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - CPUs = 0; - } - - // TODO important move this to settings - int ThreadsPerCPUMask = ThreadsPerCPU; - Globals.ThreadsPerCPU = ThreadsPerCPU; - - if (CPUUtils.IsCPUMiningCapable()) { - if (CPUs == 1) { - new ComputeDevice(0, "CPU0", CPUID.GetCPUName().Trim(), ThreadsPerCPU, (ulong)0, true); - //MinersManager.Instance.AddCpuMiner(new cpuminer(0, ThreadsPerCPU, 0), 0, CPUID.GetCPUName().Trim()); - } else { - for (int i = 0; i < CPUs; i++) { - new ComputeDevice(0, "CPU"+i, CPUID.GetCPUName().Trim(), ThreadsPerCPU, CPUID.CreateAffinityMask(i, ThreadsPerCPUMask), true); - } - } - } - - Helpers.ConsolePrint(TAG, "QueryCPUs END"); - } - - List amdGpus = new List(); - private void QueryAMD() { - Helpers.ConsolePrint(TAG, "QueryAMD START"); - //showMessageAndStep(International.GetText("Form_Main_loadtext_AMD")); - //var dump = new sgminer(true); - - if(ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD) { - Helpers.ConsolePrint(TAG, "Skipping AMD device detection, settings set to disabled"); - showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query_Skip")); - return; - } - - #region AMD driver check, ADL returns 0 - // check the driver version bool EnableOptimizedVersion = true; - Dictionary deviceDriverOld = new Dictionary(); - string minerPath = MinerPaths.sgminer_5_5_0_general; - bool ShowWarningDialog = false; - - foreach (var vidContrllr in AvaliableVideoControllers) { - Helpers.ConsolePrint(TAG, String.Format("Checking AMD device (driver): {0} ({1})", vidContrllr.Name, vidContrllr.DriverVersion)); - - deviceDriverOld[vidContrllr.Name] = false; - // TODO checking radeon drivers only? - if ((vidContrllr.Name.Contains("AMD") || vidContrllr.Name.Contains("Radeon")) && ShowWarningDialog == false) { - Version AMDDriverVersion = new Version(vidContrllr.DriverVersion); - - if (AMDDriverVersion.Major < 15) { - ShowWarningDialog = true; - deviceDriverOld[vidContrllr.Name] = true; - Helpers.ConsolePrint(TAG, "WARNING!!! Old AMD GPU driver detected! All optimized versions disabled, mining " + - "speed will not be optimal. Consider upgrading AMD GPU driver. Recommended AMD GPU driver version is 15.7.1."); - } else if (AMDDriverVersion.Major == 16 && AMDDriverVersion.Minor >= 150) { - if (MinersDownloadManager.Instance.IsMinerBinFolder()) { - // TODO why this copy? - string src = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\" + - minerPath.Split('\\')[0] + "\\" + minerPath.Split('\\')[1] + "\\kernel"; - - foreach (var file in Directory.GetFiles(src)) { - string dest = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Temp\\" + System.IO.Path.GetFileName(file); - if (!File.Exists(dest)) File.Copy(file, dest, false); - } - } - } - } - } - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && ShowWarningDialog == true) { - Form WarningDialog = new DriverVersionConfirmationDialog(); - WarningDialog.ShowDialog(); - WarningDialog = null; - } - #endregion // AMD driver check - - // get platform version - showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query")); - List amdOCLDevices = new List(); - string AMDOpenCLPlatformStringKey = ""; - if (IsOpenCLQuerrySuccess) { - bool amdPlatformNumFound = false; - foreach (var oclEl in OpenCLJSONData) { - if (oclEl.PlatformName.Contains("AMD") || oclEl.PlatformName.Contains("amd")) { - amdPlatformNumFound = true; - AMDOpenCLPlatformStringKey = oclEl.PlatformName; - AMDOpenCLPlatformNum = oclEl.PlatformNum; - amdOCLDevices = oclEl.Devices; - Helpers.ConsolePrint(TAG, String.Format("AMD platform found: Key: {0}, Num: {1}", - AMDOpenCLPlatformStringKey, - AMDOpenCLPlatformNum.ToString())); - break; - } - } - if (amdPlatformNumFound) { - // get only AMD gpus - { - foreach (var oclDev in amdOCLDevices) { - if (oclDev._CL_DEVICE_TYPE.Contains("GPU")) { - amdGpus.Add(oclDev); - } - } - } - if (amdGpus.Count == 0) { - Helpers.ConsolePrint(TAG, "AMD GPUs count is 0"); - } else { - Helpers.ConsolePrint(TAG, "AMD GPUs count : " + amdGpus.Count.ToString()); - Helpers.ConsolePrint(TAG, "AMD Getting device name and serial from ADL"); - // ADL - bool isAdlInit = true; - // ADL does not get devices in order map devices by bus number - // bus id, - Dictionary> _busIdsInfo = new Dictionary>(); - List _amdDeviceName = new List(); - List _amdDeviceUUID = new List(); - try { - int ADLRet = -1; - int NumberOfAdapters = 0; - if (null != ADL.ADL_Main_Control_Create) - // Second parameter is 1: Get only the present adapters - ADLRet = ADL.ADL_Main_Control_Create(ADL.ADL_Main_Memory_Alloc, 1); - if (ADL.ADL_SUCCESS == ADLRet) { - if (null != ADL.ADL_Adapter_NumberOfAdapters_Get) { - ADL.ADL_Adapter_NumberOfAdapters_Get(ref NumberOfAdapters); - } - Helpers.ConsolePrint(TAG, "Number Of Adapters: " + NumberOfAdapters.ToString()); - - if (0 < NumberOfAdapters) { - // Get OS adpater info from ADL - ADLAdapterInfoArray OSAdapterInfoData; - OSAdapterInfoData = new ADLAdapterInfoArray(); - - if (null != ADL.ADL_Adapter_AdapterInfo_Get) { - IntPtr AdapterBuffer = IntPtr.Zero; - int size = Marshal.SizeOf(OSAdapterInfoData); - AdapterBuffer = Marshal.AllocCoTaskMem((int)size); - Marshal.StructureToPtr(OSAdapterInfoData, AdapterBuffer, false); - - if (null != ADL.ADL_Adapter_AdapterInfo_Get) { - ADLRet = ADL.ADL_Adapter_AdapterInfo_Get(AdapterBuffer, size); - if (ADL.ADL_SUCCESS == ADLRet) { - OSAdapterInfoData = (ADLAdapterInfoArray)Marshal.PtrToStructure(AdapterBuffer, OSAdapterInfoData.GetType()); - int IsActive = 0; - - for (int i = 0; i < NumberOfAdapters; i++) { - // Check if the adapter is active - if (null != ADL.ADL_Adapter_Active_Get) - ADLRet = ADL.ADL_Adapter_Active_Get(OSAdapterInfoData.ADLAdapterInfo[i].AdapterIndex, ref IsActive); - - if (ADL.ADL_SUCCESS == ADLRet) { - // we are looking for amd - // TODO check discrete and integrated GPU separation - var vendorID = OSAdapterInfoData.ADLAdapterInfo[i].VendorID; - var devName = OSAdapterInfoData.ADLAdapterInfo[i].AdapterName; - if (vendorID == AMD_VENDOR_ID - || devName.ToLower().Contains("amd") - || devName.ToLower().Contains("radeon") - || devName.ToLower().Contains("firepro")) { - - string PNPStr = OSAdapterInfoData.ADLAdapterInfo[i].PNPString; - var backSlashLast = PNPStr.LastIndexOf('\\'); - var serial = PNPStr.Substring(backSlashLast, PNPStr.Length - backSlashLast); - var end_0 = serial.IndexOf('&'); - var end_1 = serial.IndexOf('&', end_0 + 1); - // get serial - serial = serial.Substring(end_0 + 1, (end_1 - end_0) - 1); - - var udid = OSAdapterInfoData.ADLAdapterInfo[i].UDID; - var pciVen_id_strSize = 21; // PCI_VEN_XXXX&DEV_XXXX - var uuid = udid.Substring(0, pciVen_id_strSize) + "_" + serial; - int budId = OSAdapterInfoData.ADLAdapterInfo[i].BusNumber; - if (!_amdDeviceUUID.Contains(uuid)) { - try { - Helpers.ConsolePrint(TAG, String.Format("ADL device added BusNumber:{0} NAME:{1} UUID:{2}"), - budId, - devName, - uuid); - } catch { } - - _amdDeviceUUID.Add(uuid); - //_busIds.Add(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber); - _amdDeviceName.Add(devName); - if (!_busIdsInfo.ContainsKey(budId)) { - var nameUuid = new Tuple(devName, uuid); - _busIdsInfo.Add(budId, nameUuid); - } - } - } - } - } - } else { - Helpers.ConsolePrint(TAG, "ADL_Adapter_AdapterInfo_Get() returned error code " + ADLRet.ToString()); - } - } - // Release the memory for the AdapterInfo structure - if (IntPtr.Zero != AdapterBuffer) - Marshal.FreeCoTaskMem(AdapterBuffer); - } - } - if (null != ADL.ADL_Main_Control_Destroy) - ADL.ADL_Main_Control_Destroy(); - } else { - // TODO - Helpers.ConsolePrint(TAG, "ADL_Main_Control_Create() returned error code " + ADLRet.ToString()); - Helpers.ConsolePrint(TAG, "Check if ADL is properly installed!"); - } - } catch (Exception ex) { - Helpers.ConsolePrint(TAG, "AMD ADL exception: " + ex.Message); - isAdlInit = false; - } - if(isAdlInit) { - if (amdGpus.Count == _amdDeviceUUID.Count) { - Helpers.ConsolePrint(TAG, "AMD OpenCL and ADL AMD query COUNTS GOOD/SAME"); - } else { - Helpers.ConsolePrint(TAG, "AMD OpenCL and ADL AMD query COUNTS DIFFERENT/BAD"); - } - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendLine(""); - stringBuilder.AppendLine("QueryAMD devices: "); - for (int i_id = 0; i_id < amdGpus.Count; ++i_id) { - HasAMD = true; - - int busID = amdGpus[i_id].AMD_BUS_ID; - if (busID != -1 && _busIdsInfo.ContainsKey(busID)) { - var deviceName = _busIdsInfo[busID].Item1; - var newAmdDev = new AmdGpuDevice(amdGpus[i_id], deviceDriverOld[deviceName]); - newAmdDev.DeviceName = deviceName; - newAmdDev.UUID = _busIdsInfo[busID].Item2; - bool isDisabledGroup = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; - string skipOrAdd = isDisabledGroup ? "SKIPED" : "ADDED"; - string isDisabledGroupStr = isDisabledGroup ? " (AMD group disabled)" : ""; - string etherumCapableStr = newAmdDev.IsEtherumCapable() ? "YES" : "NO"; - - new ComputeDevice(newAmdDev, true, true); - // just in case - try { - stringBuilder.AppendLine(String.Format("\t{0} device{1}:", skipOrAdd, isDisabledGroupStr)); - stringBuilder.AppendLine(String.Format("\t\tID: {0}", newAmdDev.DeviceID.ToString())); - stringBuilder.AppendLine(String.Format("\t\tNAME: {0}", newAmdDev.DeviceName)); - stringBuilder.AppendLine(String.Format("\t\tCODE_NAME: {0}", newAmdDev.Codename)); - stringBuilder.AppendLine(String.Format("\t\tUUID: {0}", newAmdDev.UUID)); - stringBuilder.AppendLine(String.Format("\t\tMEMORY: {0}", newAmdDev.DeviceGlobalMemory.ToString())); - stringBuilder.AppendLine(String.Format("\t\tETHEREUM: {0}", etherumCapableStr)); - } catch { } - } else { - stringBuilder.AppendLine(String.Format("\tDevice not added, Bus No. {0} not found:", busID)); - } - } - Helpers.ConsolePrint(TAG, stringBuilder.ToString()); - } - } - } - } - Helpers.ConsolePrint(TAG, "QueryAMD END"); - } - - private void UncheckedCPU() { - // Auto uncheck CPU if any GPU is found - if (ComputeDeviceGroupManager.ContainsGPUs) ComputeDeviceGroupManager.DisableCpuGroup(); - } - - #region NEW IMPLEMENTATION - - #region CUDA, NVIDIA Query - - string QueryCudaDevicesString = ""; - List CudaDevices = new List(); - private void QueryCudaDevicesOutputErrorDataReceived(object sender, DataReceivedEventArgs e) { - if (e.Data != null) { - QueryCudaDevicesString += e.Data; - } - } - - private bool IsSMGroupSkip(int sm_major) { - if (sm_major == 6) { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X; - } - if (sm_major == 5) { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia5X; - } - if (sm_major == 3) { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia3X; - } - if (sm_major == 2) { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia2X; - } - return false; - } - - private void QueryCudaDevices() { - Helpers.ConsolePrint(TAG, "QueryCudaDevices START"); - Process CudaDevicesDetection = new Process(); - CudaDevicesDetection.StartInfo.FileName = "CudaDeviceDetection.exe"; - CudaDevicesDetection.StartInfo.UseShellExecute = false; - CudaDevicesDetection.StartInfo.RedirectStandardError = true; - CudaDevicesDetection.StartInfo.RedirectStandardOutput = true; - CudaDevicesDetection.StartInfo.CreateNoWindow = true; - CudaDevicesDetection.OutputDataReceived += QueryCudaDevicesOutputErrorDataReceived; - CudaDevicesDetection.ErrorDataReceived += QueryCudaDevicesOutputErrorDataReceived; - - const int waitTime = 30 * 1000; // 30seconds - try { - if (!CudaDevicesDetection.Start()) { - Helpers.ConsolePrint(TAG, "CudaDevicesDetection process could not start"); - } else { - CudaDevicesDetection.BeginErrorReadLine(); - CudaDevicesDetection.BeginOutputReadLine(); - if (CudaDevicesDetection.WaitForExit(waitTime)) { - CudaDevicesDetection.Close(); - } - } - } catch (Exception ex) { - // TODO - Helpers.ConsolePrint(TAG, "CudaDevicesDetection threw Exception: " + ex.Message); - } finally { - if (QueryCudaDevicesString != "") { - try { - CudaDevices = JsonConvert.DeserializeObject>(QueryCudaDevicesString, Globals.JsonSettings); - } catch { } - } - } - if (CudaDevices != null && CudaDevices.Count != 0) { - HasNVIDIA = true; - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendLine(""); - stringBuilder.AppendLine("CudaDevicesDetection:"); - foreach (var cudaDev in CudaDevices) { - // check sm vesrions - bool isUnderSM21; - { - bool isUnderSM2_major = cudaDev.SM_major < 2; - bool isUnderSM1_minor = cudaDev.SM_minor < 1; - isUnderSM21 = isUnderSM2_major && isUnderSM1_minor; - } - //bool isOverSM6 = cudaDev.SM_major > 6; - bool isDisabledGroup = IsSMGroupSkip(cudaDev.SM_major); - bool skip = isUnderSM21 || isDisabledGroup; - string skipOrAdd = skip ? "SKIPED" : "ADDED"; - string isDisabledGroupStr = isDisabledGroup ? " (SM group disabled)" : ""; - string etherumCapableStr = cudaDev.IsEtherumCapable() ? "YES" : "NO"; - stringBuilder.AppendLine(String.Format("\t{0} device{1}:", skipOrAdd, isDisabledGroupStr)); - stringBuilder.AppendLine(String.Format("\t\tID: {0}", cudaDev.DeviceID.ToString())); - stringBuilder.AppendLine(String.Format("\t\tNAME: {0}", cudaDev.GetName())); - stringBuilder.AppendLine(String.Format("\t\tVENDOR: {0}", cudaDev.VendorName)); - stringBuilder.AppendLine(String.Format("\t\tUUID: {0}", cudaDev.UUID)); - stringBuilder.AppendLine(String.Format("\t\tSM: {0}", cudaDev.SMVersionString)); - stringBuilder.AppendLine(String.Format("\t\tMEMORY: {0}", cudaDev.DeviceGlobalMemory.ToString())); - stringBuilder.AppendLine(String.Format("\t\tETHEREUM: {0}", etherumCapableStr)); - - if (!skip) { - string group; - switch (cudaDev.SM_major) { - case 2: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_2_1); - break; - case 3: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_3_x); - break; - case 5: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_5_x); - break; - case 6: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_6_x); - break; - default: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_6_x); - break; - } - new ComputeDevice(cudaDev, group, true); - } - } - Helpers.ConsolePrint(TAG, stringBuilder.ToString()); - } else { - Helpers.ConsolePrint(TAG, "CudaDevicesDetection found no devices. CudaDevicesDetection returned: " + QueryCudaDevicesString); - } - Helpers.ConsolePrint(TAG, "QueryCudaDevices END"); - } - - #endregion // CUDA, NVIDIA Query - - - #region OpenCL Query - - private double GetNvidiaOpenCLDriver() { - if (OpenCLJSONData != null) { - List nvidiaOCLs = null; - foreach (var oclPlatDevs in OpenCLJSONData) { - if (oclPlatDevs.PlatformName.ToLower().Contains("nvidia")) { - nvidiaOCLs = oclPlatDevs.Devices; - } - } - - if (nvidiaOCLs != null && nvidiaOCLs.Count > 0) { - if (Double.TryParse(nvidiaOCLs[0]._CL_DRIVER_VERSION, - NumberStyles.Any, - CultureInfo.InvariantCulture, - out _currentNvidiaOpenCLDriver)) { - return _currentNvidiaOpenCLDriver; - } - } - } - - return -1; - } - - class OpenCLJSONData_t { - public string PlatformName = "NONE"; - public int PlatformNum = 0; - public List Devices = new List(); - } - string QueryOpenCLDevicesString = ""; - List OpenCLJSONData = new List(); - bool IsOpenCLQuerrySuccess = false; - private void QueryOpenCLDevicesOutputErrorDataReceived(object sender, DataReceivedEventArgs e) { - if (e.Data != null) { - QueryOpenCLDevicesString += e.Data; - } - } - - private void QueryOpenCLDevices() { - Helpers.ConsolePrint(TAG, "QueryOpenCLDevices START"); - Process OpenCLDevicesDetection = new Process(); - OpenCLDevicesDetection.StartInfo.FileName = "AMDOpenCLDeviceDetection.exe"; - OpenCLDevicesDetection.StartInfo.UseShellExecute = false; - OpenCLDevicesDetection.StartInfo.RedirectStandardError = true; - OpenCLDevicesDetection.StartInfo.RedirectStandardOutput = true; - OpenCLDevicesDetection.StartInfo.CreateNoWindow = true; - OpenCLDevicesDetection.OutputDataReceived += QueryOpenCLDevicesOutputErrorDataReceived; - OpenCLDevicesDetection.ErrorDataReceived += QueryOpenCLDevicesOutputErrorDataReceived; - - const int waitTime = 30 * 1000; // 30seconds - try { - if (!OpenCLDevicesDetection.Start()) { - Helpers.ConsolePrint(TAG, "AMDOpenCLDeviceDetection process could not start"); - } else { - OpenCLDevicesDetection.BeginErrorReadLine(); - OpenCLDevicesDetection.BeginOutputReadLine(); - if (OpenCLDevicesDetection.WaitForExit(waitTime)) { - OpenCLDevicesDetection.Close(); - } - } - } catch(Exception ex) { - // TODO - Helpers.ConsolePrint(TAG, "AMDOpenCLDeviceDetection threw Exception: " + ex.Message); - } finally { - if (QueryOpenCLDevicesString != "") { - try { - OpenCLJSONData = JsonConvert.DeserializeObject>(QueryOpenCLDevicesString, Globals.JsonSettings); - } catch { - OpenCLJSONData = null; - } - } - } - - if (OpenCLJSONData == null) { - Helpers.ConsolePrint(TAG, "AMDOpenCLDeviceDetection found no devices. AMDOpenCLDeviceDetection returned: " + QueryOpenCLDevicesString); - } else { - IsOpenCLQuerrySuccess = true; - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendLine(""); - stringBuilder.AppendLine("AMDOpenCLDeviceDetection found devices success:"); - foreach (var oclElem in OpenCLJSONData) { - stringBuilder.AppendLine(String.Format("\tFound devices for platform: {0}", oclElem.PlatformName)); - foreach (var oclDev in oclElem.Devices) { - stringBuilder.AppendLine("\t\tDevice:"); - stringBuilder.AppendLine(String.Format("\t\t\tDevice ID {0}", oclDev.DeviceID)); - stringBuilder.AppendLine(String.Format("\t\t\tDevice NAME {0}", oclDev._CL_DEVICE_NAME)); - stringBuilder.AppendLine(String.Format("\t\t\tDevice TYPE {0}", oclDev._CL_DEVICE_TYPE)); - } - } - Helpers.ConsolePrint(TAG, stringBuilder.ToString()); - } - Helpers.ConsolePrint(TAG, "QueryOpenCLDevices END"); - } - - #endregion OpenCL Query - - - #endregion // NEW IMPLEMENTATION - - } -} diff --git a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs index 5a98cad..e5c4a7a 100644 --- a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs +++ b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs @@ -206,7 +206,7 @@ private void listViewDevices_MouseClick(object sender, MouseEventArgs e) { // contextMenuStrip1.Items.Add(disableItem); //} if (IsSettingsCopyEnabled) { - var sameDevTypes = ComputeDevice.GetSameDevicesTypeAsDeviceWithUUID(G.CDevice.UUID); + var sameDevTypes = ComputeDeviceManager.Avaliable.GetSameDevicesTypeAsDeviceWithUUID(G.CDevice.UUID); if (sameDevTypes.Count > 0) { var copyBenchItem = new ToolStripMenuItem(); //copyBenchItem.DropDownItems @@ -251,7 +251,7 @@ private void toolStripMenuItemCopySettings_Click(object sender, EventArgs e) { if(item != null) { var uuid = item.Tag as string; if (uuid != null) { - var copyBenchCDev = ComputeDevice.GetDeviceWithUUID(uuid); + var copyBenchCDev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid); G.CDevice.BenchmarkCopyUUID = uuid; var result = MessageBox.Show( diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index e9fb9ba..0a7fa5d 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -108,7 +108,7 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm devicesListViewEnableControl1.SetIListItemCheckColorSetter(this); //devicesListViewEnableControl1.SetAllEnabled = true; //devicesListViewEnableControl1.SaveToGeneralConfig = true; - devicesListViewEnableControl1.SetComputeDevices(ComputeDevice.AllAvaliableDevices); + devicesListViewEnableControl1.SetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); // use this to track miner benchmark statuses _benchmarkMiners = new List(); @@ -152,8 +152,8 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm // set first device selected { - if (ComputeDevice.AllAvaliableDevices.Count > 0) { - var firstComputedevice = ComputeDevice.AllAvaliableDevices[0]; + if (ComputeDeviceManager.Avaliable.AllAvaliableDevices.Count > 0) { + var firstComputedevice = ComputeDeviceManager.Avaliable.AllAvaliableDevices[0]; algorithmsListView1.SetAlgorithms(firstComputedevice, firstComputedevice.ComputeDeviceEnabledOption.IsEnabled); } @@ -168,7 +168,7 @@ private void CopyBenchmarks() { foreach (var GdevSetting in devicesListViewEnableControl1.Options) { // check if copy if (!GdevSetting.IsEnabled && GdevSetting.CDevice.BenchmarkCopyUUID != null) { - var copyCdevSettings = ComputeDevice.GetDeviceWithUUID(GdevSetting.CDevice.BenchmarkCopyUUID); + var copyCdevSettings = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(GdevSetting.CDevice.BenchmarkCopyUUID); if (copyCdevSettings != null) { Helpers.ConsolePrint("CopyBenchmarks", String.Format("Copy from {0} to {1}", GdevSetting.CDevice.UUID, GdevSetting.CDevice.BenchmarkCopyUUID)); GdevSetting.CDevice.CopyBenchmarkSettingsFrom(copyCdevSettings); @@ -564,7 +564,7 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e } // disable all pending benchmark - foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings.Values) { algorithm.ClearBenchmarkPending(); } @@ -573,7 +573,7 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e // save already benchmarked algorithms ConfigManager.Instance.CommitBenchmarks(); // check devices without benchmarks - foreach (var cdev in ComputeDevice.AllAvaliableDevices) { + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cdev.ComputeDeviceEnabledOption.IsEnabled) { bool Enabled = false; foreach (var algo in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { @@ -592,7 +592,7 @@ private void devicesListView1_ItemSelectionChanged(object sender, ListViewItemSe //algorithmSettingsControl1.Deselect(); // show algorithms - var _selectedComputeDevice = ComputeDevice.GetCurrentlySelectedComputeDevice(e.ItemIndex, true); + var _selectedComputeDevice = ComputeDeviceManager.Avaliable.GetCurrentlySelectedComputeDevice(e.ItemIndex, true); algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 92bde89..e6d5df5 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -132,7 +132,7 @@ private void InitMainConfigGUIData() { toolStripStatusLabelBalanceDollarValue.Text = "(" + ConfigManager.Instance.GeneralConfig.DisplayCurrency + ")"; if (_isDeviceDetectionInitialized) { - devicesListViewEnableControl1.ResetComputeDevices(ComputeDevice.AllAvaliableDevices); + devicesListViewEnableControl1.ResetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); } } @@ -201,7 +201,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) } // Query Avaliable ComputeDevices - ComputeDeviceQueryManager.Instance.QueryDevices(LoadingScreen); + ComputeDeviceManager.Query.QueryDevices(LoadingScreen); _isDeviceDetectionInitialized = true; ///////////////////////////////////////////// @@ -210,7 +210,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SaveConfig")); // All devices settup should be initialized in AllDevices - devicesListViewEnableControl1.ResetComputeDevices(ComputeDevice.AllAvaliableDevices); + devicesListViewEnableControl1.ResetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); // set properties after devicesListViewEnableControl1.AutoSaveChange = true; devicesListViewEnableControl1.SaveToGeneralConfig = true; @@ -224,7 +224,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) SMAMinerCheck = new Timer(); SMAMinerCheck.Tick += SMAMinerCheck_Tick; SMAMinerCheck.Interval = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); - if (ComputeDeviceGroupManager.ContainsAMD_GPUs) { + if (ComputeDeviceManager.Group.ContainsAMD_GPUs) { SMAMinerCheck.Interval = (ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); } @@ -366,7 +366,7 @@ private void Form_Main_Shown(object sender, EventArgs e) private void SMAMinerCheck_Tick(object sender, EventArgs e) { SMAMinerCheck.Interval = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); - if (ComputeDeviceGroupManager.ContainsAMD_GPUs) { + if (ComputeDeviceManager.Group.ContainsAMD_GPUs) { SMAMinerCheck.Interval = (ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); } @@ -384,7 +384,7 @@ private void MinerStatsCheck_Tick(object sender, EventArgs e) { private void InitFlowPanelStart() { flowLayoutPanelRates.Controls.Clear(); // add for every cdev a - foreach (var cdev in ComputeDevice.AllAvaliableDevices) { + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if(cdev.Enabled) { var newGroupProfitControl = new GroupProfitControl(); newGroupProfitControl.Visible = false; @@ -723,7 +723,7 @@ private void buttonStartMining_Click(object sender, EventArgs e) if (result == System.Windows.Forms.DialogResult.Yes) { List enabledDevices = new List(); HashSet deviceNames = new HashSet(); - foreach (var cdev in ComputeDevice.AllAvaliableDevices) { + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cdev.Enabled && !deviceNames.Contains(cdev.Name)) { deviceNames.Add(cdev.Name); enabledDevices.Add(cdev); @@ -738,7 +738,7 @@ private void buttonStartMining_Click(object sender, EventArgs e) InitMainConfigGUIData(); } else if (result == System.Windows.Forms.DialogResult.No) { // check devices without benchmarks - foreach (var cdev in ComputeDevice.AllAvaliableDevices) { + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { bool Enabled = false; foreach (var algo in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { if (algo.Value.BenchmarkSpeed > 0) { @@ -756,7 +756,7 @@ private void buttonStartMining_Click(object sender, EventArgs e) // check if any device enabled // check devices without benchmarks bool noDeviceEnabled = true; - foreach (var cdev in ComputeDevice.AllAvaliableDevices) { + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cdev.ComputeDeviceEnabledOption.IsEnabled) { noDeviceEnabled = false; break; diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index bdd503d..57b3ed5 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -67,8 +67,8 @@ public Form_Settings() { // set first device selected { - if (ComputeDevice.AllAvaliableDevices.Count > 0) { - _selectedComputeDevice = ComputeDevice.AllAvaliableDevices[0]; + if (ComputeDeviceManager.Avaliable.AllAvaliableDevices.Count > 0) { + _selectedComputeDevice = ComputeDeviceManager.Avaliable.AllAvaliableDevices[0]; algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); } @@ -414,7 +414,7 @@ private void InitializeGeneralTabFieldValuesReferences() { benchmarkLimitControlAMD.TimeLimits = ConfigManager.Instance.GeneralConfig.BenchmarkTimeLimits.AMD; // here we want all devices - devicesListViewEnableControl1.SetComputeDevices(ComputeDevice.AllAvaliableDevices); + devicesListViewEnableControl1.SetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); devicesListViewEnableControl1.AutoSaveChange = false; devicesListViewEnableControl1.SetAlgorithmsListView(algorithmsListView1); devicesListViewEnableControl1.IsSettingsCopyEnabled = true; @@ -528,7 +528,7 @@ private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, Ev // indicate there has been a change IsChange = true; ConfigManager.Instance.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; - foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { var thisListDev = new List() { cDev }; if (cDev.DeviceType == DeviceType.AMD) { foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { @@ -551,7 +551,7 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, IsChange = true; ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; if (ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations) { - foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { var thisListDev = new List() { cDev }; foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { algorithm.Value.ExtraLaunchParameters = ""; @@ -565,7 +565,7 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, } } } else { - foreach (var cDev in ComputeDevice.AllAvaliableDevices) { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults var thisListDev = new List() { cDev }; var deviceDefaults = GroupAlgorithms.CreateDefaultsForGroup(cDev.DeviceGroupType); @@ -656,7 +656,7 @@ private void devicesListView1_ItemSelectionChanged(object sender, ListViewItemSe algorithmSettingsControl1.Deselect(); // show algorithms - _selectedComputeDevice = ComputeDevice.GetCurrentlySelectedComputeDevice(e.ItemIndex, ShowUniqueDeviceList); + _selectedComputeDevice = ComputeDeviceManager.Avaliable.GetCurrentlySelectedComputeDevice(e.ItemIndex, ShowUniqueDeviceList); algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); } @@ -682,7 +682,7 @@ private void buttonAllProfit_Click(object sender, EventArgs e) { var url = Links.NHM_Profit_Check + "CUSTOM"; Dictionary total = new Dictionary(); - foreach (var curCDev in ComputeDevice.AllAvaliableDevices) { + foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { foreach (var algorithm in curCDev.DeviceBenchmarkConfig.AlgorithmSettings.Values) { if (total.ContainsKey(algorithm.NiceHashID)) { total[algorithm.NiceHashID] += algorithm.BenchmarkSpeed; @@ -783,7 +783,7 @@ private void currencyConverterCombobox_SelectedIndexChanged(object sender, Event private void tabControlGeneral_Selected(object sender, TabControlEventArgs e) { // set first device selected { - if (ComputeDevice.AllAvaliableDevices.Count > 0) { + if (ComputeDeviceManager.Avaliable.AllAvaliableDevices.Count > 0) { algorithmSettingsControl1.Deselect(); //_selectedComputeDevice = ComputeDevice.AllAvaliableDevices[0]; //algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); diff --git a/NiceHashMiner/Miners/Equihash/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs index 987d6eb..fdd9dc3 100644 --- a/NiceHashMiner/Miners/Equihash/nheqminer.cs +++ b/NiceHashMiner/Miners/Equihash/nheqminer.cs @@ -39,7 +39,7 @@ public nheqminer() : base(DeviceType.ALL, DeviceGroupType.NONE, "nheqminer") { Path = MinerPaths.nheqminer; WorkingDirectory = MinerPaths.nheqminer.Replace("nheqminer.exe", ""); - AMD_OCL_PLATFORM = ComputeDeviceQueryManager.Instance.AMDOpenCLPlatformNum; + AMD_OCL_PLATFORM = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; } public override void Start(Algorithm miningAlgorithm, string url, string username) { diff --git a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs index b3cf95f..9ba7acb 100644 --- a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs +++ b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs @@ -27,7 +27,7 @@ public GroupMiners(GroupedDevices deviceUUIDSet) { _miners = new List(); _deviceNames = new SortedSet(); foreach (var uuid in deviceUUIDSet) { - var tmpCdev = ComputeDevice.GetDeviceWithUUID(uuid); + var tmpCdev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid); _deviceNames.Add(tmpCdev.NameCount); if (_deviceGroupType == DeviceGroupType.NONE) { _deviceGroupType = tmpCdev.DeviceGroupType; @@ -41,7 +41,7 @@ public GroupMiners(GroupedDevices deviceUUIDSet) { int i = 0; foreach (var devName in _deviceNames) { _deviceNamesCount[i++] = - ComputeDevice.GetEnabledDeviceNameCount(devName).ToString() + ComputeDeviceManager.Avaliable.GetEnabledDeviceNameCount(devName).ToString() + " * " + devName; } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index b6cdc40..89a40ca 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -157,7 +157,7 @@ public Miner(DeviceType deviceType, DeviceGroupType deviceGroupType, string mine virtual public void SetCDevs(string[] deviceUUIDs) { foreach (var uuid in deviceUUIDs) { - CDevs.Add(ComputeDevice.GetDeviceWithUUID(uuid)); + CDevs.Add(ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid)); } // sort devices by id CDevs.Sort((a, b) => a.ID - b.ID); diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 7a0787e..77f8069 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -145,7 +145,7 @@ public string GetActiveMinersGroup() { //get unique miner groups like CPU, NVIDIA, AMD,... HashSet UniqueMinerGroups = new HashSet(); - foreach (var curDevice in ComputeDevice.AllAvaliableDevices) { + foreach (var curDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (curDevice.Enabled) { UniqueMinerGroups.Add(curDevice.DeviceGroupString); } @@ -231,7 +231,7 @@ public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication // this checks if there are enabled devices and enabled algorithms bool isMiningEnabled = false; - foreach (var cdev in ComputeDevice.AllAvaliableDevices) { + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cdev.Enabled) { _enabledDevices.Add(cdev); // check if any algorithm enabled @@ -265,7 +265,7 @@ PerDeviceSpeedDictionary GetEnabledDeviceTypeSpeeds() { PerDeviceSpeedDictionary perDeviceTypeBenchmarks = new PerDeviceSpeedDictionary(); // init algorithms count 0 - foreach (var curCDev in ComputeDevice.AllAvaliableDevices) { + foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (curCDev.Enabled) { Dictionary cumulativeSpeeds = new Dictionary(); var deviceConfig = curCDev.DeviceBenchmarkConfig; @@ -277,7 +277,7 @@ PerDeviceSpeedDictionary GetEnabledDeviceTypeSpeeds() { } } // set enabled algorithm count per device counts - foreach (var curCDev in ComputeDevice.AllAvaliableDevices) { + foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (curCDev.Enabled) { Dictionary cumulativeSpeeds = perDeviceTypeBenchmarks[curCDev.UUID]; var deviceConfig = curCDev.DeviceBenchmarkConfig; @@ -296,7 +296,7 @@ PerDeviceSpeedDictionary GetEnabledDeviceTypeSpeeds() { } } // calculate benchmarks - foreach (var curCDev in ComputeDevice.AllAvaliableDevices) { + foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (curCDev.Enabled) { Dictionary cumulativeSpeeds = perDeviceTypeBenchmarks[curCDev.UUID]; var deviceConfig = curCDev.DeviceBenchmarkConfig; @@ -330,7 +330,7 @@ PerDeviceProifitDictionary GetEnabledDeviceProifitDictionary(PerDeviceSpeedDicti var deviceUUID = nameBenchKvp.Key; var curDevProfits = new Dictionary(); StringBuilder stringBuilderDevice = new StringBuilder(); - stringBuilderDevice.AppendLine(String.Format("\tProfits for {0} ({1}):", deviceUUID, ComputeDevice.GetNameForUUID(deviceUUID))); + stringBuilderDevice.AppendLine(String.Format("\tProfits for {0} ({1}):", deviceUUID, ComputeDeviceManager.Avaliable.GetNameForUUID(deviceUUID))); AlgorithmType mostProfitKey = AlgorithmType.NONE; double mostProfitAlgoVal = -1; foreach (var algoSpeedKvp in nameBenchKvp.Value) { @@ -407,7 +407,7 @@ private bool IsNvidiaDevice(ComputeDevice a) { private bool IsEquihashAndOneCPU(ComputeDevice a, ComputeDevice b) { return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID - && ComputeDeviceQueryManager.Instance.CPUs <= 1; + && ComputeDeviceManager.Avaliable.CPUsCount <= 1; } private bool IsEquihashAndOneNOTCPU(ComputeDevice a, ComputeDevice b) { diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs index 5195487..4a26cf9 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs @@ -21,7 +21,7 @@ public class MinerEtherumOCL : MinerEtherum { public MinerEtherumOCL() : base(DeviceType.AMD, "MinerEtherumOCL", "AMD OpenCL") { - GPUPlatformNumber = ComputeDeviceQueryManager.Instance.AMDOpenCLPlatformNum; + GPUPlatformNumber = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; MinerEtherumOCLList.Add(this); } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 590b319..b4ff7e3 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -33,7 +33,7 @@ public sgminer() { Path = MinerPaths.sgminer_5_5_0_general; EnableOptimizedVersion = true; - GPUPlatformNumber = ComputeDeviceQueryManager.Instance.AMDOpenCLPlatformNum; + GPUPlatformNumber = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; } // use ONLY for exiting a benchmark diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 4476080..66f4e98 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -88,7 +88,7 @@ - + @@ -177,7 +177,6 @@ - diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index b3019a5..fcaf074 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -22,41 +22,10 @@ public partial class MinersDownloadManager : BaseLazySingleton _downloadsData; - bool isDownloadSizeInit = false; IMinerUpdateIndicator _minerUpdateIndicator; @@ -65,16 +34,6 @@ protected MinersDownloadManager() { TAG = this.GetType().Name; } - public void InitDownloadPaths() { - _downloadsData = new List(); - dl_shared.shouldDownload = !IsMinersBins_SHARED_Init(); - dl_nvidia.shouldDownload = !IsMinersBins_NVIDIA_Init() && ComputeDeviceQueryManager.Instance.HasNVIDIA; - dl_amd.shouldDownload = !IsMinersBins_AMD_Init() && ComputeDeviceQueryManager.Instance.HasAMD; - _downloadsData.Add(dl_shared); - _downloadsData.Add(dl_nvidia); - _downloadsData.Add(dl_amd); - } - public void Start(IMinerUpdateIndicator minerUpdateIndicator) { _minerUpdateIndicator = minerUpdateIndicator; @@ -254,15 +213,6 @@ private bool IsMinersBins_AMD_Init() { } public bool IsMinersBinsInit() { - // in the future or 2.0 - //bool isOk = IsMinersBins_SHARED_Init(); - //if (isOk && ComputeDeviceQueryManager.Instance.HasNVIDIA) { - // isOk = IsMinersBins_NVIDIA_Init(); - //} - //if (isOk && ComputeDeviceQueryManager.Instance.HasAMD) { - // isOk = IsMinersBins_AMD_Init(); - //} - //return isOk; return IsMinersBins_ALL_Init(); } From 5a1276deacae67506f63aa692c39a2c903f382ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 14 Nov 2016 23:41:20 +0100 Subject: [PATCH 096/366] added eqm miner --- NiceHashMiner/Enums/DeviceType.cs | 2 +- NiceHashMiner/Enums/MinerOptionType.cs | 7 +- NiceHashMiner/Forms/Form_Settings.cs | 6 +- NiceHashMiner/Miners/Equihash/eqm.cs | 52 +++++- NiceHashMiner/Miners/Equihash/nheqBase.cs | 156 ++++++++++++++++++ NiceHashMiner/Miners/Equihash/nheqminer.cs | 151 +---------------- .../Grouping/ExtraLaunchParametersParser.cs | 65 +++++--- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 9 +- .../Miners/ManagerPrivate/GroupMiners.cs | 10 -- NiceHashMiner/Miners/MinersManager.cs | 6 +- NiceHashMiner/NiceHashMiner.csproj | 1 + 11 files changed, 278 insertions(+), 187 deletions(-) create mode 100644 NiceHashMiner/Miners/Equihash/nheqBase.cs diff --git a/NiceHashMiner/Enums/DeviceType.cs b/NiceHashMiner/Enums/DeviceType.cs index a0f8c41..14ca328 100644 --- a/NiceHashMiner/Enums/DeviceType.cs +++ b/NiceHashMiner/Enums/DeviceType.cs @@ -6,7 +6,7 @@ namespace NiceHashMiner.Enums { public enum DeviceType { - CPU, + CPU = 0, NVIDIA, AMD, // combined types used for miner identification only diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 2d62fbd..f5d7314 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -42,13 +42,16 @@ public enum MinerOptionType { Threads, CpuAffinity, CpuPriority, - // nheqminer + // nheqminer/eqm // nheqminer CUDA CUDA_Solver_Version, // -cb CUDA_Solver_Block, // -cb CUDA_Solver_Thread, // -ct // nheqminer OpenCL OpenCL_Solver_Version, //-ov - OpenCL_Solver_Dev_Thread // -ot + OpenCL_Solver_Dev_Thread, // -ot + // eqm + CUDA_Solver_AsyncMode, // -ca + CUDA_Solver_ParallelBuckets, // -cp } } diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 57b3ed5..da4e1cb 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -536,7 +536,7 @@ private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, Ev algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; cDev.MostProfitableAlgorithm = algorithm.Value; algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( - thisListDev, algorithm.Key, DeviceType.AMD, false + thisListDev, algorithm.Key, DeviceType.AMD, "", false ); } } @@ -559,7 +559,7 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; cDev.MostProfitableAlgorithm = algorithm.Value; algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( - thisListDev, algorithm.Key, cDev.DeviceType, false + thisListDev, algorithm.Key, cDev.DeviceType, "", false ); } } @@ -576,7 +576,7 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, algorithm.ExtraLaunchParameters = defaultAlgoSettings.Value.ExtraLaunchParameters; cDev.MostProfitableAlgorithm = algorithm; algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( - thisListDev, algorithmKey, cDev.DeviceType, false + thisListDev, algorithmKey, cDev.DeviceType, "", false ); } } diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index cab21f8..4f1935a 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -1,10 +1,58 @@ -using System; +using NiceHashMiner.Enums; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NiceHashMiner.Miners { - class eqm { + public class eqm : nheqBase { + public eqm() + : base(DeviceType.NVIDIA_CPU, "eqm") { + Path = MinerPaths.eqm; + WorkingDirectory = MinerPaths.eqm.Replace("eqm.exe", ""); + } + + + // TODO fix extra paramteter parsing + protected override string GetDevicesCommandString() { + string deviceStringCommand = " "; + + if (CPUs.Count > 0) { + if (CPUs[0].MostProfitableAlgorithm.LessThreads > 0 || !string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { + // TODO check parsing for dual CPU + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU, Path); + } + } else { + // disable CPU + deviceStringCommand += " -t 0 "; + } + + if (NVIDIAs.Count > 0) { + deviceStringCommand += " -cd "; + foreach (var nvidia in NVIDIAs) { + deviceStringCommand += nvidia.ID + " "; + } + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(NVIDIAs, AlgorithmType.Equihash, DeviceType.NVIDIA, Path); + } + + return deviceStringCommand; + } + + // benchmark stuff + protected override bool BenchmarkParseLine(string outdata) { + + if (outdata.Contains(Iter_PER_SEC)) { + curSpeed = getNumber(outdata, "Measured: ", Iter_PER_SEC) * SolMultFactor; + } + if (outdata.Contains(Sols_PER_SEC)) { + var sols = getNumber(outdata, "Measured: ", Sols_PER_SEC); + if (sols > 0) { + BenchmarkAlgorithm.BenchmarkSpeed = curSpeed; + return true; + } + } + return false; + } } } diff --git a/NiceHashMiner/Miners/Equihash/nheqBase.cs b/NiceHashMiner/Miners/Equihash/nheqBase.cs new file mode 100644 index 0000000..ff9c3d2 --- /dev/null +++ b/NiceHashMiner/Miners/Equihash/nheqBase.cs @@ -0,0 +1,156 @@ +using Newtonsoft.Json; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners { + public abstract class nheqBase : Miner { + protected List CPUs = new List(); + protected List NVIDIAs = new List(); + protected readonly int AMD_OCL_PLATFORM; + protected List AMDs = new List(); + + // extra benchmark stuff + protected double curSpeed = 0; + static protected readonly String Iter_PER_SEC = "I/s"; + static protected readonly String Sols_PER_SEC = "Sols/s"; + protected const double SolMultFactor = 1.9; + + private class Result { + public double interval_seconds { get; set; } + public double speed_ips { get; set; } + public double speed_sps { get; set; } + public double accepted_per_minute { get; set; } + public double rejected_per_minute { get; set; } + } + + private class JsonApiResponse { + public string method { get; set; } + public Result result { get; set; } + public object error { get; set; } + } + + public nheqBase(DeviceType deviceType, string minerDeviceName) + : base(deviceType, DeviceGroupType.NONE, minerDeviceName) { + AMD_OCL_PLATFORM = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; + } + + public override void Start(Algorithm miningAlgorithm, string url, string username) { + CurrentMiningAlgorithm = miningAlgorithm; + LastCommandLine = GetDevicesCommandString() + " -a " + APIPort + " -l " + url + " -u " + username; + ProcessHandle = _Start(); + } + + public override void SetCDevs(string[] deviceUUIDs) { + base.SetCDevs(deviceUUIDs); + foreach (var cDev in CDevs) { + if (cDev.DeviceType == DeviceType.CPU) { + CPUs.Add(cDev); + } + if (cDev.DeviceType == DeviceType.NVIDIA) { + NVIDIAs.Add(cDev); + } + if (cDev.DeviceType == DeviceType.AMD) { + AMDs.Add(cDev); + } + } + } + + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + // TODO nvidia extras + CurrentMiningAlgorithm = algorithm; + String ret = "-b " + GetDevicesCommandString(); + return ret; + } + + public override APIData GetSummary() { + _currentMinerReadStatus = MinerAPIReadStatus.NONE; + APIData ad = new APIData(); + ad.AlgorithmID = AlgorithmType.Equihash; + ad.AlgorithmName = "equihash"; + ad.Speed = 0; + + TcpClient client = null; + JsonApiResponse resp = null; + try { + byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("status\n"); + client = new TcpClient("127.0.0.1", APIPort); + NetworkStream nwStream = client.GetStream(); + nwStream.Write(bytesToSend, 0, bytesToSend.Length); + byte[] bytesToRead = new byte[client.ReceiveBufferSize]; + int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); + string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); + resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); + client.Close(); + } catch (Exception ex) { + Helpers.ConsolePrint("ERROR", ex.Message); + } + + if (resp != null && resp.error == null) { + ad.Speed = resp.result.speed_sps; + _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + if (ad.Speed == 0) { + _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; + } + } + + return ad; + } + + protected override NiceHashProcess _Start() { + NiceHashProcess P = base._Start(); + if (CPUs.Count > 0 && CPUs[0].AffinityMask != 0 && P != null) + CPUID.AdjustAffinity(P.Id, CPUs[0].AffinityMask); + + return P; + } + + // DONE + protected override bool UpdateBindPortCommand(int oldPort, int newPort) { + const string MASK = "-a {0}"; + var oldApiBindStr = String.Format(MASK, oldPort); + var newApiBindStr = String.Format(MASK, newPort); + if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { + LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); + return true; + } + return false; + } + protected override void InitSupportedMinerAlgorithms() { + _supportedMinerAlgorithms = new AlgorithmType[] { AlgorithmType.Equihash }; + } + + protected override void _Stop(MinerStopType willswitch) { + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); + } + + protected override int GET_MAX_CooldownTimeInMilliseconds() { + return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds + } + + protected double getNumber(string outdata, string startF, string remF) { + try { + int speedStart = outdata.IndexOf(startF); + String speed = outdata.Substring(speedStart, outdata.Length - speedStart); + speed = speed.Replace(startF, ""); + speed = speed.Replace(remF, ""); + speed = speed.Trim(); + return Double.Parse(speed, CultureInfo.InvariantCulture); + } catch { + } + return 0; + } + + // benchmark stuff + + protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { + CheckOutdata(outdata); + } + } +} diff --git a/NiceHashMiner/Miners/Equihash/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs index fdd9dc3..e9adcfd 100644 --- a/NiceHashMiner/Miners/Equihash/nheqminer.cs +++ b/NiceHashMiner/Miners/Equihash/nheqminer.cs @@ -11,63 +11,11 @@ using System.Threading.Tasks; namespace NiceHashMiner.Miners { - public class nheqminer : Miner { - private readonly int AMD_OCL_PLATFORM; - - List CPUs = new List(); - List NVIDIAs = new List(); - List AMDs = new List(); - - // extra benchmark stuff - double curSpeed = 0; - - private class Result { - public double interval_seconds { get; set; } - public double speed_ips { get; set; } - public double speed_sps { get; set; } - public double accepted_per_minute { get; set; } - public double rejected_per_minute { get; set; } - } - - private class JsonApiResponse { - public string method { get; set; } - public Result result { get; set; } - public object error { get; set; } - } - + public class nheqminer : nheqBase { public nheqminer() - : base(DeviceType.ALL, DeviceGroupType.NONE, "nheqminer") { + : base(DeviceType.ALL, "nheqminer") { Path = MinerPaths.nheqminer; WorkingDirectory = MinerPaths.nheqminer.Replace("nheqminer.exe", ""); - AMD_OCL_PLATFORM = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; - } - - public override void Start(Algorithm miningAlgorithm, string url, string username) { - CurrentMiningAlgorithm = miningAlgorithm; - LastCommandLine = GetDevicesCommandString() + " -a " + APIPort + " -l " + url + " -u " + username; - ProcessHandle = _Start(); - } - - public override void SetCDevs(string[] deviceUUIDs) { - base.SetCDevs(deviceUUIDs); - foreach (var cDev in CDevs) { - if(cDev.DeviceType == DeviceType.CPU) { - CPUs.Add(cDev); - } - if (cDev.DeviceType == DeviceType.NVIDIA) { - NVIDIAs.Add(cDev); - } - if (cDev.DeviceType == DeviceType.AMD) { - AMDs.Add(cDev); - } - } - } - - protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - // TODO nvidia extras - CurrentMiningAlgorithm = algorithm; - String ret = "-b " + GetDevicesCommandString(); - return ret; } protected override string GetDevicesCommandString() { @@ -76,7 +24,7 @@ protected override string GetDevicesCommandString() { if (CPUs.Count > 0) { if (CPUs[0].MostProfitableAlgorithm.LessThreads > 0 || !string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { // TODO parse - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU); + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU, Path); } } else { // disable CPU @@ -88,9 +36,7 @@ protected override string GetDevicesCommandString() { foreach (var nvidia in NVIDIAs) { deviceStringCommand += nvidia.ID + " "; } - // use always -cv 1 - deviceStringCommand += " -cv 1"; - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(NVIDIAs, AlgorithmType.Equihash, DeviceType.NVIDIA); + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(NVIDIAs, AlgorithmType.Equihash, DeviceType.NVIDIA, Path); } if (AMDs.Count > 0) { @@ -99,95 +45,13 @@ protected override string GetDevicesCommandString() { foreach (var amd in AMDs) { deviceStringCommand += amd.ID + " "; } - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(AMDs, AlgorithmType.Equihash, DeviceType.AMD); + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(AMDs, AlgorithmType.Equihash, DeviceType.AMD, Path); } return deviceStringCommand; } - - public override APIData GetSummary() { - _currentMinerReadStatus = MinerAPIReadStatus.NONE; - APIData ad = new APIData(); - ad.AlgorithmID = AlgorithmType.Equihash; - ad.AlgorithmName = "equihash"; - ad.Speed = 0; - - TcpClient client = null; - JsonApiResponse resp = null; - try { - byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("status\n"); - client = new TcpClient("127.0.0.1", APIPort); - NetworkStream nwStream = client.GetStream(); - nwStream.Write(bytesToSend, 0, bytesToSend.Length); - byte[] bytesToRead = new byte[client.ReceiveBufferSize]; - int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); - string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); - resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); - client.Close(); - } catch(Exception ex) { - Helpers.ConsolePrint("ERROR", ex.Message); - } - - if (resp != null && resp.error == null) { - ad.Speed = resp.result.speed_sps; - _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; - if (ad.Speed == 0) { - _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; - } - } - - return ad; - } - - protected override NiceHashProcess _Start() { - NiceHashProcess P = base._Start(); - if(CPUs.Count > 0 && CPUs[0].AffinityMask != 0 && P != null) - CPUID.AdjustAffinity(P.Id, CPUs[0].AffinityMask); - - return P; - } - - // DONE - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - const string MASK = "-a {0}"; - var oldApiBindStr = String.Format(MASK, oldPort); - var newApiBindStr = String.Format(MASK, newPort); - if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { - LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - return true; - } - return false; - } - protected override void InitSupportedMinerAlgorithms() { - _supportedMinerAlgorithms = new AlgorithmType[] { AlgorithmType.Equihash }; - } - - protected override void _Stop(MinerStopType willswitch) { - Stop_cpu_ccminer_sgminer_nheqminer(willswitch); - } - - protected override int GET_MAX_CooldownTimeInMilliseconds() { - return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds - } - - private double getNumber(string outdata, string startF, string remF) { - try { - int speedStart = outdata.IndexOf(startF); - String speed = outdata.Substring(speedStart, outdata.Length - speedStart); - speed = speed.Replace(startF, ""); - speed = speed.Replace(remF, ""); - speed = speed.Trim(); - return Double.Parse(speed, CultureInfo.InvariantCulture); - } catch { - } - return 0; - } - // benchmark stuff - static private readonly String Iter_PER_SEC = "I/s"; - static private readonly String Sols_PER_SEC = "Sols/s"; - private const double SolMultFactor = 1.9; protected override bool BenchmarkParseLine(string outdata) { if (outdata.Contains(Iter_PER_SEC)) { @@ -202,9 +66,6 @@ protected override bool BenchmarkParseLine(string outdata) { } return false; } - - protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { - CheckOutdata(outdata); - } + } } diff --git a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs index db5a2f0..91c2867 100644 --- a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs @@ -68,21 +68,30 @@ static class ExtraLaunchParametersParser { }; // nheqminer private static List _nheqminer_CPU_Options = new List() { - // temperature stuff new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none }; private static List _nheqminer_CUDA_Options = new List() { - // temperature stuff - // use always -cv 1 new MinerOption(MinerOptionType.CUDA_Solver_Version, "-cv", "-cv", "0", MinerOptionFlagType.SingleParam, " "), // default 0 new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 }; private static List _nheqminer_AMD_Options = new List() { - // temperature stuff new MinerOption(MinerOptionType.OpenCL_Solver_Version, "-ov", "-ov", "0", MinerOptionFlagType.SingleParam, " "), // default none new MinerOption(MinerOptionType.OpenCL_Solver_Dev_Thread, "-ot", "-ot", "1", MinerOptionFlagType.MultiParam, " "), // default none }; + // eqm + private static List _eqm_CPU_Options = new List() { + new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none + }; + private static List _eqm_CUDA_Options = new List() { + // TODO check what kind of parameter type is CUDA_Solver_AsyncMode + new MinerOption(MinerOptionType.CUDA_Solver_AsyncMode, "-ca", "-ca", "1", MinerOptionFlagType.SingleParam, " "), // default 1 + // TODO check what is the CUDA_Solver_ParallelBuckets default + new MinerOption(MinerOptionType.CUDA_Solver_ParallelBuckets, "-cp", "-cp", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + + new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + }; private static bool _showLog = true; @@ -243,7 +252,7 @@ private static string Parse(List CDevs, List options } - public static string ParseForCDevs(List CDevs, AlgorithmType algorithmType, DeviceType deviceType, bool showLog = true) { + public static string ParseForCDevs(List CDevs, AlgorithmType algorithmType, DeviceType deviceType, string minerPath = "", bool showLog = true) { _showLog = showLog; // init cdevs extra launch parameters foreach (var cDev in CDevs) { @@ -252,22 +261,40 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo // parse for nheqminer if (algorithmType == AlgorithmType.Equihash) { - if(deviceType == DeviceType.CPU) { - foreach (var cDev in CDevs) { - // extra thread check - if (cDev.CurrentExtraLaunchParameters.Contains("-t")) { - // nothing - } else { // add threads params mandatory - cDev.CurrentExtraLaunchParameters += " -t " + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); + // nheqminer + if(minerPath == MinerPaths.nheqminer) { + if (deviceType == DeviceType.CPU) { + foreach (var cDev in CDevs) { + // extra thread check + if (cDev.CurrentExtraLaunchParameters.Contains("-t")) { + // nothing + } else { // add threads params mandatory + cDev.CurrentExtraLaunchParameters += " -t " + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); + } } + return Parse(CDevs, _nheqminer_CPU_Options); + } + if (deviceType == DeviceType.NVIDIA) { + return Parse(CDevs, _nheqminer_CUDA_Options); + } + if (deviceType == DeviceType.AMD) { + return Parse(CDevs, _nheqminer_AMD_Options); + } + } else if (minerPath == MinerPaths.eqm) { + if (deviceType == DeviceType.CPU) { + foreach (var cDev in CDevs) { + // extra thread check + if (cDev.CurrentExtraLaunchParameters.Contains("-t")) { + // nothing + } else { // add threads params mandatory + cDev.CurrentExtraLaunchParameters += " -t " + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); + } + } + return Parse(CDevs, _eqm_CPU_Options); + } + if (deviceType == DeviceType.NVIDIA) { + return Parse(CDevs, _eqm_CUDA_Options); } - return Parse(CDevs, _nheqminer_CPU_Options); - } - if (deviceType == DeviceType.NVIDIA) { - return Parse(CDevs, _nheqminer_CUDA_Options); - } - if (deviceType == DeviceType.AMD) { - return Parse(CDevs, _nheqminer_AMD_Options); } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 6cf9a4b..388cbf6 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -66,10 +66,11 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy } // AlgorithmType.Equihash special shared case if (algorithmType == AlgorithmType.Equihash) { - // TODO two different miners SM5.0+ and AVX+ - //if (deviceType == DeviceType.ALL) { - //} - return MinerPaths.nheqminer; + if (deviceType == DeviceType.NVIDIA_CPU || deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x) { + return MinerPaths.eqm; + } else { + return MinerPaths.nheqminer; + } } // normal stuff // CPU diff --git a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs index 9ba7acb..7b5ee93 100644 --- a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs +++ b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs @@ -35,16 +35,6 @@ public GroupMiners(GroupedDevices deviceUUIDSet) { } // init device uuids _deviceUUIDs = deviceUUIDSet.ToArray(); - // init DevicesInfoString - string[] _deviceNamesCount = new string[_deviceNames.Count]; - { - int i = 0; - foreach (var devName in _deviceNames) { - _deviceNamesCount[i++] = - ComputeDeviceManager.Avaliable.GetEnabledDeviceNameCount(devName).ToString() - + " * " + devName; - } - } DevicesInfoString = "{ " + string.Join(", ", _deviceNames) + " }"; } diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 77f8069..e4dad0b 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -160,7 +160,11 @@ public string GetActiveMinersGroup() { // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType algorithmType) { if (AlgorithmType.Equihash == algorithmType) { - return new nheqminer(); + if (DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { + return new eqm(); + } else { + return new nheqminer(); + } } else if (AlgorithmType.DaggerHashimoto == algorithmType) { if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { return new MinerEtherumOCL(); diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 66f4e98..5708b2b 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -181,6 +181,7 @@ + From aa6fb651fd074dba470b4f160903f3bf4b034afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 15 Nov 2016 17:15:51 +0100 Subject: [PATCH 097/366] eqm ful integration --- NiceHashMiner/Miners/Equihash/eqm.cs | 3 +- NiceHashMiner/Miners/Equihash/nheqBase.cs | 8 --- NiceHashMiner/Miners/Equihash/nheqminer.cs | 10 ++++ .../Grouping/ExtraLaunchParametersParser.cs | 8 +-- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 3 +- .../Miners/ManagerPrivate/GroupMiners.cs | 17 ++++-- NiceHashMiner/Miners/Miner.cs | 3 + NiceHashMiner/Miners/MinersManager.cs | 55 ++++++++++++++----- 8 files changed, 74 insertions(+), 33 deletions(-) diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 4f1935a..2085390 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -11,6 +11,7 @@ public eqm() : base(DeviceType.NVIDIA_CPU, "eqm") { Path = MinerPaths.eqm; WorkingDirectory = MinerPaths.eqm.Replace("eqm.exe", ""); + IsNHLocked = true; } @@ -19,8 +20,8 @@ protected override string GetDevicesCommandString() { string deviceStringCommand = " "; if (CPUs.Count > 0) { + deviceStringCommand += "-p " + CPUs.Count; if (CPUs[0].MostProfitableAlgorithm.LessThreads > 0 || !string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { - // TODO check parsing for dual CPU deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU, Path); } } else { diff --git a/NiceHashMiner/Miners/Equihash/nheqBase.cs b/NiceHashMiner/Miners/Equihash/nheqBase.cs index ff9c3d2..2dc6ba6 100644 --- a/NiceHashMiner/Miners/Equihash/nheqBase.cs +++ b/NiceHashMiner/Miners/Equihash/nheqBase.cs @@ -103,14 +103,6 @@ public override APIData GetSummary() { return ad; } - protected override NiceHashProcess _Start() { - NiceHashProcess P = base._Start(); - if (CPUs.Count > 0 && CPUs[0].AffinityMask != 0 && P != null) - CPUID.AdjustAffinity(P.Id, CPUs[0].AffinityMask); - - return P; - } - // DONE protected override bool UpdateBindPortCommand(int oldPort, int newPort) { const string MASK = "-a {0}"; diff --git a/NiceHashMiner/Miners/Equihash/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs index e9adcfd..744ef89 100644 --- a/NiceHashMiner/Miners/Equihash/nheqminer.cs +++ b/NiceHashMiner/Miners/Equihash/nheqminer.cs @@ -18,6 +18,16 @@ public nheqminer() WorkingDirectory = MinerPaths.nheqminer.Replace("nheqminer.exe", ""); } + // CPU aff set from NHM + protected override NiceHashProcess _Start() { + NiceHashProcess P = base._Start(); + if (CPUs.Count > 0 && CPUs[0].AffinityMask != 0 && P != null) + CPUID.AdjustAffinity(P.Id, CPUs[0].AffinityMask); + + return P; + } + + protected override string GetDevicesCommandString() { string deviceStringCommand = " "; diff --git a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs index 91c2867..e9d880b 100644 --- a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs @@ -84,11 +84,8 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none }; private static List _eqm_CUDA_Options = new List() { - // TODO check what kind of parameter type is CUDA_Solver_AsyncMode - new MinerOption(MinerOptionType.CUDA_Solver_AsyncMode, "-ca", "-ca", "1", MinerOptionFlagType.SingleParam, " "), // default 1 // TODO check what is the CUDA_Solver_ParallelBuckets default new MinerOption(MinerOptionType.CUDA_Solver_ParallelBuckets, "-cp", "-cp", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 }; @@ -233,7 +230,8 @@ private static string Parse(List CDevs, List options values.Add(cdevOptions[cDev.UUID][option.Type]); } string setValue = option.Default; - if (values.Count == 1) { + if (values.Count >= 1) { + // Always take first setValue = values.First(); } string MASK = " {0} {1}"; @@ -289,6 +287,8 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo } else { // add threads params mandatory cDev.CurrentExtraLaunchParameters += " -t " + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); } + // use only first CPU dev + break; } return Parse(CDevs, _eqm_CPU_Options); } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 388cbf6..b5d0893 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -66,7 +66,8 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy } // AlgorithmType.Equihash special shared case if (algorithmType == AlgorithmType.Equihash) { - if (deviceType == DeviceType.NVIDIA_CPU || deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x) { + if (deviceType == DeviceType.NVIDIA_CPU || deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x + || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; } else { return MinerPaths.nheqminer; diff --git a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs index 7b5ee93..611278a 100644 --- a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs +++ b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs @@ -105,12 +105,17 @@ private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string minin System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); if (MaxProfitKey == AlgorithmType.Equihash) { - //m.Start(algorithm, miningLocation, worker); - m.Start(algorithm, - Globals.NiceHashData[MaxProfitKey].name - + "." + miningLocation - + ".nicehash.com:" - + Globals.NiceHashData[MaxProfitKey].port, worker); + if (m.IsNHLocked) { + // TODO worker name not working with eqm + string BTC = worker.Substring(0, worker.IndexOf(".")); + m.Start(algorithm, miningLocation, BTC); + } else { + m.Start(algorithm, + Globals.NiceHashData[MaxProfitKey].name + + "." + miningLocation + + ".nicehash.com:" + + Globals.NiceHashData[MaxProfitKey].port, worker); + } } else { m.Start(algorithm, "stratum+tcp://" diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 89a40ca..d0ec390 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -45,6 +45,8 @@ public abstract class Miner { protected int APIPort { get; private set; } // if miner has no API bind port for reading curentlly only CryptoNight on ccminer public bool IsAPIReadException { get; protected set; } + // inhouse miners that are locked on NH (our eqm) + public bool IsNHLocked { get; protected set; } protected List CDevs; public DeviceType DeviceType { get; private set; } public DeviceGroupType DeviceGroupType { get; private set; } @@ -144,6 +146,7 @@ public Miner(DeviceType deviceType, DeviceGroupType deviceGroupType, string mine APIPort = MinersApiPortsManager.Instance.GetAvaliablePort(); IsAPIReadException = false; + IsNHLocked = false; _MAX_CooldownTimeInMilliseconds = GET_MAX_CooldownTimeInMilliseconds(); // Helpers.ConsolePrint(MinerTAG(), "NEW MINER CREATED"); diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index e4dad0b..4bed8fd 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -157,10 +157,17 @@ public string GetActiveMinersGroup() { return ActiveMinersGroup; } + public static bool EquihashCPU_USE_eqm() { + var mostOptimized = CPUUtils.GetMostOptimized(); + return mostOptimized == CPUExtensionType.AVX || mostOptimized == CPUExtensionType.AVX2 + || mostOptimized == CPUExtensionType.AVX_AES || mostOptimized == CPUExtensionType.AVX2_AES; + } + // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType algorithmType) { if (AlgorithmType.Equihash == algorithmType) { - if (DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { + if (DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType + || (EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return new eqm(); } else { return new nheqminer(); @@ -399,25 +406,48 @@ private bool IsAlgorithmSettingsSame(Algorithm a, Algorithm b) { ; } - //private bool SafeStrCompare(string a, string b) { - // if (string.IsNullOrEmpty(a) == true && string.IsNullOrEmpty(a) == string.IsNullOrEmpty(b)) return true; - // return a == b; - //} - private bool IsNvidiaDevice(ComputeDevice a) { return a.DeviceType == DeviceType.NVIDIA; } - private bool IsEquihashAndOneCPU(ComputeDevice a, ComputeDevice b) { + private bool IsEquihashGroupLogic(ComputeDevice a, ComputeDevice b) { + // eqm + if (IsEquihashDevice_eqm(a) && IsEquihashDevice_eqm(b)) { // both eqm + return IsEquihashAnd_eqm(a, b); + } + // nheqmnier + else if (!IsEquihashDevice_eqm(a) && !IsEquihashDevice_eqm(b)) { // both NOT eqm + return IsEquihashAnd_nheqminer(a, b); + } + return false; + } + + // nheqminer + private bool IsEquihashAnd_nheqminer(ComputeDevice a, ComputeDevice b) { return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID - && ComputeDeviceManager.Avaliable.CPUsCount <= 1; + && IsEquihashAnd_CPU_nheqminer(a) + && IsEquihashAnd_CPU_nheqminer(b); + } + // group only first CPU split + private bool IsEquihashAnd_CPU_nheqminer(ComputeDevice a) { + return a.DeviceType != DeviceType.CPU // if not cpu then ignore case always good + || a.ID == 0; // if CPU ID must be 0 } - private bool IsEquihashAndOneNOTCPU(ComputeDevice a, ComputeDevice b) { + // eqm + private bool IsEquihashAnd_eqm(ComputeDevice a, ComputeDevice b) { return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash - && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID - && a.DeviceType != DeviceType.CPU && b.DeviceType != DeviceType.CPU; + && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID; + } + private bool IsEquihashDevice_eqm(ComputeDevice a) { + return IsEquihashCPU_eqm(a) || IsEquihashNVIDIA_eqm(a); + } + private bool IsEquihashCPU_eqm(ComputeDevice a) { + return MinersManager.EquihashCPU_USE_eqm() && a.DeviceType == DeviceType.CPU; + } + private bool IsEquihashNVIDIA_eqm(ComputeDevice a) { + return a.DeviceGroupType == DeviceGroupType.NVIDIA_5_x || a.DeviceGroupType == DeviceGroupType.NVIDIA_6_x; } // checks if dagger algo, same settings and if compute platform is same @@ -558,8 +588,7 @@ public void SwichMostProfitableGroupUpMethod(Dictionary Date: Tue, 15 Nov 2016 18:55:12 +0100 Subject: [PATCH 098/366] cuda device detection CUDA/NVML indexing fix --- CudaDeviceDetection/CudaDetection.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CudaDeviceDetection/CudaDetection.cpp b/CudaDeviceDetection/CudaDetection.cpp index df83dbc..91f0690 100644 --- a/CudaDeviceDetection/CudaDetection.cpp +++ b/CudaDeviceDetection/CudaDetection.cpp @@ -8,6 +8,8 @@ using namespace std; CudaDetection::CudaDetection() { } CudaDetection::~CudaDetection() { } +#define PCI_BUS_LEN 64 + bool CudaDetection::QueryDevices() { const unsigned int UUID_SIZE = 128; try { @@ -19,11 +21,15 @@ bool CudaDetection::QueryDevices() { cudaDeviceProp props; CUDA_SAFE_CALL(cudaGetDeviceProperties(&props, i)); + char pciBusID[PCI_BUS_LEN]; + CUDA_SAFE_CALL(cudaDeviceGetPCIBusId(pciBusID, PCI_BUS_LEN, i)); + // serial stuff nvmlPciInfo_t pciInfo; nvmlDevice_t device_t; char uuid[UUID_SIZE]; - NVML_SAFE_CALL(nvmlDeviceGetHandleByIndex(i, &device_t)); + //NVML_SAFE_CALL(nvmlDeviceGetHandleByIndex(i, &device_t)); // this is wrong + NVML_SAFE_CALL(nvmlDeviceGetHandleByPciBusId(pciBusID, &device_t)); // use pciBusID to get the right version NVML_SAFE_CALL(nvmlDeviceGetPciInfo(device_t, &pciInfo)); NVML_SAFE_CALL(nvmlDeviceGetUUID(device_t, uuid, UUID_SIZE)); From 5beb74d3ae98dd0bf3629cd2c7f336baecc5ba7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 16 Nov 2016 14:01:46 +0100 Subject: [PATCH 099/366] fixes, avarage same device speeds improve stability, profitability checking ref (check more often, theoretical and actual) --- NiceHashMiner/AlgorithmNiceHashNames.cs | 7 +- NiceHashMiner/Devices/ComputeDevice.cs | 2 +- NiceHashMiner/Forms/Form_Benchmark.cs | 1 + NiceHashMiner/Forms/Form_Main.cs | 3 +- NiceHashMiner/Miners/Grouping/GroupMiners.cs | 128 ++++ .../Miners/Grouping/GroupingLogic.cs | 100 +++ NiceHashMiner/Miners/Grouping/MinerPaths.cs | 2 + .../Miners/ManagerPrivate/GroupMiners.cs | 206 +++--- .../ManagerPrivate/MinersManager_OLD.cs | 575 +++++++++++++++ NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/Miners/MinersManager.cs | 672 ------------------ NiceHashMiner/Miners/MinersManager_NEW.cs | 113 +++ NiceHashMiner/Miners/MiningSession.cs | 599 ++++++++++++++++ NiceHashMiner/NiceHashMiner.csproj | 6 +- NiceHashMiner/NiceHashStats.cs | 3 + NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- 16 files changed, 1640 insertions(+), 783 deletions(-) create mode 100644 NiceHashMiner/Miners/Grouping/GroupMiners.cs create mode 100644 NiceHashMiner/Miners/Grouping/GroupingLogic.cs create mode 100644 NiceHashMiner/Miners/ManagerPrivate/MinersManager_OLD.cs delete mode 100644 NiceHashMiner/Miners/MinersManager.cs create mode 100644 NiceHashMiner/Miners/MinersManager_NEW.cs create mode 100644 NiceHashMiner/Miners/MiningSession.cs diff --git a/NiceHashMiner/AlgorithmNiceHashNames.cs b/NiceHashMiner/AlgorithmNiceHashNames.cs index bc91c01..e7f17a2 100644 --- a/NiceHashMiner/AlgorithmNiceHashNames.cs +++ b/NiceHashMiner/AlgorithmNiceHashNames.cs @@ -43,7 +43,12 @@ public static class AlgorithmNiceHashNames static private List _keys = null; - public static string GetName(AlgorithmType type) { return _names[type]; } + public static string GetName(AlgorithmType type) { + if (_names.ContainsKey(type)) { + return _names[type]; + } + return "NameNotFound type not supported"; + } /// /// GetKey is used for Algorithm initialization, from config files. diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index b6f58e9..7e48f17 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -15,7 +15,7 @@ public class ComputeDevice readonly public int ID; [JsonIgnore] readonly public string Group; - public string Name { get; set; } + readonly public string Name; // { get; set; } // to identify equality; [JsonIgnore] readonly public string _nameNoNums; diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 0a7fa5d..c84808a 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -12,6 +12,7 @@ using NiceHashMiner.Interfaces; namespace NiceHashMiner.Forms { + using MinersManager = MinersManager_NEW; public partial class Form_Benchmark : Form, IListItemCheckColorSetter, IBenchmarkComunicator, IBenchmarkCalculation { private bool _inBenchmark = false; diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index e6d5df5..95b5db0 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -24,6 +24,7 @@ namespace NiceHashMiner { + using MinersManager = MinersManager_NEW; public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, IMainFormRatesComunication { private static string VisitURL = Links.VisitURL; @@ -49,7 +50,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = "_PENDING"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/Grouping/GroupMiners.cs b/NiceHashMiner/Miners/Grouping/GroupMiners.cs new file mode 100644 index 0000000..f9eb0ca --- /dev/null +++ b/NiceHashMiner/Miners/Grouping/GroupMiners.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NiceHashMiner.Enums; +using NiceHashMiner.Devices; +using NiceHashMiner.Configs; + +namespace NiceHashMiner.Miners { + + // typedefs + using MinersManager = MinersManager_NEW; + using GroupedDevices = SortedSet; + // for switching different miners for different algorithms + public class GroupMiners { + public Miner CurrentWorkingMiner { get; protected set; } + public string DevicesInfoString { get; private set; } + + protected List _miners; + protected SortedSet _deviceNames; + protected string[] _deviceUUIDs; + protected DeviceGroupType _deviceGroupType = DeviceGroupType.NONE; + + public GroupMiners(GroupedDevices deviceUUIDSet) { + _miners = new List(); + _deviceNames = new SortedSet(); + foreach (var uuid in deviceUUIDSet) { + var tmpCdev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid); + _deviceNames.Add(tmpCdev.NameCount); + if (_deviceGroupType == DeviceGroupType.NONE) { + _deviceGroupType = tmpCdev.DeviceGroupType; + } + } + // init device uuids + _deviceUUIDs = deviceUUIDSet.ToArray(); + + DevicesInfoString = "{ " + string.Join(", ", _deviceNames) + " }"; + } + + private void StopMiner(Miner miner) { + if (miner.IsRunning) { + miner.Stop(MinerStopType.SWITCH); + // wait 0.5 seconds before going on + System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + } + } + + public void Stop() { + foreach (var miner in _miners) { + StopMiner(miner); + } + } + + public void End() { + foreach (var miner in _miners) { + miner.End(); + } + } + + public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string worker) { + bool containsSupportedMiner = false; + Miner startSwitchMiner = null; + var algorithmType = algorithm.NiceHashID; + foreach (var miner in _miners) { + if (miner.IsSupportedMinerAlgorithms(algorithmType)) { + containsSupportedMiner = true; + startSwitchMiner = miner; + break; + } + } + // check if contains miner if not create one + if (!containsSupportedMiner) { + startSwitchMiner = MinersManager.CreateMiner(_deviceGroupType, algorithmType); + startSwitchMiner.SetCDevs(_deviceUUIDs); + _miners.Add(startSwitchMiner); + } + + // hanlde CurrentWorkingMiner change + if (CurrentWorkingMiner != null && CurrentWorkingMiner != startSwitchMiner) { + StopMiner(CurrentWorkingMiner); + CurrentWorkingMiner = startSwitchMiner; + } else { + CurrentWorkingMiner = startSwitchMiner; + } + SwitchMinerAlgorithm(ref startSwitchMiner, algorithm, miningLocation, worker); + } + + private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string miningLocation, string worker) { + // if is running and the current algorithm is the same skip + if (m.IsRunning && m.CurrentAlgorithmType == algorithm.NiceHashID) { + return; + } + + if (m.CurrentAlgorithmType != AlgorithmType.NONE && m.CurrentAlgorithmType != AlgorithmType.INVALID) { + m.Stop(MinerStopType.SWITCH); + // wait 0.5 seconds before going on + System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + } + + var MaxProfitKey = algorithm.NiceHashID; + + // Wait before new start + System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + + if (MaxProfitKey == AlgorithmType.Equihash) { + if (m.IsNHLocked) { + // TODO worker name not working with eqm + string BTC = worker.Substring(0, worker.IndexOf(".")); + m.Start(algorithm, miningLocation, BTC); + } else { + m.Start(algorithm, + Globals.NiceHashData[MaxProfitKey].name + + "." + miningLocation + + ".nicehash.com:" + + Globals.NiceHashData[MaxProfitKey].port, worker); + } + } else { + m.Start(algorithm, + "stratum+tcp://" + + Globals.NiceHashData[MaxProfitKey].name + + "." + miningLocation + + ".nicehash.com:" + + Globals.NiceHashData[MaxProfitKey].port, worker); + } + } + } +} diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs new file mode 100644 index 0000000..d4d972f --- /dev/null +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -0,0 +1,100 @@ +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners { + using MinersManager = MinersManager_NEW; + public static class GroupingLogic { + private static bool IsAlgorithmSettingsSame(Algorithm a, Algorithm b) { + return a.NiceHashID == b.NiceHashID +#if (SWITCH_TESTING) + && (!ForcePerCardMiners) // this will force individual miners +#endif +; + } + + private static bool IsNvidiaDevice(ComputeDevice a) { + return a.DeviceType == DeviceType.NVIDIA; + } + + public static bool IsEquihashGroupLogic(ComputeDevice a, ComputeDevice b) { + // eqm + if (IsEquihashDevice_eqm(a) && IsEquihashDevice_eqm(b)) { // both eqm + return IsEquihashAnd_eqm(a, b); + } + // nheqmnier + else if (!IsEquihashDevice_eqm(a) && !IsEquihashDevice_eqm(b)) { // both NOT eqm + return IsEquihashAnd_nheqminer(a, b); + } + return false; + } + + // nheqminer + private static bool IsEquihashAnd_nheqminer(ComputeDevice a, ComputeDevice b) { + return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash + && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID + && IsEquihashAnd_CPU_nheqminer(a) + && IsEquihashAnd_CPU_nheqminer(b); + } + // group only first CPU split + private static bool IsEquihashAnd_CPU_nheqminer(ComputeDevice a) { + return a.DeviceType != DeviceType.CPU // if not cpu then ignore case always good + || a.ID == 0; // if CPU ID must be 0 + } + + // eqm + private static bool IsEquihashAnd_eqm(ComputeDevice a, ComputeDevice b) { + return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash + && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID; + } + private static bool IsEquihashDevice_eqm(ComputeDevice a) { + return IsEquihashCPU_eqm(a) || IsEquihashNVIDIA_eqm(a); + } + private static bool IsEquihashCPU_eqm(ComputeDevice a) { + return MinersManager.EquihashCPU_USE_eqm() && a.DeviceType == DeviceType.CPU; + } + private static bool IsEquihashNVIDIA_eqm(ComputeDevice a) { + return a.DeviceGroupType == DeviceGroupType.NVIDIA_5_x || a.DeviceGroupType == DeviceGroupType.NVIDIA_6_x; + } + + // checks if dagger algo, same settings and if compute platform is same + public static bool IsDaggerAndSameComputePlatform(ComputeDevice a, ComputeDevice b) { + return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto + && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID //IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) + // check if both etherum capable + && a.IsEtherumCapale && b.IsEtherumCapale + // compute platforms must be same + && (IsNvidiaDevice(a) == IsNvidiaDevice(b)); + } + + private static bool IsNotCpuGroups(ComputeDevice a, ComputeDevice b) { + return a.DeviceGroupType != DeviceGroupType.CPU && b.DeviceGroupType != DeviceGroupType.CPU; + } + + // this will not check Ethminer path + private static bool IsSameBinPath(ComputeDevice a, ComputeDevice b) { + // same group uses same Miner class and therefore same binary path for same algorithm + bool sameGroup = a.DeviceGroupType == b.DeviceGroupType; + if (!sameGroup) { + var a_algoType = a.MostProfitableAlgorithm.NiceHashID; + var b_algoType = b.MostProfitableAlgorithm.NiceHashID; + // a and b algorithm settings should be the same if we call this function + return MinerPaths.GetOptimizedMinerPath(a_algoType, a.DeviceType, a.DeviceGroupType, a.Codename, a.IsOptimizedVersion) + == MinerPaths.GetOptimizedMinerPath(b_algoType, b.DeviceType, b.DeviceGroupType, b.Codename, b.IsOptimizedVersion); + } + + return true; + } + + // we don't want to group CPU devices + public static bool IsGroupBinaryAndAlgorithmSame(ComputeDevice a, ComputeDevice b) { + return IsNotCpuGroups(a, b) + && IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) + && IsSameBinPath(a, b); + } + } +} diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index b5d0893..51c64f2 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -6,6 +6,8 @@ namespace NiceHashMiner.Miners { + using MinersManager = MinersManager_NEW; + /// /// MinerPaths, used just to store miners paths strings. Only one instance needed /// diff --git a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs index 611278a..af3bcde 100644 --- a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs +++ b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs @@ -10,122 +10,120 @@ namespace NiceHashMiner.Miners { using NiceHashMiner.Configs; // typedefs using GroupedDevices = SortedSet; - using GroupedDevicesKey = SortedSet>; - public partial class MinersManager { - // for switching different miners for different algorithms - private class GroupMiners { - public Miner CurrentWorkingMiner { get; protected set; } - public string DevicesInfoString { get; private set; } + //public partial class MinersManager_OLD { + // // for switching different miners for different algorithms + // private class GroupMiners { + // public Miner CurrentWorkingMiner { get; protected set; } + // public string DevicesInfoString { get; private set; } - protected List _miners; - protected SortedSet _deviceNames; - protected string[] _deviceUUIDs; - protected DeviceGroupType _deviceGroupType = DeviceGroupType.NONE; + // protected List _miners; + // protected SortedSet _deviceNames; + // protected string[] _deviceUUIDs; + // protected DeviceGroupType _deviceGroupType = DeviceGroupType.NONE; - public GroupMiners(GroupedDevices deviceUUIDSet) { - _miners = new List(); - _deviceNames = new SortedSet(); - foreach (var uuid in deviceUUIDSet) { - var tmpCdev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid); - _deviceNames.Add(tmpCdev.NameCount); - if (_deviceGroupType == DeviceGroupType.NONE) { - _deviceGroupType = tmpCdev.DeviceGroupType; - } - } - // init device uuids - _deviceUUIDs = deviceUUIDSet.ToArray(); + // public GroupMiners(GroupedDevices deviceUUIDSet) { + // _miners = new List(); + // _deviceNames = new SortedSet(); + // foreach (var uuid in deviceUUIDSet) { + // var tmpCdev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid); + // _deviceNames.Add(tmpCdev.NameCount); + // if (_deviceGroupType == DeviceGroupType.NONE) { + // _deviceGroupType = tmpCdev.DeviceGroupType; + // } + // } + // // init device uuids + // _deviceUUIDs = deviceUUIDSet.ToArray(); - DevicesInfoString = "{ " + string.Join(", ", _deviceNames) + " }"; - } + // DevicesInfoString = "{ " + string.Join(", ", _deviceNames) + " }"; + // } - private void StopMiner(Miner miner) { - if (miner.IsRunning) { - miner.Stop(MinerStopType.SWITCH); - // wait 0.5 seconds before going on - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - } - } + // private void StopMiner(Miner miner) { + // if (miner.IsRunning) { + // miner.Stop(MinerStopType.SWITCH); + // // wait 0.5 seconds before going on + // System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + // } + // } - public void Stop() { - foreach (var miner in _miners) { - StopMiner(miner); - } - } + // public void Stop() { + // foreach (var miner in _miners) { + // StopMiner(miner); + // } + // } - public void End() { - foreach (var miner in _miners) { - miner.End(); - } - } + // public void End() { + // foreach (var miner in _miners) { + // miner.End(); + // } + // } - public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string worker) { - bool containsSupportedMiner = false; - Miner startSwitchMiner = null; - var algorithmType = algorithm.NiceHashID; - foreach (var miner in _miners) { - if (miner.IsSupportedMinerAlgorithms(algorithmType)) { - containsSupportedMiner = true; - startSwitchMiner = miner; - break; - } - } - // check if contains miner if not create one - if (!containsSupportedMiner) { - startSwitchMiner = CreateMiner(_deviceGroupType, algorithmType); - startSwitchMiner.SetCDevs(_deviceUUIDs); - _miners.Add(startSwitchMiner); - } + // public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string worker) { + // bool containsSupportedMiner = false; + // Miner startSwitchMiner = null; + // var algorithmType = algorithm.NiceHashID; + // foreach (var miner in _miners) { + // if (miner.IsSupportedMinerAlgorithms(algorithmType)) { + // containsSupportedMiner = true; + // startSwitchMiner = miner; + // break; + // } + // } + // // check if contains miner if not create one + // if (!containsSupportedMiner) { + // startSwitchMiner = CreateMiner(_deviceGroupType, algorithmType); + // startSwitchMiner.SetCDevs(_deviceUUIDs); + // _miners.Add(startSwitchMiner); + // } - // hanlde CurrentWorkingMiner change - if (CurrentWorkingMiner != null && CurrentWorkingMiner != startSwitchMiner) { - StopMiner(CurrentWorkingMiner); - CurrentWorkingMiner = startSwitchMiner; - } else { - CurrentWorkingMiner = startSwitchMiner; - } - SwitchMinerAlgorithm(ref startSwitchMiner, algorithm, miningLocation, worker); - } + // // hanlde CurrentWorkingMiner change + // if (CurrentWorkingMiner != null && CurrentWorkingMiner != startSwitchMiner) { + // StopMiner(CurrentWorkingMiner); + // CurrentWorkingMiner = startSwitchMiner; + // } else { + // CurrentWorkingMiner = startSwitchMiner; + // } + // SwitchMinerAlgorithm(ref startSwitchMiner, algorithm, miningLocation, worker); + // } - private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string miningLocation, string worker) { - // if is running and the current algorithm is the same skip - if (m.IsRunning && m.CurrentAlgorithmType == algorithm.NiceHashID) { - return; - } + // private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string miningLocation, string worker) { + // // if is running and the current algorithm is the same skip + // if (m.IsRunning && m.CurrentAlgorithmType == algorithm.NiceHashID) { + // return; + // } - if (m.CurrentAlgorithmType != AlgorithmType.NONE && m.CurrentAlgorithmType != AlgorithmType.INVALID) { - m.Stop(MinerStopType.SWITCH); - // wait 0.5 seconds before going on - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - } + // if (m.CurrentAlgorithmType != AlgorithmType.NONE && m.CurrentAlgorithmType != AlgorithmType.INVALID) { + // m.Stop(MinerStopType.SWITCH); + // // wait 0.5 seconds before going on + // System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + // } - var MaxProfitKey = algorithm.NiceHashID; + // var MaxProfitKey = algorithm.NiceHashID; - // Wait before new start - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + // // Wait before new start + // System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - if (MaxProfitKey == AlgorithmType.Equihash) { - if (m.IsNHLocked) { - // TODO worker name not working with eqm - string BTC = worker.Substring(0, worker.IndexOf(".")); - m.Start(algorithm, miningLocation, BTC); - } else { - m.Start(algorithm, - Globals.NiceHashData[MaxProfitKey].name - + "." + miningLocation - + ".nicehash.com:" - + Globals.NiceHashData[MaxProfitKey].port, worker); - } - } else { - m.Start(algorithm, - "stratum+tcp://" - + Globals.NiceHashData[MaxProfitKey].name - + "." + miningLocation - + ".nicehash.com:" - + Globals.NiceHashData[MaxProfitKey].port, worker); - } - } - - } - } + // if (MaxProfitKey == AlgorithmType.Equihash) { + // if (m.IsNHLocked) { + // // TODO worker name not working with eqm + // string BTC = worker.Substring(0, worker.IndexOf(".")); + // m.Start(algorithm, miningLocation, BTC); + // } else { + // m.Start(algorithm, + // Globals.NiceHashData[MaxProfitKey].name + // + "." + miningLocation + // + ".nicehash.com:" + // + Globals.NiceHashData[MaxProfitKey].port, worker); + // } + // } else { + // m.Start(algorithm, + // "stratum+tcp://" + // + Globals.NiceHashData[MaxProfitKey].name + // + "." + miningLocation + // + ".nicehash.com:" + // + Globals.NiceHashData[MaxProfitKey].port, worker); + // } + // } + // } + //} } diff --git a/NiceHashMiner/Miners/ManagerPrivate/MinersManager_OLD.cs b/NiceHashMiner/Miners/ManagerPrivate/MinersManager_OLD.cs new file mode 100644 index 0000000..be32a31 --- /dev/null +++ b/NiceHashMiner/Miners/ManagerPrivate/MinersManager_OLD.cs @@ -0,0 +1,575 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Diagnostics; +using System.IO; + +using NiceHashMiner.Interfaces; +using NiceHashMiner.Configs; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; + + +using Timer = System.Timers.Timer; +using System.Timers; + +namespace NiceHashMiner.Miners { + // typedefs + using DeviceSubsetList = List>; + using PerDeviceProifitDictionary = Dictionary>; + using PerDeviceSpeedDictionary = Dictionary>; + + using GroupedDevices = SortedSet; + +// public partial class MinersManager_OLD : BaseLazySingleton { + +// // temporary varibales for current session +// PerDeviceSpeedDictionary _perDeviceSpeedDictionary; +// string _miningLocation; + +// string _workerBtcStringWorker; + +// //// ccminers intensity checking +// //public readonly Dictionary> CCMinersIntensitiesBoundries = new Dictionary>() { +// // { MinerPaths.ccminer_decred, Tuple.Create(8.0, 25.0) }, +// // { MinerPaths.ccminer_nanashi, Tuple.Create(8.0, 25.0) }, +// // { MinerPaths.ccminer_tpruvot, Tuple.Create(8.0, 25.0) }, +// // { MinerPaths.ccminer_neoscrypt, Tuple.Create(8.0, 31.0) }, +// // { MinerPaths.ccminer_sp, Tuple.Create(8.0, 31.0) }, +// //}; + +// // GroupDevices hash code doesn't work correctly use string instead +// //Dictionary _groupedDevicesMiners; +// Dictionary _groupedDevicesMiners; +// List _enabledDevices; +// List> _previousAllGroupedDevices; +// List> _currentAllGroupedDevices; + +// IMainFormRatesComunication _mainFormRatesComunication; + +// private Timer _preventSleepTimer; +// // check internet connection +// private Timer _internetCheckTimer; + +// private bool IsProfitable = true; +// private bool IsConnectedToInternet = true; + +// readonly string TAG; + +// readonly string DOUBLE_FORMAT = "F12"; + +// private bool IsCurrentlyIdle = true; + +// protected MinersManager_OLD() { +// TAG = this.GetType().Name; +// _preventSleepTimer = new Timer(); +// _preventSleepTimer.Elapsed += PreventSleepTimer_Tick; +// // sleep time is minimal 1 minute +// _preventSleepTimer.Interval = 20 * 1000; // leave this interval, it works + +// // set internet checking +// _internetCheckTimer = new Timer(); +// _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; +// _internetCheckTimer.Interval = 1000 * 30 * 1; // every minute or 5?? // 1000 * 60 * 1 +// } + +// private void InternetCheckTimer_Tick(object sender, EventArgs e) { +// if (ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { +// IsConnectedToInternet = Helpers.IsConnectedToInternet(); +// } +// } + +// private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { +// // when mining keep system awake, prevent sleep +// Helpers.PreventSleep(); +// } + +// public void StopAllMiners() { +// IsCurrentlyIdle = true; +// if (_groupedDevicesMiners != null) { +// foreach (var kv in _groupedDevicesMiners) { +// kv.Value.End(); +// } +// } +// if (_mainFormRatesComunication != null) { +// _mainFormRatesComunication.ClearRatesALL(); +// } + +// // restroe/enable sleep +// _preventSleepTimer.Stop(); +// _internetCheckTimer.Stop(); +// Helpers.AllowMonitorPowerdownAndSleep(); + +// // delete generated bin files +// // check for bins files +// var dirInfo = new DirectoryInfo(MinerPaths.nheqminer.Replace("nheqminer.exe", "")); +// var DONT_DELETE = "equiw200k9.bin"; +// var deleteContains = "equiw200k9"; +// var alwaysDeleteContains2 = "silentarmy_gpu"; +// if (dirInfo != null && dirInfo.Exists) { +// foreach (FileInfo file in dirInfo.GetFiles()) { +// if (file.Name != DONT_DELETE && file.Name.Contains(deleteContains)) { +// file.Delete(); +// } +// if (file.Name.Contains(alwaysDeleteContains2)) { +// file.Delete(); +// } +// } +// } +// } + +// public void StopAllMinersNonProfitable() { +// IsCurrentlyIdle = true; +// if (_groupedDevicesMiners != null) { +// foreach (var kv in _groupedDevicesMiners) { +// kv.Value.End(); +// } +// } +// if (_mainFormRatesComunication != null) { +// _mainFormRatesComunication.ClearRates(-1); +// } +// } + +// public string GetActiveMinersGroup() { +// if (IsCurrentlyIdle) { +// return "IDLE"; +// } + +// string ActiveMinersGroup = ""; + +// //get unique miner groups like CPU, NVIDIA, AMD,... +// HashSet UniqueMinerGroups = new HashSet(); +// foreach (var curDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { +// if (curDevice.Enabled) { +// UniqueMinerGroups.Add(curDevice.DeviceGroupString); +// } +// } +// if (UniqueMinerGroups.Count > 0 && IsProfitable) { +// ActiveMinersGroup = string.Join("/", UniqueMinerGroups); +// } + +// return ActiveMinersGroup; +// } + +// public static bool EquihashCPU_USE_eqm() { +// var mostOptimized = CPUUtils.GetMostOptimized(); +// return mostOptimized == CPUExtensionType.AVX || mostOptimized == CPUExtensionType.AVX2 +// || mostOptimized == CPUExtensionType.AVX_AES || mostOptimized == CPUExtensionType.AVX2_AES; +// } + +// // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() +// public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType algorithmType) { +// if (AlgorithmType.Equihash == algorithmType) { +// if (DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType +// || (EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { +// return new eqm(); +// } else { +// return new nheqminer(); +// } +// } else if (AlgorithmType.DaggerHashimoto == algorithmType) { +// if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { +// return new MinerEtherumOCL(); +// } else { +// return new MinerEtherumCUDA(); +// } +// } else { +// switch (deviceGroupType) { +// case DeviceGroupType.AMD_OpenCL: +// return new sgminer(); +// case DeviceGroupType.NVIDIA_2_1: +// return new ccminer_sm21(); +// case DeviceGroupType.NVIDIA_3_x: +// return new ccminer_sm3x(); +// case DeviceGroupType.NVIDIA_5_x: +// return new ccminer_sm5x(); +// case DeviceGroupType.NVIDIA_6_x: +// return new ccminer_sm6x(); +// case DeviceGroupType.CPU: +// return new cpuminer(); +// } +// } + +// return null; +// } + +// private string CalcGroupedDevicesKey(GroupedDevices group) { +// return string.Join(", ", group); +// } + +// public double GetTotalRate() { +// double TotalRate = 0; + +// if (_currentAllGroupedDevices != null) { +// foreach (var group in _currentAllGroupedDevices) { +// var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; +// TotalRate += groupMiners.CurrentWorkingMiner.CurrentRate; +// } +// } + +// return TotalRate; +// } + +// public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication, +// string miningLocation, string worker, string btcAdress) { +// _mainFormRatesComunication = mainFormRatesComunication; +// _miningLocation = miningLocation; + +// if (worker.Length > 0) +// _workerBtcStringWorker = btcAdress + "." + worker; +// else +// _workerBtcStringWorker = btcAdress; + +// _perDeviceSpeedDictionary = GetEnabledDeviceTypeSpeeds(); +// //_groupedDevicesMiners = new Dictionary(); +// _groupedDevicesMiners = new Dictionary(); +// _enabledDevices = new List(); +// _currentAllGroupedDevices = new List>(); + +// // assume profitable +// IsProfitable = true; +// // assume we have internet +// IsConnectedToInternet = true; + + +// // this checks if there are enabled devices and enabled algorithms +// bool isMiningEnabled = false; + +// foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { +// if (cdev.Enabled) { +// _enabledDevices.Add(cdev); +// // check if any algorithm enabled +// if(!isMiningEnabled) { +// foreach (var algorithm in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { +// if (!algorithm.Value.Skip) { +// isMiningEnabled = true; +// break; +// } +// } +// } +// } +// } + +// if (isMiningEnabled) { +// _preventSleepTimer.Start(); +// _internetCheckTimer.Start(); +// } + +// IsCurrentlyIdle = !isMiningEnabled; + +// return isMiningEnabled; +// } + +// /// +// /// GetEnabledDeviceTypeBenchmarks calculates currently enabled ComputeDevice benchmark speeds. +// /// If there are more cards of the same model it multiplies the speeds by it's count +// /// +// /// +// PerDeviceSpeedDictionary GetEnabledDeviceTypeSpeeds() { +// PerDeviceSpeedDictionary perDeviceTypeBenchmarks = new PerDeviceSpeedDictionary(); + +// // init algorithms count 0 +// foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { +// if (curCDev.Enabled) { +// Dictionary cumulativeSpeeds = new Dictionary(); +// var deviceConfig = curCDev.DeviceBenchmarkConfig; +// foreach (var kvp in deviceConfig.AlgorithmSettings) { +// var key = kvp.Key; +// cumulativeSpeeds[key] = 0; +// } +// perDeviceTypeBenchmarks[curCDev.UUID] = cumulativeSpeeds; +// } +// } +// // set enabled algorithm count per device counts +// foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { +// if (curCDev.Enabled) { +// Dictionary cumulativeSpeeds = perDeviceTypeBenchmarks[curCDev.UUID]; +// var deviceConfig = curCDev.DeviceBenchmarkConfig; +// foreach (var kvp in deviceConfig.AlgorithmSettings) { +// var key = kvp.Key; +// var algorithm = kvp.Value; +// // check dagger RAM SIZE +// if (algorithm.Skip +// || (algorithm.NiceHashID == AlgorithmType.DaggerHashimoto && !curCDev.IsEtherumCapale)) { +// // for now set to negative value as not profitable +// cumulativeSpeeds[key]--; +// } else { +// cumulativeSpeeds[key]++; +// } +// } +// } +// } +// // calculate benchmarks +// foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { +// if (curCDev.Enabled) { +// Dictionary cumulativeSpeeds = perDeviceTypeBenchmarks[curCDev.UUID]; +// var deviceConfig = curCDev.DeviceBenchmarkConfig; +// foreach (var kvp in deviceConfig.AlgorithmSettings) { +// var key = kvp.Key; +// var algorithm = kvp.Value; +// // instead of cumulative speeds get just if enabled or not count x > 0 => enabled; x < 0 => disabled +// if (cumulativeSpeeds[key] > 0) { +// cumulativeSpeeds[key] = algorithm.BenchmarkSpeed; +// } else { +// cumulativeSpeeds[key] = -1 * algorithm.BenchmarkSpeed; +// } +// } +// } +// } + +// return perDeviceTypeBenchmarks; +// } + + +// PerDeviceProifitDictionary GetEnabledDeviceProifitDictionary(PerDeviceSpeedDictionary speedDict, Dictionary NiceHashData) { +// PerDeviceProifitDictionary profitDict = new PerDeviceProifitDictionary(); + +// // log stuff +// int MAX_NAME_LEN = "daggerhashimoto".Length; +// int MAX_SPEED_LEN = 15; +// StringBuilder stringBuilderFull = new StringBuilder(); +// stringBuilderFull.AppendLine("Current device profits:"); + +// foreach (var nameBenchKvp in speedDict) { +// var deviceUUID = nameBenchKvp.Key; +// var curDevProfits = new Dictionary(); +// StringBuilder stringBuilderDevice = new StringBuilder(); +// stringBuilderDevice.AppendLine(String.Format("\tProfits for {0} ({1}):", deviceUUID, ComputeDeviceManager.Avaliable.GetNameForUUID(deviceUUID))); +// AlgorithmType mostProfitKey = AlgorithmType.NONE; +// double mostProfitAlgoVal = -1; +// foreach (var algoSpeedKvp in nameBenchKvp.Value) { +// // Log stuff and calculation +// string name = AlgorithmNiceHashNames.GetName(algoSpeedKvp.Key); +// int namePreatyCount = MAX_NAME_LEN - name.Length; +// if (namePreatyCount <= 0) { +// namePreatyCount = 1; +// } +// string namePreaty = name + new String(' ', namePreatyCount); +// bool isEnabled = algoSpeedKvp.Value > 0; +// double nhmSMADataVal = NiceHashData[algoSpeedKvp.Key].paying; +// // TODO what is the constant at the end? +// double algoProfit = algoSpeedKvp.Value * nhmSMADataVal * 0.000000001; + +// // calculate +// if (isEnabled) { +// curDevProfits.Add(algoSpeedKvp.Key, algoProfit); +// if (mostProfitAlgoVal < algoProfit) { +// mostProfitKey = algoSpeedKvp.Key; +// mostProfitAlgoVal = algoProfit; +// } +// } else { +// // if disabled make unprofitable +// curDevProfits.Add(algoSpeedKvp.Key, -1000000); +// algoProfit *= -1; // make bigger then 0 for logging reasons +// } +// // log stuff +// string speedStr = algoSpeedKvp.Value.ToString("F3"); +// int speedStrCount = MAX_SPEED_LEN - speedStr.Length; +// if (speedStrCount <= 0) { +// speedStrCount = 1; +// } +// string speedPreaty = new String(' ', speedStrCount) + speedStr; +// stringBuilderDevice.AppendLine(String.Format("\t\t{0}\t:\tPROFIT = {1} ({2}, SPEED = {3}, NHSMA = {4})", +// namePreaty, // Name +// algoProfit.ToString(DOUBLE_FORMAT), // Profit +// isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED +// speedPreaty, // Speed +// nhmSMADataVal.ToString(DOUBLE_FORMAT) // NiceHashData +// )); +// } +// // add profits +// profitDict.Add(deviceUUID, curDevProfits); +// // log stuff +// stringBuilderDevice.AppendLine(String.Format("\t\tMOST PROFITABLE (ENABLED) ALGO: {0}, PROFIT: {1}", +// AlgorithmNiceHashNames.GetName(mostProfitKey), +// mostProfitAlgoVal.ToString(DOUBLE_FORMAT))); +// stringBuilderFull.AppendLine(stringBuilderDevice.ToString()); +// } + +// Helpers.ConsolePrint(TAG, stringBuilderFull.ToString()); +// return profitDict; +// } + +// /// +// /// SwichMostProfitable should check the best combination for most profit. +// /// Calculate profit for each supported algorithm per device group. +// /// Build from ground up compatible devices and algorithms. +// /// See #region Groupping logic +// /// Device groups are CPU, AMD_OpenCL and NVIDIA CUDA SM.x.x. +// /// NVIDIA SMx.x should be paired separately except for daggerhashimoto. +// /// +// /// +// public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData) { +// var devProfits = GetEnabledDeviceProifitDictionary(_perDeviceSpeedDictionary, NiceHashData); + +//#if (SWITCH_TESTING) +// SwitchTesting.Instance.SetNext(ref devProfits, _enabledDevices); +//#endif +// double CurrentProfit = 0.0d; +// // calculate most profitable algorithm per enabled device +// foreach (var cdev in _enabledDevices) { +// var curDevProfits = devProfits[cdev.UUID]; +// double maxProfit = double.MinValue; +// AlgorithmType maxAlgorithmTypeKey = AlgorithmType.NONE; +// var algorithmSettings = cdev.DeviceBenchmarkConfig.AlgorithmSettings; + +// foreach (var kvpTypeProfit in curDevProfits) { +// if (algorithmSettings.ContainsKey(kvpTypeProfit.Key) +// && !algorithmSettings[kvpTypeProfit.Key].Skip +// && kvpTypeProfit.Value > 0.0d +// && maxProfit < kvpTypeProfit.Value) { +// // extra check if current device can't handle dagger +// if (AlgorithmType.DaggerHashimoto == kvpTypeProfit.Key && !cdev.IsEtherumCapale) { +// continue; +// } +// maxProfit = kvpTypeProfit.Value; +// maxAlgorithmTypeKey = kvpTypeProfit.Key; +// } +// } +// if(maxAlgorithmTypeKey == AlgorithmType.NONE) { +// cdev.MostProfitableAlgorithm = null; +// } else { +// cdev.MostProfitableAlgorithm +// = algorithmSettings[maxAlgorithmTypeKey]; +// // add most profitable to cumulative profit +// CurrentProfit += maxProfit; +// } +// } + +// // now if profitable check +// // TODO FOR NOW USD ONLY +// var currentProfitUSD = (CurrentProfit * Globals.BitcoinRate); +// Helpers.ConsolePrint(TAG, "Current Global profit: " + currentProfitUSD.ToString("F8") + " USD/Day"); +// if (!IsConnectedToInternet || (ConfigManager.Instance.GeneralConfig.MinimumProfit > 0 +// && currentProfitUSD < ConfigManager.Instance.GeneralConfig.MinimumProfit)) { +// IsProfitable = false; +// IsCurrentlyIdle = true; +// if (!IsConnectedToInternet) { +// // change msg +// Helpers.ConsolePrint(TAG, "NO INTERNET!!! Stopping mining."); +// _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NO_INTERNET_CONNECTION")); +// } else { +// _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NOT_PROFITABLE")); +// } +// // return don't group +// StopAllMinersNonProfitable(); +// Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); +// return; +// } else { +// IsProfitable = true; +// IsCurrentlyIdle = false; +// _mainFormRatesComunication.HideNotProfitable(); +// string profitabilityInfo = ConfigManager.Instance.GeneralConfig.MinimumProfit == 0 ? "mine always regardless of profit" : ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"; +// Helpers.ConsolePrint(TAG, "Current Global profit: IS PROFITABLE MinProfit " + profitabilityInfo); +// } + +// // group devices with same supported algorithms +// _previousAllGroupedDevices = _currentAllGroupedDevices; +// _currentAllGroupedDevices = new List>(); +// Dictionary newGroupAndAlgorithm = new Dictionary(); +// for (int first = 0; first < _enabledDevices.Count; ++first) { +// var firstDev = _enabledDevices[first]; +// // skip if no algorithm is profitable +// if (firstDev.MostProfitableAlgorithm == null) { +// Helpers.ConsolePrint("SwichMostProfitableGroupUpMethod", String.Format("Device {0}, MostProfitableAlgorithm == null", firstDev.Name)); +// continue; +// } +// // check if is in group +// bool isInGroup = false; +// foreach (var groupedDevices in _currentAllGroupedDevices) { +// if (groupedDevices.Contains(firstDev.UUID)) { +// isInGroup = true; +// break; +// } +// } +// if (isInGroup) continue; + +// var newGroup = new GroupedDevices(); +// newGroup.Add(firstDev.UUID); +// for (int second = first + 1; second < _enabledDevices.Count; ++second) { +// var secondDev = _enabledDevices[second]; +// // first check if second device has profitable algorithm +// if (secondDev.MostProfitableAlgorithm != null) { +// // check if we should group +// if (GroupingLogic.IsEquihashGroupLogic(firstDev, secondDev) +// || GroupingLogic.IsDaggerAndSameComputePlatform(firstDev, secondDev) +// || GroupingLogic.IsGroupBinaryAndAlgorithmSame(firstDev, secondDev)) { +// newGroup.Add(secondDev.UUID); +// } +// } +// } + +// _currentAllGroupedDevices.Add(newGroup); +// newGroupAndAlgorithm.Add(newGroup, firstDev.MostProfitableAlgorithm); +// } + +// // stop groupes that aren't in current group devices +// foreach (var curPrevGroup in _previousAllGroupedDevices) { +// var curPrevGroupKey = CalcGroupedDevicesKey(curPrevGroup); +// bool contains = false; +// foreach (var curCheckGroup in _currentAllGroupedDevices) { +// var curCheckGroupKey = CalcGroupedDevicesKey(curCheckGroup); +// if (curPrevGroupKey == curCheckGroupKey) { +// contains = true; +// break; +// } +// } +// if (!contains) { +// _groupedDevicesMiners[curPrevGroupKey].Stop(); +// } +// } +// // switch to newGroupAndAlgorithm most profitable algorithm +// foreach (var kvpGroupAlgorithm in newGroupAndAlgorithm) { +// var group = kvpGroupAlgorithm.Key; +// var algorithm = kvpGroupAlgorithm.Value; + +// GroupMiners currentGroupMiners; +// // try find if it doesn't exist create new +// string groupStringKey = CalcGroupedDevicesKey(group); +// if (!_groupedDevicesMiners.TryGetValue(groupStringKey, out currentGroupMiners)) { +// currentGroupMiners = new GroupMiners(group); +// _groupedDevicesMiners.Add(groupStringKey, currentGroupMiners); +// } +// currentGroupMiners.StartAlgorihtm(algorithm, _miningLocation, _workerBtcStringWorker); +// } + +// // stats quick fix code +// if (_currentAllGroupedDevices.Count != _previousAllGroupedDevices.Count) { +// MinerStatsCheck(NiceHashData); +// } +// } + +// public void MinerStatsCheck(Dictionary NiceHashData) { +// _mainFormRatesComunication.ClearRates(_currentAllGroupedDevices.Count); +// foreach (var group in _currentAllGroupedDevices) { +// var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; +// Miner m = groupMiners.CurrentWorkingMiner; + +// // skip if not running +// if (!m.IsRunning) continue; + +// APIData AD = m.GetSummary(); +// if (AD == null) { +// Helpers.ConsolePrint(m.MinerTAG(), "GetSummary returned null.."); +// } +// // set rates +// if (NiceHashData != null && AD != null) { +// m.CurrentRate = NiceHashData[AD.AlgorithmID].paying * AD.Speed * 0.000000001; +// } else { +// m.CurrentRate = 0; +// // set empty +// AD = new APIData() { +// AlgorithmID = m.CurrentAlgorithmType, +// AlgorithmName = AlgorithmNiceHashNames.GetName(m.CurrentAlgorithmType), +// Speed = 0.0d +// }; +// } + +// // Update GUI +// _mainFormRatesComunication.AddRateInfo(m.MinerTAG(), groupMiners.DevicesInfoString, AD, m.CurrentRate, m.IsAPIReadException); +// } +// } +// } +} diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index d0ec390..d11c46a 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -129,7 +129,7 @@ public Miner(DeviceType deviceType, DeviceGroupType deviceGroupType, string mine MINER_ID = MINER_ID_COUNT++; CDevs = new List(); DeviceType = deviceType; - DeviceGroupType = deviceGroupType; // Group types are not always important refactoring needed + DeviceGroupType = deviceGroupType; MinerDeviceName = minerDeviceName; //WorkingDirectory = @"bin\dlls"; diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs deleted file mode 100644 index 4bed8fd..0000000 --- a/NiceHashMiner/Miners/MinersManager.cs +++ /dev/null @@ -1,672 +0,0 @@ -using NiceHashMiner.Configs; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Diagnostics; - -using Timer = System.Timers.Timer; -using System.Timers; - -namespace NiceHashMiner.Miners { - // typedefs - using DeviceSubsetList = List>; - using PerDeviceProifitDictionary = Dictionary>; - using PerDeviceSpeedDictionary = Dictionary>; - - using GroupedDevices = SortedSet; - using AllGroupedDevices = List>; - using NiceHashMiner.Interfaces; - using System.IO; - - - - public partial class MinersManager : BaseLazySingleton { - - // temporary varibales for current session - PerDeviceSpeedDictionary _perDeviceSpeedDictionary; - string _miningLocation; - string _worker; - string _btcAdress; - - string _workerBtcStringWorker; - - //// ccminers intensity checking - //public readonly Dictionary> CCMinersIntensitiesBoundries = new Dictionary>() { - // { MinerPaths.ccminer_decred, Tuple.Create(8.0, 25.0) }, - // { MinerPaths.ccminer_nanashi, Tuple.Create(8.0, 25.0) }, - // { MinerPaths.ccminer_tpruvot, Tuple.Create(8.0, 25.0) }, - // { MinerPaths.ccminer_neoscrypt, Tuple.Create(8.0, 31.0) }, - // { MinerPaths.ccminer_sp, Tuple.Create(8.0, 31.0) }, - //}; - - // GroupDevices hash code doesn't work correctly use string instead - //Dictionary _groupedDevicesMiners; - Dictionary _groupedDevicesMiners; - List _enabledDevices; - AllGroupedDevices _previousAllGroupedDevices; - AllGroupedDevices _currentAllGroupedDevices; - - IMainFormRatesComunication _mainFormRatesComunication; - - private Timer _preventSleepTimer; - // check internet connection - private Timer _internetCheckTimer; - - private bool IsProfitable = true; - private bool IsConnectedToInternet = true; - - readonly string TAG; - - readonly string DOUBLE_FORMAT = "F12"; - - private bool IsCurrentlyIdle = true; - - protected MinersManager() { - TAG = this.GetType().Name; - _preventSleepTimer = new Timer(); - _preventSleepTimer.Elapsed += PreventSleepTimer_Tick; - // sleep time is minimal 1 minute - _preventSleepTimer.Interval = 20 * 1000; // leave this interval, it works - - // set internet checking - _internetCheckTimer = new Timer(); - _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; - _internetCheckTimer.Interval = 1000 * 30 * 1; // every minute or 5?? // 1000 * 60 * 1 - } - - private void InternetCheckTimer_Tick(object sender, EventArgs e) { - if (ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { - IsConnectedToInternet = Helpers.IsConnectedToInternet(); - } - } - - private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { - // when mining keep system awake, prevent sleep - Helpers.PreventSleep(); - } - - public void StopAllMiners() { - IsCurrentlyIdle = true; - if (_groupedDevicesMiners != null) { - foreach (var kv in _groupedDevicesMiners) { - kv.Value.End(); - } - } - if (_mainFormRatesComunication != null) { - _mainFormRatesComunication.ClearRatesALL(); - } - - // restroe/enable sleep - _preventSleepTimer.Stop(); - _internetCheckTimer.Stop(); - Helpers.AllowMonitorPowerdownAndSleep(); - - // delete generated bin files - // check for bins files - var dirInfo = new DirectoryInfo(MinerPaths.nheqminer.Replace("nheqminer.exe", "")); - var DONT_DELETE = "equiw200k9.bin"; - var deleteContains = "equiw200k9"; - var alwaysDeleteContains2 = "silentarmy_gpu"; - if (dirInfo != null && dirInfo.Exists) { - foreach (FileInfo file in dirInfo.GetFiles()) { - if (file.Name != DONT_DELETE && file.Name.Contains(deleteContains)) { - file.Delete(); - } - if (file.Name.Contains(alwaysDeleteContains2)) { - file.Delete(); - } - } - } - } - - public void StopAllMinersNonProfitable() { - IsCurrentlyIdle = true; - if (_groupedDevicesMiners != null) { - foreach (var kv in _groupedDevicesMiners) { - kv.Value.End(); - } - } - if (_mainFormRatesComunication != null) { - _mainFormRatesComunication.ClearRates(-1); - } - } - - public string GetActiveMinersGroup() { - if (IsCurrentlyIdle) { - return "IDLE"; - } - - string ActiveMinersGroup = ""; - - //get unique miner groups like CPU, NVIDIA, AMD,... - HashSet UniqueMinerGroups = new HashSet(); - foreach (var curDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (curDevice.Enabled) { - UniqueMinerGroups.Add(curDevice.DeviceGroupString); - } - } - if (UniqueMinerGroups.Count > 0 && IsProfitable) { - ActiveMinersGroup = string.Join("/", UniqueMinerGroups); - } - - return ActiveMinersGroup; - } - - public static bool EquihashCPU_USE_eqm() { - var mostOptimized = CPUUtils.GetMostOptimized(); - return mostOptimized == CPUExtensionType.AVX || mostOptimized == CPUExtensionType.AVX2 - || mostOptimized == CPUExtensionType.AVX_AES || mostOptimized == CPUExtensionType.AVX2_AES; - } - - // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() - public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType algorithmType) { - if (AlgorithmType.Equihash == algorithmType) { - if (DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType - || (EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { - return new eqm(); - } else { - return new nheqminer(); - } - } else if (AlgorithmType.DaggerHashimoto == algorithmType) { - if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { - return new MinerEtherumOCL(); - } else { - return new MinerEtherumCUDA(); - } - } else { - switch (deviceGroupType) { - case DeviceGroupType.AMD_OpenCL: - return new sgminer(); - case DeviceGroupType.NVIDIA_2_1: - return new ccminer_sm21(); - case DeviceGroupType.NVIDIA_3_x: - return new ccminer_sm3x(); - case DeviceGroupType.NVIDIA_5_x: - return new ccminer_sm5x(); - case DeviceGroupType.NVIDIA_6_x: - return new ccminer_sm6x(); - case DeviceGroupType.CPU: - return new cpuminer(); - } - } - - return null; - } - - private string CalcGroupedDevicesKey(GroupedDevices group) { - return string.Join(", ", group); - } - - public double GetTotalRate() { - double TotalRate = 0; - - if (_currentAllGroupedDevices != null) { - foreach (var group in _currentAllGroupedDevices) { - var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; - TotalRate += groupMiners.CurrentWorkingMiner.CurrentRate; - } - } - - return TotalRate; - } - - public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication, - string miningLocation, string worker, string btcAdress) { - _mainFormRatesComunication = mainFormRatesComunication; - _miningLocation = miningLocation; - _worker = worker; - _btcAdress = btcAdress; - - if (_worker.Length > 0) - _workerBtcStringWorker = _btcAdress + "." + _worker; - else - _workerBtcStringWorker = _btcAdress; - - _perDeviceSpeedDictionary = GetEnabledDeviceTypeSpeeds(); - //_groupedDevicesMiners = new Dictionary(); - _groupedDevicesMiners = new Dictionary(); - _enabledDevices = new List(); - _currentAllGroupedDevices = new AllGroupedDevices(); - - // assume profitable - IsProfitable = true; - // assume we have internet - IsConnectedToInternet = true; - - - // this checks if there are enabled devices and enabled algorithms - bool isMiningEnabled = false; - - foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cdev.Enabled) { - _enabledDevices.Add(cdev); - // check if any algorithm enabled - if(!isMiningEnabled) { - foreach (var algorithm in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { - if (!algorithm.Value.Skip) { - isMiningEnabled = true; - break; - } - } - } - } - } - - if (isMiningEnabled) { - _preventSleepTimer.Start(); - _internetCheckTimer.Start(); - } - - IsCurrentlyIdle = !isMiningEnabled; - - return isMiningEnabled; - } - - /// - /// GetEnabledDeviceTypeBenchmarks calculates currently enabled ComputeDevice benchmark speeds. - /// If there are more cards of the same model it multiplies the speeds by it's count - /// - /// - PerDeviceSpeedDictionary GetEnabledDeviceTypeSpeeds() { - PerDeviceSpeedDictionary perDeviceTypeBenchmarks = new PerDeviceSpeedDictionary(); - - // init algorithms count 0 - foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (curCDev.Enabled) { - Dictionary cumulativeSpeeds = new Dictionary(); - var deviceConfig = curCDev.DeviceBenchmarkConfig; - foreach (var kvp in deviceConfig.AlgorithmSettings) { - var key = kvp.Key; - cumulativeSpeeds[key] = 0; - } - perDeviceTypeBenchmarks[curCDev.UUID] = cumulativeSpeeds; - } - } - // set enabled algorithm count per device counts - foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (curCDev.Enabled) { - Dictionary cumulativeSpeeds = perDeviceTypeBenchmarks[curCDev.UUID]; - var deviceConfig = curCDev.DeviceBenchmarkConfig; - foreach (var kvp in deviceConfig.AlgorithmSettings) { - var key = kvp.Key; - var algorithm = kvp.Value; - // check dagger RAM SIZE - if (algorithm.Skip - || (algorithm.NiceHashID == AlgorithmType.DaggerHashimoto && !curCDev.IsEtherumCapale)) { - // for now set to negative value as not profitable - cumulativeSpeeds[key]--; - } else { - cumulativeSpeeds[key]++; - } - } - } - } - // calculate benchmarks - foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (curCDev.Enabled) { - Dictionary cumulativeSpeeds = perDeviceTypeBenchmarks[curCDev.UUID]; - var deviceConfig = curCDev.DeviceBenchmarkConfig; - foreach (var kvp in deviceConfig.AlgorithmSettings) { - var key = kvp.Key; - var algorithm = kvp.Value; - // instead of cumulative speeds get just if enabled or not count x > 0 => enabled; x < 0 => disabled - if (cumulativeSpeeds[key] > 0) { - cumulativeSpeeds[key] = algorithm.BenchmarkSpeed; - } else { - cumulativeSpeeds[key] = -1 * algorithm.BenchmarkSpeed; - } - } - } - } - - return perDeviceTypeBenchmarks; - } - - - PerDeviceProifitDictionary GetEnabledDeviceProifitDictionary(PerDeviceSpeedDictionary speedDict, Dictionary NiceHashData) { - PerDeviceProifitDictionary profitDict = new PerDeviceProifitDictionary(); - - // log stuff - int MAX_NAME_LEN = "daggerhashimoto".Length; - int MAX_SPEED_LEN = 15; - StringBuilder stringBuilderFull = new StringBuilder(); - stringBuilderFull.AppendLine("Current device profits:"); - - foreach (var nameBenchKvp in speedDict) { - var deviceUUID = nameBenchKvp.Key; - var curDevProfits = new Dictionary(); - StringBuilder stringBuilderDevice = new StringBuilder(); - stringBuilderDevice.AppendLine(String.Format("\tProfits for {0} ({1}):", deviceUUID, ComputeDeviceManager.Avaliable.GetNameForUUID(deviceUUID))); - AlgorithmType mostProfitKey = AlgorithmType.NONE; - double mostProfitAlgoVal = -1; - foreach (var algoSpeedKvp in nameBenchKvp.Value) { - // Log stuff and calculation - string name = AlgorithmNiceHashNames.GetName(algoSpeedKvp.Key); - int namePreatyCount = MAX_NAME_LEN - name.Length; - if (namePreatyCount <= 0) { - namePreatyCount = 1; - } - string namePreaty = name + new String(' ', namePreatyCount); - bool isEnabled = algoSpeedKvp.Value > 0; - double nhmSMADataVal = NiceHashData[algoSpeedKvp.Key].paying; - // TODO what is the constant at the end? - double algoProfit = algoSpeedKvp.Value * nhmSMADataVal * 0.000000001; - - // calculate - if (isEnabled) { - curDevProfits.Add(algoSpeedKvp.Key, algoProfit); - if (mostProfitAlgoVal < algoProfit) { - mostProfitKey = algoSpeedKvp.Key; - mostProfitAlgoVal = algoProfit; - } - } else { - // if disabled make unprofitable - curDevProfits.Add(algoSpeedKvp.Key, -1000000); - algoProfit *= -1; // make bigger then 0 for logging reasons - } - // log stuff - string speedStr = algoSpeedKvp.Value.ToString("F3"); - int speedStrCount = MAX_SPEED_LEN - speedStr.Length; - if (speedStrCount <= 0) { - speedStrCount = 1; - } - string speedPreaty = new String(' ', speedStrCount) + speedStr; - stringBuilderDevice.AppendLine(String.Format("\t\t{0}\t:\tPROFIT = {1} ({2}, SPEED = {3}, NHSMA = {4})", - namePreaty, // Name - algoProfit.ToString(DOUBLE_FORMAT), // Profit - isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED - speedPreaty, // Speed - nhmSMADataVal.ToString(DOUBLE_FORMAT) // NiceHashData - )); - } - // add profits - profitDict.Add(deviceUUID, curDevProfits); - // log stuff - stringBuilderDevice.AppendLine(String.Format("\t\tMOST PROFITABLE (ENABLED) ALGO: {0}, PROFIT: {1}", - AlgorithmNiceHashNames.GetName(mostProfitKey), - mostProfitAlgoVal.ToString(DOUBLE_FORMAT))); - stringBuilderFull.AppendLine(stringBuilderDevice.ToString()); - } - - Helpers.ConsolePrint(TAG, stringBuilderFull.ToString()); - return profitDict; - } - - #region Groupping logic - private bool IsAlgorithmSettingsSame(Algorithm a, Algorithm b) { - return a.NiceHashID == b.NiceHashID -#if (SWITCH_TESTING) - && (!ForcePerCardMiners) // this will force individual miners -#endif -; - } - - private bool IsNvidiaDevice(ComputeDevice a) { - return a.DeviceType == DeviceType.NVIDIA; - } - - private bool IsEquihashGroupLogic(ComputeDevice a, ComputeDevice b) { - // eqm - if (IsEquihashDevice_eqm(a) && IsEquihashDevice_eqm(b)) { // both eqm - return IsEquihashAnd_eqm(a, b); - } - // nheqmnier - else if (!IsEquihashDevice_eqm(a) && !IsEquihashDevice_eqm(b)) { // both NOT eqm - return IsEquihashAnd_nheqminer(a, b); - } - return false; - } - - // nheqminer - private bool IsEquihashAnd_nheqminer(ComputeDevice a, ComputeDevice b) { - return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash - && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID - && IsEquihashAnd_CPU_nheqminer(a) - && IsEquihashAnd_CPU_nheqminer(b); - } - // group only first CPU split - private bool IsEquihashAnd_CPU_nheqminer(ComputeDevice a) { - return a.DeviceType != DeviceType.CPU // if not cpu then ignore case always good - || a.ID == 0; // if CPU ID must be 0 - } - - // eqm - private bool IsEquihashAnd_eqm(ComputeDevice a, ComputeDevice b) { - return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash - && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID; - } - private bool IsEquihashDevice_eqm(ComputeDevice a) { - return IsEquihashCPU_eqm(a) || IsEquihashNVIDIA_eqm(a); - } - private bool IsEquihashCPU_eqm(ComputeDevice a) { - return MinersManager.EquihashCPU_USE_eqm() && a.DeviceType == DeviceType.CPU; - } - private bool IsEquihashNVIDIA_eqm(ComputeDevice a) { - return a.DeviceGroupType == DeviceGroupType.NVIDIA_5_x || a.DeviceGroupType == DeviceGroupType.NVIDIA_6_x; - } - - // checks if dagger algo, same settings and if compute platform is same - private bool IsDaggerAndSameComputePlatform(ComputeDevice a, ComputeDevice b) { - return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto - && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID //IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) - // check if both etherum capable - && a.IsEtherumCapale && b.IsEtherumCapale - // compute platforms must be same - && (IsNvidiaDevice(a) == IsNvidiaDevice(b)); - } - - private bool IsNotCpuGroups(ComputeDevice a, ComputeDevice b) { - return a.DeviceGroupType != DeviceGroupType.CPU && b.DeviceGroupType != DeviceGroupType.CPU; - } - - // this will not check Ethminer path - private bool IsSameBinPath(ComputeDevice a, ComputeDevice b) { - // same group uses same Miner class and therefore same binary path for same algorithm - bool sameGroup = a.DeviceGroupType == b.DeviceGroupType; - if (!sameGroup) { - var a_algoType = a.MostProfitableAlgorithm.NiceHashID; - var b_algoType = b.MostProfitableAlgorithm.NiceHashID; - // a and b algorithm settings should be the same if we call this function - return MinerPaths.GetOptimizedMinerPath(a_algoType, a.DeviceType, a.DeviceGroupType, a.Codename, a.IsOptimizedVersion) - == MinerPaths.GetOptimizedMinerPath(b_algoType, b.DeviceType, b.DeviceGroupType, b.Codename, b.IsOptimizedVersion); - } - - return true; - } - - // we don't want to group CPU devices - private bool IsGroupBinaryAndAlgorithmSame(ComputeDevice a, ComputeDevice b) { - return IsNotCpuGroups(a, b) - && IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) - && IsSameBinPath(a, b); - } - #endregion //Groupping logic - - /// - /// SwichMostProfitable should check the best combination for most profit. - /// Calculate profit for each supported algorithm per device group. - /// Build from ground up compatible devices and algorithms. - /// See #region Groupping logic - /// Device groups are CPU, AMD_OpenCL and NVIDIA CUDA SM.x.x. - /// NVIDIA SMx.x should be paired separately except for daggerhashimoto. - /// - /// - public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData) { - var devProfits = GetEnabledDeviceProifitDictionary(_perDeviceSpeedDictionary, NiceHashData); - -#if (SWITCH_TESTING) - SwitchTesting.Instance.SetNext(ref devProfits, _enabledDevices); -#endif - double CurrentProfit = 0.0d; - // calculate most profitable algorithm per enabled device - foreach (var cdev in _enabledDevices) { - var curDevProfits = devProfits[cdev.UUID]; - double maxProfit = double.MinValue; - AlgorithmType maxAlgorithmTypeKey = AlgorithmType.NONE; - var algorithmSettings = cdev.DeviceBenchmarkConfig.AlgorithmSettings; - - foreach (var kvpTypeProfit in curDevProfits) { - if (algorithmSettings.ContainsKey(kvpTypeProfit.Key) - && !algorithmSettings[kvpTypeProfit.Key].Skip - && kvpTypeProfit.Value > 0.0d - && maxProfit < kvpTypeProfit.Value) { - // extra check if current device can't handle dagger - if (AlgorithmType.DaggerHashimoto == kvpTypeProfit.Key && !cdev.IsEtherumCapale) { - continue; - } - maxProfit = kvpTypeProfit.Value; - maxAlgorithmTypeKey = kvpTypeProfit.Key; - } - } - if(maxAlgorithmTypeKey == AlgorithmType.NONE) { - cdev.MostProfitableAlgorithm = null; - } else { - cdev.MostProfitableAlgorithm - = algorithmSettings[maxAlgorithmTypeKey]; - // add most profitable to cumulative profit - CurrentProfit += maxProfit; - } - } - - // now if profitable check - // TODO FOR NOW USD ONLY - var currentProfitUSD = (CurrentProfit * Globals.BitcoinRate); - Helpers.ConsolePrint(TAG, "Current Global profit: " + currentProfitUSD.ToString("F8") + " USD/Day"); - if (!IsConnectedToInternet || (ConfigManager.Instance.GeneralConfig.MinimumProfit > 0 - && currentProfitUSD < ConfigManager.Instance.GeneralConfig.MinimumProfit)) { - IsProfitable = false; - IsCurrentlyIdle = true; - if (!IsConnectedToInternet) { - // change msg - Helpers.ConsolePrint(TAG, "NO INTERNET!!! Stopping mining."); - _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NO_INTERNET_CONNECTION")); - } else { - _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NOT_PROFITABLE")); - } - // return don't group - StopAllMinersNonProfitable(); - Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); - return; - } else { - IsProfitable = true; - IsCurrentlyIdle = false; - _mainFormRatesComunication.HideNotProfitable(); - string profitabilityInfo = ConfigManager.Instance.GeneralConfig.MinimumProfit == 0 ? "mine always regardless of profit" : ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"; - Helpers.ConsolePrint(TAG, "Current Global profit: IS PROFITABLE MinProfit " + profitabilityInfo); - } - - // group devices with same supported algorithms - _previousAllGroupedDevices = _currentAllGroupedDevices; - _currentAllGroupedDevices = new AllGroupedDevices(); - Dictionary newGroupAndAlgorithm = new Dictionary(); - for (int first = 0; first < _enabledDevices.Count; ++first) { - var firstDev = _enabledDevices[first]; - // skip if no algorithm is profitable - if (firstDev.MostProfitableAlgorithm == null) { - Helpers.ConsolePrint("SwichMostProfitableGroupUpMethod", String.Format("Device {0}, MostProfitableAlgorithm == null", firstDev.Name)); - continue; - } - // check if is in group - bool isInGroup = false; - foreach (var groupedDevices in _currentAllGroupedDevices) { - if (groupedDevices.Contains(firstDev.UUID)) { - isInGroup = true; - break; - } - } - if (isInGroup) continue; - - var newGroup = new GroupedDevices(); - newGroup.Add(firstDev.UUID); - for (int second = first + 1; second < _enabledDevices.Count; ++second) { - var secondDev = _enabledDevices[second]; - // first check if second device has profitable algorithm - if (secondDev.MostProfitableAlgorithm != null) { - // check if we should group - if (IsEquihashGroupLogic(firstDev, secondDev) - || IsDaggerAndSameComputePlatform(firstDev, secondDev) - || IsGroupBinaryAndAlgorithmSame(firstDev, secondDev)) { - newGroup.Add(secondDev.UUID); - } - } - } - - _currentAllGroupedDevices.Add(newGroup); - newGroupAndAlgorithm.Add(newGroup, firstDev.MostProfitableAlgorithm); - } - - // stop groupes that aren't in current group devices - foreach (var curPrevGroup in _previousAllGroupedDevices) { - var curPrevGroupKey = CalcGroupedDevicesKey(curPrevGroup); - bool contains = false; - foreach (var curCheckGroup in _currentAllGroupedDevices) { - var curCheckGroupKey = CalcGroupedDevicesKey(curCheckGroup); - if (curPrevGroupKey == curCheckGroupKey) { - contains = true; - break; - } - } - if (!contains) { - _groupedDevicesMiners[curPrevGroupKey].Stop(); - } - } - // switch to newGroupAndAlgorithm most profitable algorithm - foreach (var kvpGroupAlgorithm in newGroupAndAlgorithm) { - var group = kvpGroupAlgorithm.Key; - var algorithm = kvpGroupAlgorithm.Value; - - GroupMiners currentGroupMiners; - // try find if it doesn't exist create new - string groupStringKey = CalcGroupedDevicesKey(group); - if (!_groupedDevicesMiners.TryGetValue(groupStringKey, out currentGroupMiners)) { - currentGroupMiners = new GroupMiners(group); - _groupedDevicesMiners.Add(groupStringKey, currentGroupMiners); - } - currentGroupMiners.StartAlgorihtm(algorithm, _miningLocation, _workerBtcStringWorker); - } - - // stats quick fix code - if (_currentAllGroupedDevices.Count != _previousAllGroupedDevices.Count) { - MinerStatsCheck(NiceHashData); - } - } - - public void MinerStatsCheck(Dictionary NiceHashData) { - _mainFormRatesComunication.ClearRates(_currentAllGroupedDevices.Count); - foreach (var group in _currentAllGroupedDevices) { - var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; - Miner m = groupMiners.CurrentWorkingMiner; - - // skip if not running - if (!m.IsRunning) continue; - - APIData AD = m.GetSummary(); - if (AD == null) { - Helpers.ConsolePrint(m.MinerTAG(), "GetSummary returned null.."); - } - // set rates - if (NiceHashData != null && AD != null) { - m.CurrentRate = NiceHashData[AD.AlgorithmID].paying * AD.Speed * 0.000000001; - } else { - m.CurrentRate = 0; - // set empty - AD = new APIData() { - AlgorithmID = m.CurrentAlgorithmType, - AlgorithmName = AlgorithmNiceHashNames.GetName(m.CurrentAlgorithmType), - Speed = 0.0d - }; - } - - // Update GUI - _mainFormRatesComunication.AddRateInfo(m.MinerTAG(), groupMiners.DevicesInfoString, AD, m.CurrentRate, m.IsAPIReadException); - } - } - - - } -} diff --git a/NiceHashMiner/Miners/MinersManager_NEW.cs b/NiceHashMiner/Miners/MinersManager_NEW.cs new file mode 100644 index 0000000..80f2b52 --- /dev/null +++ b/NiceHashMiner/Miners/MinersManager_NEW.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; + +using NiceHashMiner.Interfaces; +using NiceHashMiner.Configs; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; + +namespace NiceHashMiner.Miners { + // typedefs + using DeviceSubsetList = List>; + using PerDeviceSpeedDictionary = Dictionary>; + + using GroupedDevices = SortedSet; + public class MinersManager_NEW : BaseLazySingleton { + + private MiningSession CurMiningSession; + + public void StopAllMiners() { + if (CurMiningSession != null) CurMiningSession.StopAllMiners(); + } + + public void StopAllMinersNonProfitable() { + if (CurMiningSession != null) CurMiningSession.StopAllMinersNonProfitable(); + } + + public string GetActiveMinersGroup() { + if (CurMiningSession != null) { + return CurMiningSession.GetActiveMinersGroup(); + } + // if no session it is idle + return "IDLE"; + } + + public static bool EquihashCPU_USE_eqm() { + var mostOptimized = CPUUtils.GetMostOptimized(); + return mostOptimized == CPUExtensionType.AVX || mostOptimized == CPUExtensionType.AVX2 + || mostOptimized == CPUExtensionType.AVX_AES || mostOptimized == CPUExtensionType.AVX2_AES; + } + + // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() + public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType algorithmType) { + if (AlgorithmType.Equihash == algorithmType) { + if (DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType + || (EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { + return new eqm(); + } else { + return new nheqminer(); + } + } else if (AlgorithmType.DaggerHashimoto == algorithmType) { + if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { + return new MinerEtherumOCL(); + } else { + return new MinerEtherumCUDA(); + } + } else { + switch (deviceGroupType) { + case DeviceGroupType.AMD_OpenCL: + return new sgminer(); + case DeviceGroupType.NVIDIA_2_1: + return new ccminer_sm21(); + case DeviceGroupType.NVIDIA_3_x: + return new ccminer_sm3x(); + case DeviceGroupType.NVIDIA_5_x: + return new ccminer_sm5x(); + case DeviceGroupType.NVIDIA_6_x: + return new ccminer_sm6x(); + case DeviceGroupType.CPU: + return new cpuminer(); + } + } + + return null; + } + + public double GetTotalRate() { + if (CurMiningSession != null) return CurMiningSession.GetTotalRate(); + return 0; + } + + public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication, + string miningLocation, string worker, string btcAdress) { + + CurMiningSession = new MiningSession(ComputeDeviceManager.Avaliable.AllAvaliableDevices, + mainFormRatesComunication, miningLocation, worker, btcAdress); + + return CurMiningSession.IsMiningEnabled; + } + + + + /// + /// SwichMostProfitable should check the best combination for most profit. + /// Calculate profit for each supported algorithm per device group. + /// Build from ground up compatible devices and algorithms. + /// See #region Groupping logic + /// Device groups are CPU, AMD_OpenCL and NVIDIA CUDA SM.x.x. + /// NVIDIA SMx.x should be paired separately except for daggerhashimoto. + /// + /// + public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData) { + if (CurMiningSession != null) CurMiningSession.SwichMostProfitableGroupUpMethod(NiceHashData); + } + + public void MinerStatsCheck(Dictionary NiceHashData) { + if (CurMiningSession != null) CurMiningSession.MinerStatsCheck(NiceHashData); + } + } +} diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs new file mode 100644 index 0000000..f279f0e --- /dev/null +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -0,0 +1,599 @@ +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using NiceHashMiner.Interfaces; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Timer = System.Timers.Timer; +using System.Timers; + +namespace NiceHashMiner.Miners { + using GroupedDevices = SortedSet; + using NiceHashMiner.Configs; + using System.IO; + public class MiningSession { + const string TAG = "MiningSession"; + const string DOUBLE_FORMAT = "F12"; + + // session varibles fixed + string _miningLocation = ""; + string _workerBtcStringWorker = ""; + List _miningDevices = new List(); + IMainFormRatesComunication _mainFormRatesComunication; + + // session varibles changing + // GroupDevices hash code doesn't work correctly use string instead + //Dictionary _groupedDevicesMiners; + Dictionary _groupedDevicesMiners = new Dictionary(); + List> _previousAllGroupedDevices = new List(); + List> _currentAllGroupedDevices = new List(); + + + private bool IsProfitable = true; + + private bool IsConnectedToInternet = true; + private bool IsMiningRegardlesOfProfit = true; + + // timers + private Timer _preventSleepTimer; + // check internet connection + private Timer _internetCheckTimer; + + // + private Timer _miningStatusCheckTimer; + bool CheckStatus = false; + + public bool IsMiningEnabled { + get { + // if this is not empty it means we can mine + return _miningDevices.Count > 0; + } + } + + private bool IsCurrentlyIdle { + get { + return !IsMiningEnabled || !IsConnectedToInternet || !IsProfitable; + } + } + + public MiningSession(List devices, + IMainFormRatesComunication mainFormRatesComunication, + string miningLocation, string worker, string btcAdress) { + // init fixed + _mainFormRatesComunication = mainFormRatesComunication; + _miningLocation = miningLocation; + + if (worker.Length > 0) + _workerBtcStringWorker = btcAdress + "." + worker; + else + _workerBtcStringWorker = btcAdress; + + // initial settup + { + // used for logging + List> disabledDevicesStatuses = new List>(); + // logging and settup + List enabledDevices = new List(); + // get enabled devices + { + // check passed devices statuses + List> devicesStatuses = new List>(); + foreach (var device in devices) { + devicesStatuses.Add(getDeviceMiningStatus(device)); + } + // sort device statuses + foreach (var deviceStatus in devicesStatuses) { + if (deviceStatus.Item2 == DeviceMiningStatus.CanMine) { + enabledDevices.Add(deviceStatus.Item1); + } else { + disabledDevicesStatuses.Add(deviceStatus); + } + } + } + // print statuses + if (disabledDevicesStatuses.Count > 0) { + Helpers.ConsolePrint(TAG, "Disabled Devices:"); + foreach (var deviceStatus in disabledDevicesStatuses) { + ComputeDevice device = deviceStatus.Item1; + DeviceMiningStatus status = deviceStatus.Item2; + if (status == DeviceMiningStatus.DeviceNull) { + Helpers.ConsolePrint(TAG, "Critical Device is NULL"); + } else if (status == DeviceMiningStatus.Disabled) { + Helpers.ConsolePrint(TAG, String.Format("DISABLED ({0})", device.GetFullName())); + } else if (status == DeviceMiningStatus.NoEnabledAlgorithms) { + Helpers.ConsolePrint(TAG, String.Format("No Enabled Algorithms ({0})", device.GetFullName())); + } + } + } + if (enabledDevices.Count > 0) { + // print enabled + Helpers.ConsolePrint(TAG, "Enabled Devices for Mining session:"); + foreach (var device in enabledDevices) { + Helpers.ConsolePrint(TAG, String.Format("ENABLED ({0})", device.GetFullName())); + foreach (var algo in device.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + var isEnabled = IsAlgoMiningCapable(algo); + Helpers.ConsolePrint(TAG, String.Format("\t\tALGORITHM {0} ({1})", + isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED + AlgorithmNiceHashNames.GetName(algo.NiceHashID))); + } + } + // settup mining devices + foreach (var device in enabledDevices) { + _miningDevices.Add(new MiningDevice(device)); + } + } + } + if (_miningDevices.Count > 0) { + // calculate avarage speeds, to ensure mining stability + // device name, algo key, algos refs list + Dictionary>> avarager = new Dictionary>>(); + // init empty avarager + foreach (var device in _miningDevices) { + string devName = device.Device.Name; + avarager[devName] = new Dictionary>(); + foreach (var key in AlgorithmNiceHashNames.GetAllAvaliableTypes()) { + avarager[devName][key] = new List(); + } + } + // fill avarager + foreach (var device in _miningDevices) { + string devName = device.Device.Name; + foreach (var kvp in device.Algorithms) { + var key = kvp.Key; + MiningAlgorithm algo = kvp.Value; + avarager[devName][key].Add(algo); + } + } + // calculate avarages + foreach (var devDict in avarager.Values) { + foreach (List miningAlgosList in devDict.Values) { + // if list not empty calculate avarage + if (miningAlgosList.Count > 0) { + // calculate avarage + double sum = 0; + foreach (var algo in miningAlgosList) { + sum += algo.AvaragedSpeed; + } + double avarageSpeed = sum / miningAlgosList.Count; + // set avarage + foreach (var algo in miningAlgosList) { + algo.AvaragedSpeed = avarageSpeed; + } + } + } + } + } + + // init timer stuff + _preventSleepTimer = new Timer(); + _preventSleepTimer.Elapsed += PreventSleepTimer_Tick; + // sleep time is minimal 1 minute + _preventSleepTimer.Interval = 20 * 1000; // leave this interval, it works + + // set internet checking + _internetCheckTimer = new Timer(); + _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; + _internetCheckTimer.Interval = 1000 * 30 * 1; // every minute or 5?? // 1000 * 60 * 1 + + _miningStatusCheckTimer = new Timer(); + _miningStatusCheckTimer.Elapsed += MiningStatusCheckTimer_Tick; + _miningStatusCheckTimer.Interval = 1000 * 30; + + // assume profitable + IsProfitable = true; + // assume we have internet + IsConnectedToInternet = true; + + if (IsMiningEnabled) { + _preventSleepTimer.Start(); + _internetCheckTimer.Start(); + _miningStatusCheckTimer.Start(); + } + + IsMiningRegardlesOfProfit = ConfigManager.Instance.GeneralConfig.MinimumProfit == 0; + } + + #region Timers stuff + private void InternetCheckTimer_Tick(object sender, EventArgs e) { + if (ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { + IsConnectedToInternet = Helpers.IsConnectedToInternet(); + } + } + + private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { + // when mining keep system awake, prevent sleep + Helpers.PreventSleep(); + } + + private void MiningStatusCheckTimer_Tick(object sender, ElapsedEventArgs e) { + CheckStatus = true; + } + #endregion + + #region CanMine Checking + + static bool IsAlgoMiningCapable(Algorithm algo) { + return algo != null && !algo.Skip && algo.BenchmarkSpeed > 0; + } + + Tuple getDeviceMiningStatus(ComputeDevice device) { + DeviceMiningStatus status = DeviceMiningStatus.CanMine; + if (device == null) { // C# is null happy + status = DeviceMiningStatus.DeviceNull; + } else if(device.Enabled == false) { + status = DeviceMiningStatus.Disabled; + } else { + bool hasEnabledAlgo = false; + foreach(Algorithm algo in device.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + hasEnabledAlgo |= IsAlgoMiningCapable(algo); + } + if (hasEnabledAlgo == false) { + status = DeviceMiningStatus.NoEnabledAlgorithms; + } + } + return new Tuple(device, status); + } + #endregion CanMine Checking + + #region Start/Stop + public void StopAllMiners() { + if (_groupedDevicesMiners != null) { + foreach (var kv in _groupedDevicesMiners) { + kv.Value.End(); + } + } + if (_mainFormRatesComunication != null) { + _mainFormRatesComunication.ClearRatesALL(); + } + + // restroe/enable sleep + _preventSleepTimer.Stop(); + _internetCheckTimer.Stop(); + _miningStatusCheckTimer.Stop(); + Helpers.AllowMonitorPowerdownAndSleep(); + + // delete generated bin files + // check for bins files + var dirInfo = new DirectoryInfo(MinerPaths.nheqminer.Replace("nheqminer.exe", "")); + var DONT_DELETE = "equiw200k9.bin"; + var deleteContains = "equiw200k9"; + var alwaysDeleteContains2 = "silentarmy_gpu"; + if (dirInfo != null && dirInfo.Exists) { + foreach (FileInfo file in dirInfo.GetFiles()) { + if (file.Name != DONT_DELETE && file.Name.Contains(deleteContains)) { + file.Delete(); + } + if (file.Name.Contains(alwaysDeleteContains2)) { + file.Delete(); + } + } + } + } + + public void StopAllMinersNonProfitable() { + if (_groupedDevicesMiners != null) { + foreach (var kv in _groupedDevicesMiners) { + kv.Value.End(); + } + } + if (_mainFormRatesComunication != null) { + _mainFormRatesComunication.ClearRates(-1); + } + } + #endregion Start/Stop + + private string CalcGroupedDevicesKey(GroupedDevices group) { + return string.Join(", ", group); + } + + public string GetActiveMinersGroup() { + if (IsCurrentlyIdle) { + return "IDLE"; + } + + string ActiveMinersGroup = ""; + + //get unique miner groups like CPU, NVIDIA, AMD,... + HashSet UniqueMinerGroups = new HashSet(); + foreach (var curDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + if (curDevice.Enabled) { + UniqueMinerGroups.Add(curDevice.DeviceGroupString); + } + } + if (UniqueMinerGroups.Count > 0 && IsProfitable) { + ActiveMinersGroup = string.Join("/", UniqueMinerGroups); + } + + return ActiveMinersGroup; + } + + public double GetTotalRate() { + double TotalRate = 0; + + if (_currentAllGroupedDevices != null) { + foreach (var group in _currentAllGroupedDevices) { + var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; + TotalRate += groupMiners.CurrentWorkingMiner.CurrentRate; + } + } + + return TotalRate; + } + + // full of state + private bool CheckIfProfitable(double CurrentProfit, bool log = true) { + // TODO FOR NOW USD ONLY + var currentProfitUSD = (CurrentProfit * Globals.BitcoinRate); + IsProfitable = + IsMiningRegardlesOfProfit + || !IsMiningRegardlesOfProfit && currentProfitUSD >= ConfigManager.Instance.GeneralConfig.MinimumProfit; + if (log) { + Helpers.ConsolePrint(TAG, "Current Global profit: " + currentProfitUSD.ToString("F8") + " USD/Day"); + if (!IsProfitable) { + Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); + } else { + string profitabilityInfo = IsMiningRegardlesOfProfit ? "mine always regardless of profit" : ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"; + Helpers.ConsolePrint(TAG, "Current Global profit: IS PROFITABLE MinProfit " + profitabilityInfo); + } + } + return IsProfitable; + } + + private bool CheckIfShouldMine(double CurrentProfit, bool log = true) { + // if profitable and connected to internet mine + bool shouldMine = CheckIfProfitable(CurrentProfit, log) && IsConnectedToInternet; + if (shouldMine) { + _mainFormRatesComunication.HideNotProfitable(); + } else { + if (!IsConnectedToInternet) { + // change msg + if (log) Helpers.ConsolePrint(TAG, "NO INTERNET!!! Stopping mining."); + _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NO_INTERNET_CONNECTION")); + } else { + _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NOT_PROFITABLE")); + } + // return don't group + StopAllMinersNonProfitable(); + } + return shouldMine; + } + + public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData, bool log = true) { + List profitableDevices = new List(); + double CurrentProfit = 0.0d; + foreach (var device in _miningDevices) { + // calculate profits + device.CalculateProfits(NiceHashData); + // check if device has profitable algo + if (device.MostProfitableKey != AlgorithmType.NONE) { + profitableDevices.Add(device); + CurrentProfit += device.GetCurrentMostProfitValue; + device.Device.MostProfitableAlgorithm = device.Algorithms[device.MostProfitableKey].algoRef; + } + } + // print profit statuses + if (log) { + StringBuilder stringBuilderFull = new StringBuilder(); + stringBuilderFull.AppendLine("Current device profits:"); + foreach (var device in _miningDevices) { + StringBuilder stringBuilderDevice = new StringBuilder(); + stringBuilderDevice.AppendLine(String.Format("\tProfits for {0} ({1}):", device.Device.UUID, device.Device.Name)); + foreach (var algo in device.Algorithms) { + stringBuilderDevice.AppendLine(String.Format("\t\tPROFIT = {0}\t(SPEED = {1}\t\t| NHSMA = {2})\t[{3}]", + algo.Value.CurrentProfit.ToString(DOUBLE_FORMAT), // Profit + algo.Value.AvaragedSpeed, // Speed + algo.Value.CurNhmSMADataVal, // NiceHashData + AlgorithmNiceHashNames.GetName(algo.Key) // Name + )); + } + // most profitable + stringBuilderDevice.AppendLine(String.Format("\t\tMOST PROFITABLE ALGO: {0}, PROFIT: {1}", + AlgorithmNiceHashNames.GetName(device.MostProfitableKey), + device.GetCurrentMostProfitValue.ToString(DOUBLE_FORMAT))); + stringBuilderFull.AppendLine(stringBuilderDevice.ToString()); + } + Helpers.ConsolePrint(TAG, stringBuilderFull.ToString()); + } + + // check if should mine + if (CheckIfShouldMine(CurrentProfit, log) == false) { + return; + } + + // group devices with same supported algorithms + _previousAllGroupedDevices = _currentAllGroupedDevices; + _currentAllGroupedDevices = new List>(); + Dictionary newGroupAndAlgorithm = new Dictionary(); + for (int first = 0; first < profitableDevices.Count; ++first) { + var firstDev = profitableDevices[first].Device; + // skip if no algorithm is profitable + if (firstDev.MostProfitableAlgorithm == null) { + if (log) Helpers.ConsolePrint("SwichMostProfitableGroupUpMethod", String.Format("Device {0}, MostProfitableAlgorithm == null", firstDev.Name)); + continue; + } + // check if is in group + bool isInGroup = false; + foreach (var groupedDevices in _currentAllGroupedDevices) { + if (groupedDevices.Contains(firstDev.UUID)) { + isInGroup = true; + break; + } + } + if (isInGroup) continue; + + var newGroup = new GroupedDevices(); + newGroup.Add(firstDev.UUID); + for (int second = first + 1; second < profitableDevices.Count; ++second) { + var secondDev = profitableDevices[second].Device; + // first check if second device has profitable algorithm + if (secondDev.MostProfitableAlgorithm != null) { + // check if we should group + if (GroupingLogic.IsEquihashGroupLogic(firstDev, secondDev) + || GroupingLogic.IsDaggerAndSameComputePlatform(firstDev, secondDev) + || GroupingLogic.IsGroupBinaryAndAlgorithmSame(firstDev, secondDev)) { + newGroup.Add(secondDev.UUID); + } + } + } + + _currentAllGroupedDevices.Add(newGroup); + newGroupAndAlgorithm.Add(newGroup, firstDev.MostProfitableAlgorithm); + } + + // stop groupes that aren't in current group devices + foreach (var curPrevGroup in _previousAllGroupedDevices) { + var curPrevGroupKey = CalcGroupedDevicesKey(curPrevGroup); + bool contains = false; + foreach (var curCheckGroup in _currentAllGroupedDevices) { + var curCheckGroupKey = CalcGroupedDevicesKey(curCheckGroup); + if (curPrevGroupKey == curCheckGroupKey) { + contains = true; + break; + } + } + if (!contains) { + _groupedDevicesMiners[curPrevGroupKey].Stop(); + } + } + // switch to newGroupAndAlgorithm most profitable algorithm + foreach (var kvpGroupAlgorithm in newGroupAndAlgorithm) { + var group = kvpGroupAlgorithm.Key; + var algorithm = kvpGroupAlgorithm.Value; + + GroupMiners currentGroupMiners; + // try find if it doesn't exist create new + string groupStringKey = CalcGroupedDevicesKey(group); + if (!_groupedDevicesMiners.TryGetValue(groupStringKey, out currentGroupMiners)) { + currentGroupMiners = new GroupMiners(group); + _groupedDevicesMiners.Add(groupStringKey, currentGroupMiners); + } + currentGroupMiners.StartAlgorihtm(algorithm, _miningLocation, _workerBtcStringWorker); + } + + // stats quick fix code + if (_currentAllGroupedDevices.Count != _previousAllGroupedDevices.Count) { + MinerStatsCheck(NiceHashData); + } + } + + public void MinerStatsCheck(Dictionary NiceHashData) { + double CurrentProfit = 0.0d; + _mainFormRatesComunication.ClearRates(_currentAllGroupedDevices.Count); + foreach (var group in _currentAllGroupedDevices) { + var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; + Miner m = groupMiners.CurrentWorkingMiner; + + // skip if not running + if (!m.IsRunning) continue; + + APIData AD = m.GetSummary(); + if (AD == null) { + Helpers.ConsolePrint(m.MinerTAG(), "GetSummary returned null.."); + } + // set rates + if (NiceHashData != null && AD != null) { + m.CurrentRate = NiceHashData[AD.AlgorithmID].paying * AD.Speed * 0.000000001; + } else { + m.CurrentRate = 0; + // set empty + AD = new APIData() { + AlgorithmID = m.CurrentAlgorithmType, + AlgorithmName = AlgorithmNiceHashNames.GetName(m.CurrentAlgorithmType), + Speed = 0.0d + }; + } + CurrentProfit += m.CurrentRate; + // Update GUI + _mainFormRatesComunication.AddRateInfo(m.MinerTAG(), groupMiners.DevicesInfoString, AD, m.CurrentRate, m.IsAPIReadException); + } + // check if profitabile + if (CheckStatus && !IsMiningRegardlesOfProfit) { + CheckStatus = false; + if (IsProfitable) { + // check current profit + CheckIfShouldMine(CurrentProfit, true); + } else if (!IsProfitable) { + // recalculate and switch + SwichMostProfitableGroupUpMethod(NiceHashData, true); + } + } + } + + #region Private // Private classes, enums, structs + private enum DeviceMiningStatus { + Disabled, + NoEnabledAlgorithms, + DeviceNull, + CanMine + } + private class MiningAlgorithm { + public MiningAlgorithm(Algorithm algo) { + algoRef = algo; + // init speed that will be avaraged later + AvaragedSpeed = algo.BenchmarkSpeed; + } + public Algorithm algoRef { get; private set; } + // avarage speed of same devices to increase mining stability + public double AvaragedSpeed = 0; + public double CurrentProfit = 0; + public double CurNhmSMADataVal = 0; + } + private class MiningDevice { + public MiningDevice(ComputeDevice device) { + Device = device; + foreach (var kvp in Device.DeviceBenchmarkConfig.AlgorithmSettings) { + AlgorithmType key = kvp.Key; + Algorithm algo = kvp.Value; + if (IsAlgoMiningCapable(algo)) { + Algorithms[key] = new MiningAlgorithm(algo); + } + } + } + public ComputeDevice Device { get; private set; } + public Dictionary Algorithms = new Dictionary(); + + public AlgorithmType MostProfitableKey { get; private set; } + + public double GetCurrentMostProfitValue { + get { + if (AlgorithmType.NONE != MostProfitableKey) { + return Algorithms[MostProfitableKey].CurrentProfit; + } + return 0; + } + } + + public void CalculateProfits(Dictionary NiceHashData) { + // assume none is profitable + MostProfitableKey = AlgorithmType.NONE; + // calculate new profits + foreach (var miningAlgo in Algorithms) { + AlgorithmType key = miningAlgo.Key; + MiningAlgorithm algo = miningAlgo.Value; + if (NiceHashData.ContainsKey(key)) { + algo.CurNhmSMADataVal = NiceHashData[key].paying; + algo.CurrentProfit = algo.CurNhmSMADataVal * algo.AvaragedSpeed * 0.000000001; + } else { + algo.CurrentProfit = 0; + } + } + // find max paying value and save key + double maxProfit = 0; + foreach (var miningAlgo in Algorithms) { + AlgorithmType key = miningAlgo.Key; + MiningAlgorithm algo = miningAlgo.Value; + if (maxProfit < algo.CurrentProfit) { + maxProfit = algo.CurrentProfit; + MostProfitableKey = key; + } + } + } + } + #endregion Private // Private classes, enums, structs + } +} diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 5708b2b..ad5b3ef 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -183,6 +183,8 @@ + + @@ -191,8 +193,10 @@ - + + + diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index 329be8f..d7c26b1 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -8,8 +8,11 @@ using NiceHashMiner.Enums; using NiceHashMiner.Miners; + + namespace NiceHashMiner { + using MinersManager = MinersManager_NEW; #pragma warning disable 649 public class NiceHashSMA { diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 54e6338..1ee00a4 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.3")] -[assembly: AssemblyFileVersion("1.7.3.3")] +[assembly: AssemblyVersion("1.7.3.4")] +[assembly: AssemblyFileVersion("1.7.3.4")] From 83e3596d4393672ffcb2fa7f3c1cb0b1994f2baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 16 Nov 2016 15:04:17 +0100 Subject: [PATCH 100/366] remove unused --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 52ff100..ec405cb 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -680,23 +680,6 @@ public static ComputeDevice GetDeviceWithUUID(string uuid) { return null; } - public static int GetEnabledDeviceNameCount(string name) { - int count = 0; - foreach (var dev in AllAvaliableDevices) { - if (dev.Enabled && name == dev.Name) ++count; - } - return count; - } - - public static string GetNameForUUID(string uuid) { - foreach (var dev in AllAvaliableDevices) { - if (uuid == dev.UUID) { - return dev.Name; - } - } - return International.GetText("ComputeDevice_Get_With_UUID_NONE"); - } - public static List GetSameDevicesTypeAsDeviceWithUUID(string uuid) { List sameTypes = new List(); var compareDev = GetDeviceWithUUID(uuid); From 9bc77e0db1d311adc6a4063659735075f470e9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 16 Nov 2016 23:42:52 +0100 Subject: [PATCH 101/366] NVIDIA driver check use SMI instead of OpenCL --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 96 ++++++++++++++----- 1 file changed, 74 insertions(+), 22 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index ec405cb..8cf0363 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -26,34 +26,85 @@ public class ComputeDeviceManager public static class Query { const string TAG = "ComputeDeviceManager.Query"; + // format 372.54; + private class NVIDIA_SMI_DRIVER { + public NVIDIA_SMI_DRIVER(int left, int right) { + leftPart = left; + rightPart = right; + } + public bool IsLesserVersionThan(NVIDIA_SMI_DRIVER b) { + if(leftPart < b.leftPart) { + return true; + } + if(rightPart < b.rightPart) { + return true; + } + return false; + } + + public string ToString2() { + return String.Format("{0}.{1}", leftPart, rightPart); + } + + public int leftPart; + public int rightPart; + } + const int AMD_VENDOR_ID = 1002; - const double NVIDIA_RECOMENDED_DRIVER = 372.54; - const double NVIDIA_MIN_DETECTION_DRIVER = 362.61; - static double _currentNvidiaOpenCLDriver = -1; + static readonly NVIDIA_SMI_DRIVER NVIDIA_RECOMENDED_DRIVER = new NVIDIA_SMI_DRIVER(372, 54); // 372.54; + static readonly NVIDIA_SMI_DRIVER NVIDIA_MIN_DETECTION_DRIVER = new NVIDIA_SMI_DRIVER(362, 61); // 362.61; + static NVIDIA_SMI_DRIVER _currentNvidiaSMIDriver = new NVIDIA_SMI_DRIVER(-1, -1); + static NVIDIA_SMI_DRIVER INVALID_SMI_DRIVER = new NVIDIA_SMI_DRIVER(-1, -1); // naming purposes private static int CPUCount = 0; private static int GPUCount = 0; - static private double GetNvidiaOpenCLDriver() { - if (OpenCLJSONData != null) { - List nvidiaOCLs = null; - foreach (var oclPlatDevs in OpenCLJSONData) { - if (oclPlatDevs.PlatformName.ToLower().Contains("nvidia")) { - nvidiaOCLs = oclPlatDevs.Devices; + static private NVIDIA_SMI_DRIVER GetNvidiaSMIDriver() { + if (WindowsDisplayAdapters.HasNvidiaVideoController()) { + string stdOut, stdErr, args, smiPath; + stdOut = stdErr = args = String.Empty; + smiPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\NVIDIA Corporation\\NVSMI\\nvidia-smi.exe"; + if (smiPath.Contains(" (x86)")) smiPath = smiPath.Replace(" (x86)", ""); + try { + Process P = new Process(); + P.StartInfo.FileName = smiPath; + P.StartInfo.UseShellExecute = false; + P.StartInfo.RedirectStandardOutput = true; + P.StartInfo.RedirectStandardError = true; + P.StartInfo.CreateNoWindow = true; + P.Start(); + P.WaitForExit(); + + stdOut = P.StandardOutput.ReadToEnd(); + stdErr = P.StandardError.ReadToEnd(); + + const string FIND_STRING = "Driver Version: "; + using (StringReader reader = new StringReader(stdOut)) { + string line = string.Empty; + do { + line = reader.ReadLine(); + if (line != null) { + if(line.Contains(FIND_STRING)) { + int start = line.IndexOf(FIND_STRING); + string driverVer = line.Substring(start, start + 7); + driverVer = driverVer.Replace(FIND_STRING, "").Substring(0, 7).Trim(); + double drVerDouble = Double.Parse(driverVer, CultureInfo.InvariantCulture); + int dot = driverVer.IndexOf("."); + int leftPart = Int32.Parse(driverVer.Substring(0, 3)); + int rightPart = Int32.Parse(driverVer.Substring(4, 2)); + return new NVIDIA_SMI_DRIVER(leftPart, rightPart); + } + } + } while (line != null); } - } - if (nvidiaOCLs != null && nvidiaOCLs.Count > 0) { - if (Double.TryParse(nvidiaOCLs[0]._CL_DRIVER_VERSION, - NumberStyles.Any, - CultureInfo.InvariantCulture, - out _currentNvidiaOpenCLDriver)) { - return _currentNvidiaOpenCLDriver; - } + } catch (Exception ex) { + Helpers.ConsolePrint(TAG, "GetNvidiaSMIDriver Exception: " + ex.Message); + return INVALID_SMI_DRIVER; } } - return -1; + return INVALID_SMI_DRIVER; } private static void showMessageAndStep(string infoMsg) { @@ -101,10 +152,11 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { } } // allerts - _currentNvidiaOpenCLDriver = GetNvidiaOpenCLDriver(); + _currentNvidiaSMIDriver = GetNvidiaSMIDriver(); // if we have nvidia cards but no CUDA devices tell the user to upgrade driver bool isNvidiaErrorShown = false; // to prevent showing twice - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController() && CudaDevices.Count == 0) { + bool showWarning = ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController(); + if (showWarning && CudaDevices.Count == 0) { isNvidiaErrorShown = true; var minDriver = NVIDIA_MIN_DETECTION_DRIVER.ToString(); var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); @@ -114,9 +166,9 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { MessageBoxButtons.OK, MessageBoxIcon.Error); } // recomended driver - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController() && _currentNvidiaOpenCLDriver < NVIDIA_RECOMENDED_DRIVER && !isNvidiaErrorShown && _currentNvidiaOpenCLDriver > -1) { + if (showWarning && _currentNvidiaSMIDriver.IsLesserVersionThan(NVIDIA_RECOMENDED_DRIVER) && !isNvidiaErrorShown && _currentNvidiaSMIDriver.leftPart > -1) { var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); - var nvdriverString = _currentNvidiaOpenCLDriver > -1 ? String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART"), _currentNvidiaOpenCLDriver.ToString()) + var nvdriverString = _currentNvidiaSMIDriver.leftPart > -1 ? String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART"), _currentNvidiaSMIDriver.ToString2()) : ""; MessageBox.Show(String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended"), recomendDrvier, nvdriverString, recomendDrvier), From dce2f6e50573eaa183b557580b9422d73bafd5d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 17 Nov 2016 11:55:43 +0100 Subject: [PATCH 102/366] EQM v1.0.1a extra params update --- .../Miners/Grouping/ExtraLaunchParametersParser.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs index e9d880b..8da121d 100644 --- a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs @@ -83,11 +83,12 @@ static class ExtraLaunchParametersParser { private static List _eqm_CPU_Options = new List() { new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none }; + // EQM v1.0.1a has no optimization flags remove them private static List _eqm_CUDA_Options = new List() { - // TODO check what is the CUDA_Solver_ParallelBuckets default - new MinerOption(MinerOptionType.CUDA_Solver_ParallelBuckets, "-cp", "-cp", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + //// TODO check what is the CUDA_Solver_ParallelBuckets default + //new MinerOption(MinerOptionType.CUDA_Solver_ParallelBuckets, "-cp", "-cp", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + //new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + //new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 }; private static bool _showLog = true; From 11d2b7b899ab9020e6f41f5c6b5b1af13ef37f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 17 Nov 2016 14:21:18 +0100 Subject: [PATCH 103/366] eqm thread extra launch params handling added --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/Equihash/eqm.cs | 7 +++++-- .../Grouping/ExtraLaunchParametersParser.cs | 16 ++++++++++++++++ NiceHashMiner/Utils/MinersDownloadManager.cs | 4 ++-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 95b5db0..049d73a 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -50,7 +50,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "_PENDING"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 2085390..73e139a 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -32,9 +32,12 @@ protected override string GetDevicesCommandString() { if (NVIDIAs.Count > 0) { deviceStringCommand += " -cd "; foreach (var nvidia in NVIDIAs) { - deviceStringCommand += nvidia.ID + " "; + for (int i = 0; i < ExtraLaunchParametersParser.GetEqmThreadCount(nvidia); ++i) { + deviceStringCommand += nvidia.ID + " "; + } } - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(NVIDIAs, AlgorithmType.Equihash, DeviceType.NVIDIA, Path); + // no extra launch params + //deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(NVIDIAs, AlgorithmType.Equihash, DeviceType.NVIDIA, Path); } return deviceStringCommand; diff --git a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs index 8da121d..dbeec9b 100644 --- a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs @@ -99,6 +99,22 @@ private static void LogParser(string msg) { } } + // exception... + public static int GetEqmThreadCount(ComputeDevice cDev) { + if (cDev.MostProfitableAlgorithm.ExtraLaunchParameters.Contains("-ct")) { + List eqm_CUDA_Options = new List() { + new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "1", MinerOptionFlagType.MultiParam, " "), + }; + cDev.CurrentExtraLaunchParameters = cDev.MostProfitableAlgorithm.ExtraLaunchParameters; + string parsedStr = Parse(new List() { cDev }, eqm_CUDA_Options, true); + try { + int threads = Int32.Parse(parsedStr.Trim().Replace("-ct", "").Trim()); + return threads; + } catch { } + } + return 1; // default + } + private static string Parse(List CDevs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index fcaf074..0760f38 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -22,8 +22,8 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Thu, 17 Nov 2016 19:30:30 +0100 Subject: [PATCH 104/366] AMD and NVIDIA daggerhashimoto mining BUG fix --- NiceHashMiner/Miners/Grouping/GroupingLogic.cs | 3 ++- NiceHashMiner/Miners/MiningSession.cs | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index d4d972f..a49bda4 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -94,7 +94,8 @@ private static bool IsSameBinPath(ComputeDevice a, ComputeDevice b) { public static bool IsGroupBinaryAndAlgorithmSame(ComputeDevice a, ComputeDevice b) { return IsNotCpuGroups(a, b) && IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) - && IsSameBinPath(a, b); + && IsSameBinPath(a, b) + && a.DeviceType == b.DeviceType; } } } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index f279f0e..277896c 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -433,9 +433,12 @@ public void SwichMostProfitableGroupUpMethod(Dictionary Date: Thu, 17 Nov 2016 20:03:34 +0100 Subject: [PATCH 105/366] eqm worker BUG fix --- NiceHashMiner/Miners/Equihash/eqm.cs | 7 ++++++- NiceHashMiner/Miners/Equihash/nheqBase.cs | 6 ------ NiceHashMiner/Miners/Equihash/nheqminer.cs | 7 +++++++ NiceHashMiner/Miners/Grouping/GroupMiners.cs | 14 ++++++-------- NiceHashMiner/Miners/Miner.cs | 8 +++++++- NiceHashMiner/Miners/MiningSession.cs | 11 +++++------ NiceHashMiner/Miners/ccminer/ccminer.cs | 3 ++- NiceHashMiner/Miners/cpuminer.cs | 3 ++- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 4 ++-- NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs | 4 ++-- NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs | 4 ++-- NiceHashMiner/Miners/sgminer.cs | 3 ++- 12 files changed, 43 insertions(+), 31 deletions(-) diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 73e139a..27dd7bf 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -14,8 +14,13 @@ public eqm() IsNHLocked = true; } + public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) { + CurrentMiningAlgorithm = miningAlgorithm; + LastCommandLine = GetDevicesCommandString() + " -a " + APIPort + " -l " + url + " -u " + btcAdress + " -w " + worker; + ProcessHandle = _Start(); + } + - // TODO fix extra paramteter parsing protected override string GetDevicesCommandString() { string deviceStringCommand = " "; diff --git a/NiceHashMiner/Miners/Equihash/nheqBase.cs b/NiceHashMiner/Miners/Equihash/nheqBase.cs index 2dc6ba6..5d6bab5 100644 --- a/NiceHashMiner/Miners/Equihash/nheqBase.cs +++ b/NiceHashMiner/Miners/Equihash/nheqBase.cs @@ -41,12 +41,6 @@ public nheqBase(DeviceType deviceType, string minerDeviceName) AMD_OCL_PLATFORM = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; } - public override void Start(Algorithm miningAlgorithm, string url, string username) { - CurrentMiningAlgorithm = miningAlgorithm; - LastCommandLine = GetDevicesCommandString() + " -a " + APIPort + " -l " + url + " -u " + username; - ProcessHandle = _Start(); - } - public override void SetCDevs(string[] deviceUUIDs) { base.SetCDevs(deviceUUIDs); foreach (var cDev in CDevs) { diff --git a/NiceHashMiner/Miners/Equihash/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs index 744ef89..2e31813 100644 --- a/NiceHashMiner/Miners/Equihash/nheqminer.cs +++ b/NiceHashMiner/Miners/Equihash/nheqminer.cs @@ -27,6 +27,13 @@ protected override NiceHashProcess _Start() { return P; } + public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) { + string username = GetUsername(btcAdress, worker); + CurrentMiningAlgorithm = miningAlgorithm; + LastCommandLine = GetDevicesCommandString() + " -a " + APIPort + " -l " + url + " -u " + username; + ProcessHandle = _Start(); + } + protected override string GetDevicesCommandString() { string deviceStringCommand = " "; diff --git a/NiceHashMiner/Miners/Grouping/GroupMiners.cs b/NiceHashMiner/Miners/Grouping/GroupMiners.cs index f9eb0ca..4666c9e 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiners.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiners.cs @@ -58,7 +58,7 @@ public void End() { } } - public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string worker) { + public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string btcAdress, string worker) { bool containsSupportedMiner = false; Miner startSwitchMiner = null; var algorithmType = algorithm.NiceHashID; @@ -83,10 +83,10 @@ public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string wo } else { CurrentWorkingMiner = startSwitchMiner; } - SwitchMinerAlgorithm(ref startSwitchMiner, algorithm, miningLocation, worker); + SwitchMinerAlgorithm(ref startSwitchMiner, algorithm, miningLocation, btcAdress, worker); } - private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string miningLocation, string worker) { + private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string miningLocation, string btcAdress, string worker) { // if is running and the current algorithm is the same skip if (m.IsRunning && m.CurrentAlgorithmType == algorithm.NiceHashID) { return; @@ -105,15 +105,13 @@ private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string minin if (MaxProfitKey == AlgorithmType.Equihash) { if (m.IsNHLocked) { - // TODO worker name not working with eqm - string BTC = worker.Substring(0, worker.IndexOf(".")); - m.Start(algorithm, miningLocation, BTC); + m.Start(algorithm, miningLocation, btcAdress, worker); } else { m.Start(algorithm, Globals.NiceHashData[MaxProfitKey].name + "." + miningLocation + ".nicehash.com:" - + Globals.NiceHashData[MaxProfitKey].port, worker); + + Globals.NiceHashData[MaxProfitKey].port, btcAdress, worker); } } else { m.Start(algorithm, @@ -121,7 +119,7 @@ private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string minin + Globals.NiceHashData[MaxProfitKey].name + "." + miningLocation + ".nicehash.com:" - + Globals.NiceHashData[MaxProfitKey].port, worker); + + Globals.NiceHashData[MaxProfitKey].port, btcAdress, worker); } } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index d11c46a..d8c9b2e 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -236,8 +236,14 @@ public void KillAllUsedMinerProcesses() { _allPidData.RemoveAll( x => toRemovePidData.Contains(x)); } - abstract public void Start(Algorithm miningAlgorithm, string url, string username); + abstract public void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker); + protected string GetUsername(string btcAdress, string worker) { + if (worker.Length > 0) { + return btcAdress + "." + worker; + } + return btcAdress; + } abstract protected void _Stop(MinerStopType willswitch); virtual public void Stop(MinerStopType willswitch = MinerStopType.SWITCH, bool needsRestart = false) diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 277896c..8bed3cb 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -20,7 +20,8 @@ public class MiningSession { // session varibles fixed string _miningLocation = ""; - string _workerBtcStringWorker = ""; + string _btcAdress = ""; + string _worker = ""; List _miningDevices = new List(); IMainFormRatesComunication _mainFormRatesComunication; @@ -66,10 +67,8 @@ public MiningSession(List devices, _mainFormRatesComunication = mainFormRatesComunication; _miningLocation = miningLocation; - if (worker.Length > 0) - _workerBtcStringWorker = btcAdress + "." + worker; - else - _workerBtcStringWorker = btcAdress; + _btcAdress = btcAdress; + _worker = worker; // initial settup { @@ -475,7 +474,7 @@ public void SwichMostProfitableGroupUpMethod(Dictionary usedMiners) { + public void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker, List usedMiners) { foreach (var ethminer in usedMiners) { if (ethminer.MINER_ID != MINER_ID && (ethminer.IsRunning || ethminer.IsPaused)) { Helpers.ConsolePrint(MinerTAG(), String.Format("Will end {0} {1}", ethminer.MinerTAG(), ethminer.ProcessTag())); @@ -91,7 +91,7 @@ public void Start(Algorithm miningAlgorithm, string url, string username, List Date: Fri, 18 Nov 2016 10:12:17 +0100 Subject: [PATCH 106/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 1ee00a4..4a5ed00 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.4")] -[assembly: AssemblyFileVersion("1.7.3.4")] +[assembly: AssemblyVersion("1.7.3.5")] +[assembly: AssemblyFileVersion("1.7.3.5")] From 5f4f9e7676f200f49210655b96620d80b8c56c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 18 Nov 2016 11:41:44 +0100 Subject: [PATCH 107/366] eqm hide window exception --- NiceHashMiner/Miners/Miner.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index d8c9b2e..6cb207d 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -549,7 +549,11 @@ virtual protected NiceHashProcess _Start() P.ExitEvent = Miner_Exited; P.StartInfo.Arguments = LastCommandLine; - P.StartInfo.CreateNoWindow = ConfigManager.Instance.GeneralConfig.HideMiningWindows; + if (Path != MinerPaths.eqm) { + P.StartInfo.CreateNoWindow = ConfigManager.Instance.GeneralConfig.HideMiningWindows; + } else { + P.StartInfo.CreateNoWindow = false; + } P.StartInfo.UseShellExecute = false; try From 513cf4c1ffdd77dfa2a1e149838f618df7d0119b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 18 Nov 2016 12:06:32 +0100 Subject: [PATCH 108/366] ethminer extra logging udp calls --- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index 2d57577..c8bff5f 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -228,6 +228,7 @@ private void SetEthminerAPI(int port) { /// Call this to start ethminer. If ethminer is already running, nothing happens. /// private void StartMining() { + Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Sending START UDP"); SendUDP(2); IsRunning = true; } @@ -236,6 +237,7 @@ private void StartMining() { /// Call this to stop ethminer. If ethminer is already stopped, nothing happens. /// private void StopMining() { + Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Sending STOP UDP"); SendUDP(1); IsRunning = false; } From 4b1b4bdce44e754ac1b42984b025ff6ab0157041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 18 Nov 2016 21:25:42 +0100 Subject: [PATCH 109/366] code cleanup --- NiceHashMiner/Devices/ComputeDevice.cs | 22 +++--------- NiceHashMiner/Devices/ComputeDeviceManager.cs | 12 +++---- NiceHashMiner/Devices/GroupNames.cs | 34 +++++++++---------- .../Grouping/ExtraLaunchParametersParser.cs | 6 ++-- NiceHashMiner/Miners/MiningSession.cs | 2 +- 5 files changed, 31 insertions(+), 45 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 7e48f17..40a596f 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -13,8 +13,6 @@ public class ComputeDevice { [JsonIgnore] readonly public int ID; - [JsonIgnore] - readonly public string Group; readonly public string Name; // { get; set; } // to identify equality; [JsonIgnore] @@ -26,9 +24,6 @@ public class ComputeDevice [JsonIgnore] public readonly bool IsEtherumCapale; - - [JsonIgnore] - public string DeviceGroupString { get; private set; } [JsonIgnore] readonly public DeviceGroupType DeviceGroupType; // UUID now used for saving @@ -77,9 +72,8 @@ public class ComputeDevice public NiceHashMiner.Forms.Components.DevicesListViewEnableControl.ComputeDeviceEnabledOption ComputeDeviceEnabledOption { get; set; } [JsonConstructor] - public ComputeDevice(int id, string group, string name, string uuid, bool enabled = true) { + public ComputeDevice(int id, string name, string uuid, bool enabled = true) { ID = id; - Group = group; Name = name; _nameNoNums = name; UUID = uuid; @@ -90,29 +84,25 @@ public ComputeDevice(int id, string group, string name, string uuid, bool enable public ComputeDevice(int id, string group, string name, int threads, ulong affinityMask, int CPUCount) { ID = id; - Group = group; Name = name; Threads = threads; AffinityMask = affinityMask; _nameNoNums = name; Enabled = true; - DeviceGroupType = GroupNames.GetType(Group); - DeviceGroupString = GroupNames.GetNameGeneral(DeviceGroupType); + DeviceGroupType = DeviceGroupType.CPU; DeviceType = DeviceType.CPU; NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_CPU"), CPUCount); - UUID = GetUUID(ID, Group, Name, DeviceGroupType); + UUID = GetUUID(ID, GroupNames.GetGroupName(DeviceGroupType, ID), Name, DeviceGroupType); } // GPU NVIDIA - public ComputeDevice(CudaDevice cudaDevice, string group, int GPUCount) { + public ComputeDevice(CudaDevice cudaDevice, DeviceGroupType group, int GPUCount) { _cudaDevice = cudaDevice; ID = (int)cudaDevice.DeviceID; - Group = group; Name = cudaDevice.GetName(); _nameNoNums = cudaDevice.GetName(); Enabled = true; - DeviceGroupType = GroupNames.GetType(Group); - DeviceGroupString = GroupNames.GetNameGeneral(DeviceGroupType); + DeviceGroupType = group; IsEtherumCapale = cudaDevice.IsEtherumCapable(); DeviceType = DeviceType.NVIDIA; NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_NVIDIA_GPU"), GPUCount); @@ -124,8 +114,6 @@ public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount) { _amdDevice = amdDevice; ID = amdDevice.DeviceID; DeviceGroupType = DeviceGroupType.AMD_OpenCL; - Group = GroupNames.GetName(DeviceGroupType.AMD_OpenCL); - DeviceGroupString = GroupNames.GetNameGeneral(DeviceGroupType); Name = amdDevice.DeviceName; _nameNoNums = amdDevice.DeviceName; Enabled = true; diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 8cf0363..e84b5d6 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -373,22 +373,22 @@ static public void QueryCudaDevices() { stringBuilder.AppendLine(String.Format("\t\tETHEREUM: {0}", etherumCapableStr)); if (!skip) { - string group; + DeviceGroupType group; switch (cudaDev.SM_major) { case 2: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_2_1); + group = DeviceGroupType.NVIDIA_2_1; break; case 3: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_3_x); + group = DeviceGroupType.NVIDIA_3_x; break; case 5: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_5_x); + group = DeviceGroupType.NVIDIA_5_x; break; case 6: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_6_x); + group = DeviceGroupType.NVIDIA_6_x; break; default: - group = GroupNames.GetName(DeviceGroupType.NVIDIA_6_x); + group = DeviceGroupType.NVIDIA_6_x; break; } Avaliable.AllAvaliableDevices.Add( diff --git a/NiceHashMiner/Devices/GroupNames.cs b/NiceHashMiner/Devices/GroupNames.cs index 3b999e8..7f642e6 100644 --- a/NiceHashMiner/Devices/GroupNames.cs +++ b/NiceHashMiner/Devices/GroupNames.cs @@ -16,26 +16,24 @@ static public class GroupNames "NVIDIA6.x", }; - private static readonly string[] _namesGeneral = { - "CPU", - "AMD", - "NVIDIA", - "NVIDIA", - "NVIDIA", - "NVIDIA", - }; - - public static string GetName(DeviceGroupType type) { return _names[(int)type]; } - - public static string GetNameGeneral(DeviceGroupType type) { return _namesGeneral[(int)type]; } - - public static DeviceGroupType GetType(string name) { - int i = 0; - for (; i < _names.Length; ++i) { - if (name.Contains(_names[i])) break; + public static string GetGroupName(DeviceGroupType type, int id) { + if(DeviceGroupType.CPU == type) { + return "CPU"+id; + } else if ((int)type < _names.Length) { + return _names[(int)type]; } - return (DeviceGroupType)i; + return "UnknownGroup"; } + public static string GetNameGeneral(DeviceType type) { + if(DeviceType.CPU == type) { + return "CPU"; + } else if(DeviceType.NVIDIA == type) { + return "NVIDIA"; + } else if (DeviceType.AMD == type) { + return "AMD"; + } + return "UnknownDeviceType"; + } } } diff --git a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs index dbeec9b..414714f 100644 --- a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs @@ -334,7 +334,7 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo var cdevs_mappings = new List(); foreach (var cDev in CDevs) { while(++id != cDev.ID) { - var fakeCdev = new ComputeDevice(id, "", "", ""); + var fakeCdev = new ComputeDevice(id, "", ""); fakeCdev.CurrentExtraLaunchParameters = ""; // empty cdevs_mappings.Add(fakeCdev); } @@ -401,7 +401,7 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo var cdevs_mappings = new List(); foreach (var cDev in CDevs) { while (++id != cDev.ID) { - var fakeCdev = new ComputeDevice(id, "", "", ""); + var fakeCdev = new ComputeDevice(id, "", ""); fakeCdev.CurrentExtraLaunchParameters = ""; // empty cdevs_mappings.Add(fakeCdev); } @@ -438,7 +438,7 @@ private static List CreateFakeCDevs(List algos) { int uuid = 0; foreach (var algo in algos) { ++uuid; - ComputeDevice cDev = new ComputeDevice(0, "", String.Format("device_{0}", uuid.ToString()), uuid.ToString()); + ComputeDevice cDev = new ComputeDevice(0, String.Format("device_{0}", uuid.ToString()), uuid.ToString()); cDev.MostProfitableAlgorithm = algo; CDevs.Add(cDev); } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 8bed3cb..94f149d 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -301,7 +301,7 @@ public string GetActiveMinersGroup() { HashSet UniqueMinerGroups = new HashSet(); foreach (var curDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (curDevice.Enabled) { - UniqueMinerGroups.Add(curDevice.DeviceGroupString); + UniqueMinerGroups.Add(GroupNames.GetNameGeneral(curDevice.DeviceType)); } } if (UniqueMinerGroups.Count > 0 && IsProfitable) { From 7cb015409a712f9f98c62585005c145d7640448e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 19 Nov 2016 16:17:40 +0100 Subject: [PATCH 110/366] AMD disabled detection will not run AMDOpenCLDeviceDetection --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 47 +++++++++++-------- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index e84b5d6..f7835e1 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -42,7 +42,7 @@ public bool IsLesserVersionThan(NVIDIA_SMI_DRIVER b) { return false; } - public string ToString2() { + public string ToString() { return String.Format("{0}.{1}", leftPart, rightPart); } @@ -50,7 +50,6 @@ public string ToString2() { public int rightPart; } - const int AMD_VENDOR_ID = 1002; static readonly NVIDIA_SMI_DRIVER NVIDIA_RECOMENDED_DRIVER = new NVIDIA_SMI_DRIVER(372, 54); // 372.54; static readonly NVIDIA_SMI_DRIVER NVIDIA_MIN_DETECTION_DRIVER = new NVIDIA_SMI_DRIVER(362, 61); // 362.61; static NVIDIA_SMI_DRIVER _currentNvidiaSMIDriver = new NVIDIA_SMI_DRIVER(-1, -1); @@ -121,13 +120,23 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { // #1 CPU CPU.QueryCPUs(); // #2 CUDA - showMessageAndStep(International.GetText("Compute_Device_Query_Manager_CUDA_Query")); - NVIDIA.QueryCudaDevices(); - // #3 OpenCL - showMessageAndStep(International.GetText("Compute_Device_Query_Manager_OpenCL_Query")); - OpenCL.QueryOpenCLDevices(); - // #4 AMD query AMD from OpenCL devices, get serial and add devices - AMD.QueryAMD(); + if (NVIDIA.IsSkipNVIDIA()) { + Helpers.ConsolePrint(TAG, "Skipping NVIDIA device detection, settings are set to disabled"); + } else { + showMessageAndStep(International.GetText("Compute_Device_Query_Manager_CUDA_Query")); + NVIDIA.QueryCudaDevices(); + } + // OpenCL and AMD + if (ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD) { + Helpers.ConsolePrint(TAG, "Skipping AMD device detection, settings set to disabled"); + showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query_Skip")); + } else { + // #3 OpenCL + showMessageAndStep(International.GetText("Compute_Device_Query_Manager_OpenCL_Query")); + OpenCL.QueryOpenCLDevices(); + // #4 AMD query AMD from OpenCL devices, get serial and add devices + AMD.QueryAMD(); + } // #5 uncheck CPU if GPUs present, call it after we Query all devices Group.UncheckedCPU(); @@ -156,7 +165,7 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { // if we have nvidia cards but no CUDA devices tell the user to upgrade driver bool isNvidiaErrorShown = false; // to prevent showing twice bool showWarning = ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController(); - if (showWarning && CudaDevices.Count == 0) { + if (showWarning && CudaDevices.Count == 0 && _currentNvidiaSMIDriver.IsLesserVersionThan(NVIDIA_MIN_DETECTION_DRIVER)) { isNvidiaErrorShown = true; var minDriver = NVIDIA_MIN_DETECTION_DRIVER.ToString(); var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); @@ -168,7 +177,7 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { // recomended driver if (showWarning && _currentNvidiaSMIDriver.IsLesserVersionThan(NVIDIA_RECOMENDED_DRIVER) && !isNvidiaErrorShown && _currentNvidiaSMIDriver.leftPart > -1) { var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); - var nvdriverString = _currentNvidiaSMIDriver.leftPart > -1 ? String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART"), _currentNvidiaSMIDriver.ToString2()) + var nvdriverString = _currentNvidiaSMIDriver.leftPart > -1 ? String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART"), _currentNvidiaSMIDriver.ToString()) : ""; MessageBox.Show(String.Format(International.GetText("Compute_Device_Query_Manager_NVIDIA_Driver_Recomended"), recomendDrvier, nvdriverString, recomendDrvier), @@ -296,6 +305,13 @@ static private void QueryCudaDevicesOutputErrorDataReceived(object sender, DataR } } + public static bool IsSkipNVIDIA() { + return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia2X + && ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia3X + && ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia5X + && ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X; + } + static private bool IsSMGroupSkip(int sm_major) { if (sm_major == 6) { return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X; @@ -479,15 +495,8 @@ static public void QueryOpenCLDevices() { static List amdGpus = new List(); static class AMD { static public void QueryAMD() { + const int AMD_VENDOR_ID = 1002; Helpers.ConsolePrint(TAG, "QueryAMD START"); - //showMessageAndStep(International.GetText("Form_Main_loadtext_AMD")); - //var dump = new sgminer(true); - - if (ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD) { - Helpers.ConsolePrint(TAG, "Skipping AMD device detection, settings set to disabled"); - showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query_Skip")); - return; - } #region AMD driver check, ADL returns 0 // check the driver version bool EnableOptimizedVersion = true; diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 049d73a..95b5db0 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -50,7 +50,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = "_PENDING"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 4a5ed00..5175df9 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.5")] -[assembly: AssemblyFileVersion("1.7.3.5")] +[assembly: AssemblyVersion("1.7.3.6")] +[assembly: AssemblyFileVersion("1.7.3.6")] From 6945152e7b85834854c13ab559b9c3c32fa12a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 21 Nov 2016 19:37:18 +0100 Subject: [PATCH 111/366] BIG refactor AMD OpenCL disable detection fix, Nvidia driver print fix, miner restart timeout fix (min 5s wait), NEW grouping backend logic (group miner path and device type), fixes --- NiceHashMiner/Algorithm.cs | 5 +- NiceHashMiner/Devices/ComputeDevice.cs | 17 - NiceHashMiner/Devices/ComputeDeviceManager.cs | 3 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 24 +- NiceHashMiner/Enums/DeviceGroupType.cs | 3 +- NiceHashMiner/Enums/DeviceMiningStatus.cs | 14 + NiceHashMiner/Enums/DeviceType.cs | 5 +- NiceHashMiner/Ethereum.cs | 1 + NiceHashMiner/Forms/Form_Benchmark.cs | 21 +- NiceHashMiner/Forms/Form_Main.cs | 4 +- NiceHashMiner/Forms/Form_Settings.cs | 25 +- NiceHashMiner/Globals.cs | 3 +- NiceHashMiner/Miners/Equihash/eqm.cs | 25 +- NiceHashMiner/Miners/Equihash/nheqBase.cs | 47 +- NiceHashMiner/Miners/Equihash/nheqminer.cs | 52 +- NiceHashMiner/Miners/Grouping/GroupMiner.cs | 100 +++ NiceHashMiner/Miners/Grouping/GroupMiners.cs | 126 ---- .../Miners/Grouping/GroupSetupUtils.cs | 146 +++++ .../Miners/Grouping/GroupingLogic.cs | 137 ++--- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 23 +- .../Miners/Grouping/MiningAlgorithm.cs | 23 + NiceHashMiner/Miners/Grouping/MiningDevice.cs | 122 ++++ NiceHashMiner/Miners/Grouping/MiningPair.cs | 19 + NiceHashMiner/Miners/Grouping/MiningSetup.cs | 31 + .../Miners/ManagerPrivate/GroupMiners.cs | 129 ---- .../ManagerPrivate/MinersManager_OLD.cs | 575 ------------------ .../Miners/ManagerPrivate/SwitchTesting.cs | 65 -- NiceHashMiner/Miners/Miner.cs | 177 ++---- ...{MinersManager_NEW.cs => MinersManager.cs} | 51 +- NiceHashMiner/Miners/MiningSession.cs | 428 +++++-------- .../ExtraLaunchParametersParser.cs | 260 +++----- .../{Grouping => Parsing}/MinerOption.cs | 2 +- NiceHashMiner/Miners/{ccminer => }/ccminer.cs | 56 +- NiceHashMiner/Miners/ccminer/ccminer_sm21.cs | 25 - NiceHashMiner/Miners/ccminer/ccminer_sm3x.cs | 24 - NiceHashMiner/Miners/ccminer/ccminer_sm5x.cs | 26 - NiceHashMiner/Miners/ccminer/ccminer_sm6x.cs | 18 - NiceHashMiner/Miners/cpuminer.cs | 53 +- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 41 +- .../Miners/ethminer/MinerEtherumCUDA.cs | 22 +- .../Miners/ethminer/MinerEtherumOCL.cs | 22 +- NiceHashMiner/Miners/sgminer.cs | 65 +- NiceHashMiner/NiceHashMiner.csproj | 23 +- NiceHashMiner/NiceHashStats.cs | 1 - 44 files changed, 1095 insertions(+), 1944 deletions(-) create mode 100644 NiceHashMiner/Enums/DeviceMiningStatus.cs create mode 100644 NiceHashMiner/Miners/Grouping/GroupMiner.cs delete mode 100644 NiceHashMiner/Miners/Grouping/GroupMiners.cs create mode 100644 NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs create mode 100644 NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs create mode 100644 NiceHashMiner/Miners/Grouping/MiningDevice.cs create mode 100644 NiceHashMiner/Miners/Grouping/MiningPair.cs create mode 100644 NiceHashMiner/Miners/Grouping/MiningSetup.cs delete mode 100644 NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs delete mode 100644 NiceHashMiner/Miners/ManagerPrivate/MinersManager_OLD.cs delete mode 100644 NiceHashMiner/Miners/ManagerPrivate/SwitchTesting.cs rename NiceHashMiner/Miners/{MinersManager_NEW.cs => MinersManager.cs} (69%) rename NiceHashMiner/Miners/{Grouping => Parsing}/ExtraLaunchParametersParser.cs (64%) rename NiceHashMiner/Miners/{Grouping => Parsing}/MinerOption.cs (95%) rename NiceHashMiner/Miners/{ccminer => }/ccminer.cs (77%) delete mode 100644 NiceHashMiner/Miners/ccminer/ccminer_sm21.cs delete mode 100644 NiceHashMiner/Miners/ccminer/ccminer_sm3x.cs delete mode 100644 NiceHashMiner/Miners/ccminer/ccminer_sm5x.cs delete mode 100644 NiceHashMiner/Miners/ccminer/ccminer_sm6x.cs diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index bebdf28..7b4befb 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -15,14 +15,11 @@ public class Algorithm { readonly public string MinerName; public double BenchmarkSpeed { get; set; } public string ExtraLaunchParameters { get; set; } + public bool Skip { get; set; } // CPU miners only setting public int LessThreads { get; set; } - public bool Skip { get; set; } - - public static readonly string PasswordDefault = "x"; - // benchmark info [JsonIgnore] public string BenchmarkStatus { get; set; } diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 40a596f..6916371 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -29,10 +29,6 @@ public class ComputeDevice // UUID now used for saving readonly public string UUID; - // Current Extra Launch Parameters copied from most profitable algorithm for benchmarking - [JsonIgnore] - public string CurrentExtraLaunchParameters { get; set; } - // CPU, NVIDIA, AMD [JsonIgnore] readonly public int Threads; @@ -60,10 +56,6 @@ public class ComputeDevice [JsonIgnore] public string Codename { get; private set; } - // temp value for grouping new profits - [JsonIgnore] - public Algorithm MostProfitableAlgorithm { get; set; } - [JsonIgnore] public DeviceBenchmarkConfig DeviceBenchmarkConfig { get; private set; } @@ -156,15 +148,6 @@ public void SetDeviceBenchmarkConfig(DeviceBenchmarkConfig deviceBenchmarkConfig Helpers.ConsolePrint("ComputeDevice", "The GPU detected (" + _amdDevice.Codename + ") is not Tahiti. Changing default gpu-threads to 2."); } } - // CUDA extra initializations - if (_cudaDevice != null) { - if (DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(AlgorithmType.CryptoNight)) { - var CryptoNightAlgo = DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.CryptoNight]; - if (_cudaDevice.SM_major >= 5 && Name.Contains("Ti") == false) { - CryptoNightAlgo.ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x" + _cudaDevice.SMX.ToString(); - } - } - } } } diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index f7835e1..c826275 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -14,6 +14,7 @@ using System.IO; using System.Globalization; using NiceHashMiner.Utils; +using NiceHashMiner.Miners.Grouping; namespace NiceHashMiner.Devices { @@ -42,7 +43,7 @@ public bool IsLesserVersionThan(NVIDIA_SMI_DRIVER b) { return false; } - public string ToString() { + public override string ToString() { return String.Format("{0}.{1}", leftPart, rightPart); } diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 894675e..03ee2ef 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -103,8 +103,30 @@ public static Dictionary CreateDefaultsForGroup(Device return null; } + private static bool _IsAlgosInGroupInit = false; + private static Dictionary> _algosInGroup = new Dictionary>(); + private static void InitAlgosInGroup() { + for (DeviceGroupType type = DeviceGroupType.CPU; type < DeviceGroupType.LAST; ++type) { + var supportedList = GetAlgorithmKeysForGroup(type); + if(supportedList != null) { + _algosInGroup[type] = supportedList; + } + } + _IsAlgosInGroupInit = true; + } + + public static bool IsAlgorithmSupportedForGroup(AlgorithmType algorithmType, DeviceGroupType deviceGroupType) { + // lazy init + if (_IsAlgosInGroupInit == false) { + InitAlgosInGroup(); + } + if (_algosInGroup.ContainsKey(deviceGroupType)) { + return _algosInGroup[deviceGroupType].Contains(algorithmType); + } + return false; + } - public static List GetAlgorithmKeysForGroup(DeviceGroupType deviceGroupType) { + private static List GetAlgorithmKeysForGroup(DeviceGroupType deviceGroupType) { var ret = CreateDefaultsForGroup(deviceGroupType); if (ret != null) { return new List (ret.Keys); diff --git a/NiceHashMiner/Enums/DeviceGroupType.cs b/NiceHashMiner/Enums/DeviceGroupType.cs index 77415f1..89c89c0 100644 --- a/NiceHashMiner/Enums/DeviceGroupType.cs +++ b/NiceHashMiner/Enums/DeviceGroupType.cs @@ -12,6 +12,7 @@ public enum DeviceGroupType : int NVIDIA_2_1, NVIDIA_3_x, NVIDIA_5_x, - NVIDIA_6_x + NVIDIA_6_x, + LAST } } diff --git a/NiceHashMiner/Enums/DeviceMiningStatus.cs b/NiceHashMiner/Enums/DeviceMiningStatus.cs new file mode 100644 index 0000000..024f640 --- /dev/null +++ b/NiceHashMiner/Enums/DeviceMiningStatus.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Enums { + public enum DeviceMiningStatus { + Disabled, + NoEnabledAlgorithms, + DeviceNull, + CanMine + } +} diff --git a/NiceHashMiner/Enums/DeviceType.cs b/NiceHashMiner/Enums/DeviceType.cs index 14ca328..8a8975f 100644 --- a/NiceHashMiner/Enums/DeviceType.cs +++ b/NiceHashMiner/Enums/DeviceType.cs @@ -8,9 +8,6 @@ namespace NiceHashMiner.Enums { public enum DeviceType { CPU = 0, NVIDIA, - AMD, - // combined types used for miner identification only - ALL, - NVIDIA_CPU + AMD } } diff --git a/NiceHashMiner/Ethereum.cs b/NiceHashMiner/Ethereum.cs index 23eb646..9e2cae6 100644 --- a/NiceHashMiner/Ethereum.cs +++ b/NiceHashMiner/Ethereum.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using NiceHashMiner.Configs; using NiceHashMiner.Miners; +using NiceHashMiner.Miners.Grouping; namespace NiceHashMiner { diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index c84808a..f695d4b 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -12,7 +12,7 @@ using NiceHashMiner.Interfaces; namespace NiceHashMiner.Forms { - using MinersManager = MinersManager_NEW; + using NiceHashMiner.Miners.Grouping; public partial class Form_Benchmark : Form, IListItemCheckColorSetter, IBenchmarkComunicator, IBenchmarkCalculation { private bool _inBenchmark = false; @@ -403,23 +403,20 @@ void NextBenchmark() { } } - var currentConfig = _currentDevice.DeviceBenchmarkConfig; - if (_currentDevice.DeviceGroupType == DeviceGroupType.CPU && (_currentAlgorithm != null && _currentAlgorithm.NiceHashID != AlgorithmType.Equihash)) { - _currentMiner = MinersManager.CreateMiner(DeviceGroupType.CPU, AlgorithmType.NONE); - if (_currentAlgorithm != null && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { + if (_currentDevice != null && _currentAlgorithm != null) { + _currentMiner = MinersManager.CreateMiner(_currentDevice, _currentAlgorithm); + if(_currentDevice.DeviceType == DeviceType.CPU && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { __CPUBenchmarkStatus = new CPUBenchmarkStatus(); _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; + } else { + __CPUBenchmarkStatus = null; } - } else { - _currentMiner = MinersManager.CreateMiner(currentConfig.DeviceGroupType, _currentAlgorithm.NiceHashID); - __CPUBenchmarkStatus = null; } if (_currentMiner != null && _currentAlgorithm != null) { _benchmarkMiners.Add(_currentMiner); CurrentAlgoName = AlgorithmNiceHashNames.GetName(_currentAlgorithm.NiceHashID); - // this has no effect for CPU miners - _currentMiner.SetCDevs(new string[] { _currentDevice.UUID }); + _currentMiner.InitBenchmarkSetup(new MiningPair(_currentDevice, _currentAlgorithm)); var time = ConfigManager.Instance.GeneralConfig.BenchmarkTimeLimits .GetBenchamrktime(benchmarkOptions1.PerformanceType, _currentDevice.DeviceGroupType); @@ -434,7 +431,7 @@ void NextBenchmark() { dotCount = 0; _benchmarkingTimer.Start(); - _currentMiner.BenchmarkStart(_currentDevice, _currentAlgorithm, time, this); + _currentMiner.BenchmarkStart(time, this); algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, getDotsWaitString()); } else { @@ -530,7 +527,7 @@ public void OnBenchmarkComplete(bool success, string status) { algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, ""); } if (rebenchSame) { - _currentMiner.BenchmarkStart(_currentDevice, _currentAlgorithm, __CPUBenchmarkStatus.Time, this); + _currentMiner.BenchmarkStart(__CPUBenchmarkStatus.Time, this); } else { NextBenchmark(); } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 95b5db0..c5f2bbd 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -24,7 +24,7 @@ namespace NiceHashMiner { - using MinersManager = MinersManager_NEW; + using NiceHashMiner.Miners.Grouping; public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, IMainFormRatesComunication { private static string VisitURL = Links.VisitURL; @@ -372,7 +372,7 @@ private void SMAMinerCheck_Tick(object sender, EventArgs e) } #if (SWITCH_TESTING) - SMAMinerCheck.Interval = MinersManager.SMAMinerCheckInterval; + SMAMinerCheck.Interval = MiningDevice.SMAMinerCheckInterval; #endif MinersManager.Instance.SwichMostProfitableGroupUpMethod(Globals.NiceHashData); } diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index da4e1cb..c842ca8 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -2,6 +2,8 @@ using NiceHashMiner.Devices; using NiceHashMiner.Enums; using NiceHashMiner.Miners; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; using System; using System.Collections.Generic; using System.Data; @@ -529,15 +531,12 @@ private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, Ev IsChange = true; ConfigManager.Instance.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - var thisListDev = new List() { cDev }; if (cDev.DeviceType == DeviceType.AMD) { foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { if (algorithm.Key != AlgorithmType.DaggerHashimoto) { algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; - cDev.MostProfitableAlgorithm = algorithm.Value; - algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( - thisListDev, algorithm.Key, DeviceType.AMD, "", false - ); + algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + new MiningPair(cDev, algorithm.Value), algorithm.Key, DeviceType.AMD, false); } } } @@ -552,32 +551,26 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; if (ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations) { foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - var thisListDev = new List() { cDev }; foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { algorithm.Value.ExtraLaunchParameters = ""; if (cDev.DeviceType == DeviceType.AMD && algorithm.Key != AlgorithmType.DaggerHashimoto) { algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; - cDev.MostProfitableAlgorithm = algorithm.Value; - algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( - thisListDev, algorithm.Key, cDev.DeviceType, "", false - ); + algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + new MiningPair(cDev, algorithm.Value), algorithm.Key, cDev.DeviceType, false); } } } } else { foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults - var thisListDev = new List() { cDev }; + if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults var deviceDefaults = GroupAlgorithms.CreateDefaultsForGroup(cDev.DeviceGroupType); foreach (var defaultAlgoSettings in deviceDefaults) { if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(defaultAlgoSettings.Key)) { var algorithmKey = defaultAlgoSettings.Key; var algorithm = cDev.DeviceBenchmarkConfig.AlgorithmSettings[algorithmKey]; algorithm.ExtraLaunchParameters = defaultAlgoSettings.Value.ExtraLaunchParameters; - cDev.MostProfitableAlgorithm = algorithm; - algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForCDevs( - thisListDev, algorithmKey, cDev.DeviceType, "", false - ); + algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + new MiningPair(cDev, algorithm), algorithmKey, cDev.DeviceType, false); } } // set extra optimizations based on device diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index 2364d7f..a799876 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -8,7 +8,8 @@ public class Globals { public static string[] MiningLocation = { "eu", "usa", "hk", "jp" }; public static Dictionary NiceHashData = null; public static double BitcoinRate; - public static string DemoUser = "34HKWdzLxWBduUfJE9JxaFhoXnfC6gmePG"; + public static readonly string DemoUser = "34HKWdzLxWBduUfJE9JxaFhoXnfC6gmePG"; + public static readonly string PasswordDefault = "x"; public static JsonSerializerSettings JsonSettings = null; public static int ThreadsPerCPU; // quickfix guard for checking internet conection diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 27dd7bf..0a43673 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -4,18 +4,19 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; namespace NiceHashMiner.Miners { public class eqm : nheqBase { public eqm() - : base(DeviceType.NVIDIA_CPU, "eqm") { + : base("eqm") { Path = MinerPaths.eqm; WorkingDirectory = MinerPaths.eqm.Replace("eqm.exe", ""); IsNHLocked = true; } - public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) { - CurrentMiningAlgorithm = miningAlgorithm; + public override void Start(string url, string btcAdress, string worker) { LastCommandLine = GetDevicesCommandString() + " -a " + APIPort + " -l " + url + " -u " + btcAdress + " -w " + worker; ProcessHandle = _Start(); } @@ -24,25 +25,23 @@ public override void Start(Algorithm miningAlgorithm, string url, string btcAdre protected override string GetDevicesCommandString() { string deviceStringCommand = " "; - if (CPUs.Count > 0) { - deviceStringCommand += "-p " + CPUs.Count; - if (CPUs[0].MostProfitableAlgorithm.LessThreads > 0 || !string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU, Path); - } + if (CPU_Setup.IsInit) { + deviceStringCommand += "-p " + CPU_Setup.MiningPairs.Count; + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(CPU_Setup, DeviceType.CPU); } else { // disable CPU deviceStringCommand += " -t 0 "; } - if (NVIDIAs.Count > 0) { + if (NVIDIA_Setup.IsInit) { deviceStringCommand += " -cd "; - foreach (var nvidia in NVIDIAs) { - for (int i = 0; i < ExtraLaunchParametersParser.GetEqmThreadCount(nvidia); ++i) { - deviceStringCommand += nvidia.ID + " "; + foreach (var nvidia_pair in NVIDIA_Setup.MiningPairs) { + for (int i = 0; i < ExtraLaunchParametersParser.GetEqmCudaThreadCount(nvidia_pair); ++i) { + deviceStringCommand += nvidia_pair.Device.ID + " "; } } // no extra launch params - //deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(NVIDIAs, AlgorithmType.Equihash, DeviceType.NVIDIA, Path); + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(NVIDIA_Setup, DeviceType.NVIDIA); } return deviceStringCommand; diff --git a/NiceHashMiner/Miners/Equihash/nheqBase.cs b/NiceHashMiner/Miners/Equihash/nheqBase.cs index 5d6bab5..df1b6db 100644 --- a/NiceHashMiner/Miners/Equihash/nheqBase.cs +++ b/NiceHashMiner/Miners/Equihash/nheqBase.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; using NiceHashMiner.Devices; using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; using System; using System.Collections.Generic; using System.Globalization; @@ -11,10 +12,10 @@ namespace NiceHashMiner.Miners { public abstract class nheqBase : Miner { - protected List CPUs = new List(); - protected List NVIDIAs = new List(); + protected MiningSetup CPU_Setup = new MiningSetup(null); + protected MiningSetup NVIDIA_Setup = new MiningSetup(null); protected readonly int AMD_OCL_PLATFORM; - protected List AMDs = new List(); + protected MiningSetup AMD_Setup = new MiningSetup(null); // extra benchmark stuff protected double curSpeed = 0; @@ -36,39 +37,42 @@ private class JsonApiResponse { public object error { get; set; } } - public nheqBase(DeviceType deviceType, string minerDeviceName) - : base(deviceType, DeviceGroupType.NONE, minerDeviceName) { + public nheqBase(string minerDeviceName) + : base(minerDeviceName) { AMD_OCL_PLATFORM = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; } - public override void SetCDevs(string[] deviceUUIDs) { - base.SetCDevs(deviceUUIDs); - foreach (var cDev in CDevs) { - if (cDev.DeviceType == DeviceType.CPU) { - CPUs.Add(cDev); + public override void InitMiningSetup(MiningSetup miningSetup) { + base.InitMiningSetup(miningSetup); + List CPUs = new List(); + List NVIDIAs = new List(); + List AMDs = new List(); + foreach (var pairs in MiningSetup.MiningPairs) { + if (pairs.Device.DeviceType == DeviceType.CPU) { + CPUs.Add(pairs); } - if (cDev.DeviceType == DeviceType.NVIDIA) { - NVIDIAs.Add(cDev); + if (pairs.Device.DeviceType == DeviceType.NVIDIA) { + NVIDIAs.Add(pairs); } - if (cDev.DeviceType == DeviceType.AMD) { - AMDs.Add(cDev); + if (pairs.Device.DeviceType == DeviceType.AMD) { + AMDs.Add(pairs); } } + // reinit + CPU_Setup = new MiningSetup(CPUs); + NVIDIA_Setup = new MiningSetup(NVIDIAs); + AMD_Setup = new MiningSetup(AMDs); } protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { // TODO nvidia extras - CurrentMiningAlgorithm = algorithm; String ret = "-b " + GetDevicesCommandString(); return ret; } public override APIData GetSummary() { _currentMinerReadStatus = MinerAPIReadStatus.NONE; - APIData ad = new APIData(); - ad.AlgorithmID = AlgorithmType.Equihash; - ad.AlgorithmName = "equihash"; - ad.Speed = 0; + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); TcpClient client = null; JsonApiResponse resp = null; @@ -92,6 +96,8 @@ public override APIData GetSummary() { if (ad.Speed == 0) { _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; } + } else if (resp == null) { + _currentMinerReadStatus = MinerAPIReadStatus.NONE; } return ad; @@ -108,9 +114,6 @@ protected override bool UpdateBindPortCommand(int oldPort, int newPort) { } return false; } - protected override void InitSupportedMinerAlgorithms() { - _supportedMinerAlgorithms = new AlgorithmType[] { AlgorithmType.Equihash }; - } protected override void _Stop(MinerStopType willswitch) { Stop_cpu_ccminer_sgminer_nheqminer(willswitch); diff --git a/NiceHashMiner/Miners/Equihash/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs index 2e31813..72a60b6 100644 --- a/NiceHashMiner/Miners/Equihash/nheqminer.cs +++ b/NiceHashMiner/Miners/Equihash/nheqminer.cs @@ -9,11 +9,14 @@ using System.Net.Sockets; using System.Text; using System.Threading.Tasks; +using NiceHashMiner.Miners.Grouping; +using System.Diagnostics; +using NiceHashMiner.Miners.Parsing; namespace NiceHashMiner.Miners { public class nheqminer : nheqBase { public nheqminer() - : base(DeviceType.ALL, "nheqminer") { + : base("nheqminer") { Path = MinerPaths.nheqminer; WorkingDirectory = MinerPaths.nheqminer.Replace("nheqminer.exe", ""); } @@ -21,15 +24,18 @@ public nheqminer() // CPU aff set from NHM protected override NiceHashProcess _Start() { NiceHashProcess P = base._Start(); - if (CPUs.Count > 0 && CPUs[0].AffinityMask != 0 && P != null) - CPUID.AdjustAffinity(P.Id, CPUs[0].AffinityMask); + if (CPU_Setup.IsInit && P != null) { + var AffinityMask = CPU_Setup.MiningPairs[0].Device.AffinityMask; + if (AffinityMask != 0) { + CPUID.AdjustAffinity(P.Id, AffinityMask); + } + } return P; } - public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) { + public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); - CurrentMiningAlgorithm = miningAlgorithm; LastCommandLine = GetDevicesCommandString() + " -a " + APIPort + " -l " + url + " -u " + username; ProcessHandle = _Start(); } @@ -38,37 +44,47 @@ public override void Start(Algorithm miningAlgorithm, string url, string btcAdre protected override string GetDevicesCommandString() { string deviceStringCommand = " "; - if (CPUs.Count > 0) { - if (CPUs[0].MostProfitableAlgorithm.LessThreads > 0 || !string.IsNullOrEmpty(CPUs[0].MostProfitableAlgorithm.ExtraLaunchParameters)) { - // TODO parse - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(CPUs, AlgorithmType.Equihash, DeviceType.CPU, Path); - } + if (CPU_Setup.IsInit) { + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(CPU_Setup, DeviceType.CPU); } else { // disable CPU deviceStringCommand += " -t 0 "; } - if (NVIDIAs.Count > 0) { + if (NVIDIA_Setup.IsInit) { deviceStringCommand += " -cd "; - foreach (var nvidia in NVIDIAs) { - deviceStringCommand += nvidia.ID + " "; + foreach (var nvidia_pair in NVIDIA_Setup.MiningPairs) { + deviceStringCommand += nvidia_pair.Device.ID + " "; } - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(NVIDIAs, AlgorithmType.Equihash, DeviceType.NVIDIA, Path); + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(NVIDIA_Setup, DeviceType.NVIDIA); } - if (AMDs.Count > 0) { + if (AMD_Setup.IsInit) { deviceStringCommand += " -op " + AMD_OCL_PLATFORM.ToString(); deviceStringCommand += " -od "; - foreach (var amd in AMDs) { - deviceStringCommand += amd.ID + " "; + foreach (var amd_pair in AMD_Setup.MiningPairs) { + deviceStringCommand += amd_pair.Device.ID + " "; } - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForCDevs(AMDs, AlgorithmType.Equihash, DeviceType.AMD, Path); + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(AMD_Setup, DeviceType.AMD); } return deviceStringCommand; } // benchmark stuff + protected override Process BenchmarkStartProcess(string CommandLine) { + Process BenchmarkHandle = base.BenchmarkStartProcess(CommandLine); + + if (CPU_Setup.IsInit && BenchmarkHandle != null) { + var AffinityMask = CPU_Setup.MiningPairs[0].Device.AffinityMask; + if (AffinityMask != 0) { + CPUID.AdjustAffinity(BenchmarkHandle.Id, AffinityMask); + } + } + + return BenchmarkHandle; + } + protected override bool BenchmarkParseLine(string outdata) { if (outdata.Contains(Iter_PER_SEC)) { diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs new file mode 100644 index 0000000..30bb77f --- /dev/null +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NiceHashMiner.Enums; +using NiceHashMiner.Devices; +using NiceHashMiner.Configs; + +namespace NiceHashMiner.Miners.Grouping { + public class GroupMiner { + public Miner Miner { get; protected set; } + public string DevicesInfoString { get; private set; } + public AlgorithmType AlgorithmType { get; private set; } + // for now used only for dagger identification AMD or NVIDIA + public DeviceType DeviceType { get; private set; } + public double CurrentRate { get; set; } + public string Key { get; private set; } + + //private string _miningLocation = ""; + //private string _btcAdress = ""; + //private string _worker = ""; + + // , string miningLocation, string btcAdress, string worker + public GroupMiner(List miningPairs, string key) { + AlgorithmType = AlgorithmType.NONE; + DevicesInfoString = "N/A"; + CurrentRate = 0; + Key = key; + if (miningPairs.Count > 0) { + // sort pairs by device id + miningPairs.Sort((a, b) => a.Device.ID - b.Device.ID); + // init name scope + { + List deviceNames = new List(); + foreach (var pair in miningPairs) { + deviceNames.Add(pair.Device.NameCount); + } + DevicesInfoString = "{ " + string.Join(", ", deviceNames) + " }"; + } + // init miner + { + var mPair = miningPairs[0]; + DeviceType = mPair.Device.DeviceType; + Miner = MinersManager.CreateMiner(mPair.Device.DeviceType, + MinerPaths.GetOptimizedMinerPath(mPair)); + if(Miner != null) { + Miner.InitMiningSetup(new MiningSetup(miningPairs)); + AlgorithmType = mPair.Algorithm.NiceHashID; + } + } + } + } + + public void Stop() { + if (Miner != null && Miner.IsRunning) { + Miner.Stop(MinerStopType.SWITCH); + // wait before going on + System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + } + CurrentRate = 0; + } + + public void End() { + if (Miner != null) { + Miner.End(); + } + CurrentRate = 0; + } + + public void Start(string miningLocation, string btcAdress, string worker) { + if(Miner.IsRunning) { + return; + } + // Wait before new start + System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + + string name = Globals.NiceHashData[AlgorithmType].name; + int port = Globals.NiceHashData[AlgorithmType].port; + if (AlgorithmType == AlgorithmType.Equihash) { + if (Miner.IsNHLocked) { + Miner.Start(miningLocation, btcAdress, worker); + } else { + Miner.Start( + name + + "." + miningLocation + + ".nicehash.com:" + + port, btcAdress, worker); + } + } else { + Miner.Start( + "stratum+tcp://" + + name + + "." + miningLocation + + ".nicehash.com:" + + port, btcAdress, worker); + } + } + } +} diff --git a/NiceHashMiner/Miners/Grouping/GroupMiners.cs b/NiceHashMiner/Miners/Grouping/GroupMiners.cs deleted file mode 100644 index 4666c9e..0000000 --- a/NiceHashMiner/Miners/Grouping/GroupMiners.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NiceHashMiner.Enums; -using NiceHashMiner.Devices; -using NiceHashMiner.Configs; - -namespace NiceHashMiner.Miners { - - // typedefs - using MinersManager = MinersManager_NEW; - using GroupedDevices = SortedSet; - // for switching different miners for different algorithms - public class GroupMiners { - public Miner CurrentWorkingMiner { get; protected set; } - public string DevicesInfoString { get; private set; } - - protected List _miners; - protected SortedSet _deviceNames; - protected string[] _deviceUUIDs; - protected DeviceGroupType _deviceGroupType = DeviceGroupType.NONE; - - public GroupMiners(GroupedDevices deviceUUIDSet) { - _miners = new List(); - _deviceNames = new SortedSet(); - foreach (var uuid in deviceUUIDSet) { - var tmpCdev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid); - _deviceNames.Add(tmpCdev.NameCount); - if (_deviceGroupType == DeviceGroupType.NONE) { - _deviceGroupType = tmpCdev.DeviceGroupType; - } - } - // init device uuids - _deviceUUIDs = deviceUUIDSet.ToArray(); - - DevicesInfoString = "{ " + string.Join(", ", _deviceNames) + " }"; - } - - private void StopMiner(Miner miner) { - if (miner.IsRunning) { - miner.Stop(MinerStopType.SWITCH); - // wait 0.5 seconds before going on - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - } - } - - public void Stop() { - foreach (var miner in _miners) { - StopMiner(miner); - } - } - - public void End() { - foreach (var miner in _miners) { - miner.End(); - } - } - - public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string btcAdress, string worker) { - bool containsSupportedMiner = false; - Miner startSwitchMiner = null; - var algorithmType = algorithm.NiceHashID; - foreach (var miner in _miners) { - if (miner.IsSupportedMinerAlgorithms(algorithmType)) { - containsSupportedMiner = true; - startSwitchMiner = miner; - break; - } - } - // check if contains miner if not create one - if (!containsSupportedMiner) { - startSwitchMiner = MinersManager.CreateMiner(_deviceGroupType, algorithmType); - startSwitchMiner.SetCDevs(_deviceUUIDs); - _miners.Add(startSwitchMiner); - } - - // hanlde CurrentWorkingMiner change - if (CurrentWorkingMiner != null && CurrentWorkingMiner != startSwitchMiner) { - StopMiner(CurrentWorkingMiner); - CurrentWorkingMiner = startSwitchMiner; - } else { - CurrentWorkingMiner = startSwitchMiner; - } - SwitchMinerAlgorithm(ref startSwitchMiner, algorithm, miningLocation, btcAdress, worker); - } - - private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string miningLocation, string btcAdress, string worker) { - // if is running and the current algorithm is the same skip - if (m.IsRunning && m.CurrentAlgorithmType == algorithm.NiceHashID) { - return; - } - - if (m.CurrentAlgorithmType != AlgorithmType.NONE && m.CurrentAlgorithmType != AlgorithmType.INVALID) { - m.Stop(MinerStopType.SWITCH); - // wait 0.5 seconds before going on - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - } - - var MaxProfitKey = algorithm.NiceHashID; - - // Wait before new start - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - - if (MaxProfitKey == AlgorithmType.Equihash) { - if (m.IsNHLocked) { - m.Start(algorithm, miningLocation, btcAdress, worker); - } else { - m.Start(algorithm, - Globals.NiceHashData[MaxProfitKey].name - + "." + miningLocation - + ".nicehash.com:" - + Globals.NiceHashData[MaxProfitKey].port, btcAdress, worker); - } - } else { - m.Start(algorithm, - "stratum+tcp://" - + Globals.NiceHashData[MaxProfitKey].name - + "." + miningLocation - + ".nicehash.com:" - + Globals.NiceHashData[MaxProfitKey].port, btcAdress, worker); - } - } - } -} diff --git a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs new file mode 100644 index 0000000..162edc9 --- /dev/null +++ b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs @@ -0,0 +1,146 @@ +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners.Grouping { + public static class GroupSetupUtils { + static readonly string TAG = "GroupSetupUtils"; + public static bool IsAlgoMiningCapable(Algorithm algo) { + return algo != null && !algo.Skip && algo.BenchmarkSpeed > 0; + } + public static bool IsValidMinerPath(ComputeDevice device, Algorithm algo) { + return MinerPaths.NONE != MinerPaths.GetOptimizedMinerPath(device, algo); + } + + public static Tuple getDeviceMiningStatus(ComputeDevice device) { + DeviceMiningStatus status = DeviceMiningStatus.CanMine; + if (device == null) { // C# is null happy + status = DeviceMiningStatus.DeviceNull; + } else if (device.Enabled == false) { + status = DeviceMiningStatus.Disabled; + } else { + bool hasEnabledAlgo = false; + foreach (Algorithm algo in device.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + hasEnabledAlgo |= IsAlgoMiningCapable(algo) && IsValidMinerPath(device, algo); + } + if (hasEnabledAlgo == false) { + status = DeviceMiningStatus.NoEnabledAlgorithms; + } + } + return new Tuple(device, status); + } + + private static Tuple, List>> GetMiningAndNonMiningDevices(List devices) { + List> nonMiningDevStatuses = new List>(); + List miningDevices = new List(); + foreach (var dev in devices) { + var devStatus = getDeviceMiningStatus(dev); + if (devStatus.Item2 == DeviceMiningStatus.CanMine) { + miningDevices.Add(new MiningDevice(dev)); + } else { + nonMiningDevStatuses.Add(devStatus); + } + } + return new Tuple, List>>(miningDevices, nonMiningDevStatuses); + } + + private static string GetDisabledDeviceStatusString(Tuple devStatusTuple) { + var dev = devStatusTuple.Item1; + var status = devStatusTuple.Item2; + if (DeviceMiningStatus.DeviceNull == status) { + return "Passed Device is NULL"; + } else if (DeviceMiningStatus.Disabled == status) { + return "DISABLED: " + dev.GetFullName(); + } else if (DeviceMiningStatus.NoEnabledAlgorithms == status) { + return "No Enabled Algorithms: " + dev.GetFullName(); + } + return "Invalid status Passed"; + } + private static void LogMiningNonMiningStatuses(List enabledDevices, List> disabledDevicesStatuses) { + // print statuses + if (disabledDevicesStatuses.Count > 0) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(""); + stringBuilder.AppendLine("Disabled Devices:"); + foreach (var deviceStatus in disabledDevicesStatuses) { + stringBuilder.AppendLine("\t" + GetDisabledDeviceStatusString(deviceStatus)); + } + Helpers.ConsolePrint(TAG, stringBuilder.ToString()); + } + if (enabledDevices.Count > 0) { + // print enabled + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(""); + stringBuilder.AppendLine("Enabled Devices for Mining session:"); + foreach (var miningDevice in enabledDevices) { + var device = miningDevice.Device; + stringBuilder.AppendLine(String.Format("\tENABLED ({0})", device.GetFullName())); + foreach (var algo in device.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + var isEnabled = IsAlgoMiningCapable(algo) && IsValidMinerPath(device, algo); + stringBuilder.AppendLine(String.Format("\t\tALGORITHM {0} ({1})", + isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED + AlgorithmNiceHashNames.GetName(algo.NiceHashID))); + } + } + Helpers.ConsolePrint(TAG, stringBuilder.ToString()); + } + } + + public static List GetMiningDevices(List devices, bool log) { + var miningNonMiningDevs = GetMiningAndNonMiningDevices(devices); + if(log) { + LogMiningNonMiningStatuses(miningNonMiningDevs.Item1, miningNonMiningDevs.Item2); + } + return miningNonMiningDevs.Item1; + } + + // avarage passed in benchmark values + public static void AvarageSpeeds(List miningDevs) { + // calculate avarage speeds, to ensure mining stability + // device name, algo key, algos refs list + Dictionary>> avarager = new Dictionary>>(); + // init empty avarager + foreach (var device in miningDevs) { + string devName = device.Device.Name; + avarager[devName] = new Dictionary>(); + foreach (var key in AlgorithmNiceHashNames.GetAllAvaliableTypes()) { + avarager[devName][key] = new List(); + } + } + // fill avarager + foreach (var device in miningDevs) { + string devName = device.Device.Name; + foreach (var kvp in device.Algorithms) { + var key = kvp.Key; + MiningAlgorithm algo = kvp.Value; + avarager[devName][key].Add(algo); + } + } + // calculate avarages + foreach (var devDict in avarager.Values) { + foreach (List miningAlgosList in devDict.Values) { + // if list not empty calculate avarage + if (miningAlgosList.Count > 0) { + // calculate avarage + double sum = 0; + foreach (var algo in miningAlgosList) { + sum += algo.AvaragedSpeed; + } + double avarageSpeed = sum / miningAlgosList.Count; + // set avarage + foreach (var algo in miningAlgosList) { + algo.AvaragedSpeed = avarageSpeed; + } + } + } + } + } + + } +} diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index a49bda4..ab00e4a 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -6,96 +6,79 @@ using System.Text; using System.Threading.Tasks; -namespace NiceHashMiner.Miners { - using MinersManager = MinersManager_NEW; +namespace NiceHashMiner.Miners.Grouping { public static class GroupingLogic { - private static bool IsAlgorithmSettingsSame(Algorithm a, Algorithm b) { - return a.NiceHashID == b.NiceHashID -#if (SWITCH_TESTING) - && (!ForcePerCardMiners) // this will force individual miners -#endif -; - } - - private static bool IsNvidiaDevice(ComputeDevice a) { - return a.DeviceType == DeviceType.NVIDIA; - } - public static bool IsEquihashGroupLogic(ComputeDevice a, ComputeDevice b) { - // eqm - if (IsEquihashDevice_eqm(a) && IsEquihashDevice_eqm(b)) { // both eqm - return IsEquihashAnd_eqm(a, b); - } - // nheqmnier - else if (!IsEquihashDevice_eqm(a) && !IsEquihashDevice_eqm(b)) { // both NOT eqm - return IsEquihashAnd_nheqminer(a, b); + public static bool ShouldGroup(MiningPair a, MiningPair b) { + // group if same bin path and same algo type + if (IsSameBinPath(a, b) && IsSameAlgorithmType(a, b)) { + AlgorithmType algorithmType = a.Algorithm.NiceHashID; + // AlgorithmType.Equihash is special case + if (AlgorithmType.Equihash == algorithmType) { + string minerPath = MinerPaths.GetOptimizedMinerPath(a); + return EquihashGroup.IsEquihashGroupLogic(minerPath, + a, b); + } + // all other algorithms are grouped if DeviceType is same and is not CPU + else if (IsNotCpuGroups(a, b) && IsSameDeviceType(a, b)) { + return true; + } } return false; } - // nheqminer - private static bool IsEquihashAnd_nheqminer(ComputeDevice a, ComputeDevice b) { - return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash - && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID - && IsEquihashAnd_CPU_nheqminer(a) - && IsEquihashAnd_CPU_nheqminer(b); - } - // group only first CPU split - private static bool IsEquihashAnd_CPU_nheqminer(ComputeDevice a) { - return a.DeviceType != DeviceType.CPU // if not cpu then ignore case always good - || a.ID == 0; // if CPU ID must be 0 - } + private static class EquihashGroup { + public static bool IsEquihashGroupLogic(string minerPath, MiningPair a, MiningPair b) { + // eqm + if (MinerPaths.eqm == minerPath) { + return Is_eqm(a, b); + } + // nheqmnier + else if (MinerPaths.nheqminer == minerPath) { + return Is_nheqminer(a, b); + } + return false; + } - // eqm - private static bool IsEquihashAnd_eqm(ComputeDevice a, ComputeDevice b) { - return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.Equihash - && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID; - } - private static bool IsEquihashDevice_eqm(ComputeDevice a) { - return IsEquihashCPU_eqm(a) || IsEquihashNVIDIA_eqm(a); - } - private static bool IsEquihashCPU_eqm(ComputeDevice a) { - return MinersManager.EquihashCPU_USE_eqm() && a.DeviceType == DeviceType.CPU; - } - private static bool IsEquihashNVIDIA_eqm(ComputeDevice a) { - return a.DeviceGroupType == DeviceGroupType.NVIDIA_5_x || a.DeviceGroupType == DeviceGroupType.NVIDIA_6_x; - } + // nheqminer + private static bool Is_nheqminer(MiningPair a, MiningPair b) { + return IsDevice_nheqminer(a) && IsDevice_nheqminer(b); + } + // group only first CPU split + private static bool IsDevice_nheqminer(MiningPair a) { + return a.Device.DeviceType != DeviceType.CPU // if not cpu then ignore case always good + || a.Device.ID == 0; // if CPU ID must be 0 + } - // checks if dagger algo, same settings and if compute platform is same - public static bool IsDaggerAndSameComputePlatform(ComputeDevice a, ComputeDevice b) { - return a.MostProfitableAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto - && a.MostProfitableAlgorithm.NiceHashID == b.MostProfitableAlgorithm.NiceHashID //IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) - // check if both etherum capable - && a.IsEtherumCapale && b.IsEtherumCapale - // compute platforms must be same - && (IsNvidiaDevice(a) == IsNvidiaDevice(b)); + // eqm + private static bool Is_eqm(MiningPair a, MiningPair b) { + return IsDevice_eqm(a) && IsDevice_eqm(b); + } + private static bool IsDevice_eqm(MiningPair a) { + return IsCPU_eqm(a) || IsNVIDIA_eqm(a); + } + private static bool IsCPU_eqm(MiningPair a) { + return MinersManager.EquihashCPU_USE_eqm() && a.Device.DeviceType == DeviceType.CPU; + } + private static bool IsNVIDIA_eqm(MiningPair a) { + var groupType = a.Device.DeviceGroupType; + return DeviceGroupType.NVIDIA_5_x == groupType || DeviceGroupType.NVIDIA_6_x == groupType; + } } - private static bool IsNotCpuGroups(ComputeDevice a, ComputeDevice b) { - return a.DeviceGroupType != DeviceGroupType.CPU && b.DeviceGroupType != DeviceGroupType.CPU; + private static bool IsNotCpuGroups(MiningPair a, MiningPair b) { + return a.Device.DeviceType != DeviceType.CPU && b.Device.DeviceType != DeviceType.CPU; } - // this will not check Ethminer path - private static bool IsSameBinPath(ComputeDevice a, ComputeDevice b) { - // same group uses same Miner class and therefore same binary path for same algorithm - bool sameGroup = a.DeviceGroupType == b.DeviceGroupType; - if (!sameGroup) { - var a_algoType = a.MostProfitableAlgorithm.NiceHashID; - var b_algoType = b.MostProfitableAlgorithm.NiceHashID; - // a and b algorithm settings should be the same if we call this function - return MinerPaths.GetOptimizedMinerPath(a_algoType, a.DeviceType, a.DeviceGroupType, a.Codename, a.IsOptimizedVersion) - == MinerPaths.GetOptimizedMinerPath(b_algoType, b.DeviceType, b.DeviceGroupType, b.Codename, b.IsOptimizedVersion); - } - - return true; + private static bool IsSameBinPath(MiningPair a, MiningPair b) { + return MinerPaths.GetOptimizedMinerPath(a) + == MinerPaths.GetOptimizedMinerPath(b); } - - // we don't want to group CPU devices - public static bool IsGroupBinaryAndAlgorithmSame(ComputeDevice a, ComputeDevice b) { - return IsNotCpuGroups(a, b) - && IsAlgorithmSettingsSame(a.MostProfitableAlgorithm, b.MostProfitableAlgorithm) - && IsSameBinPath(a, b) - && a.DeviceType == b.DeviceType; + private static bool IsSameAlgorithmType(MiningPair a, MiningPair b) { + return a.Algorithm.NiceHashID == b.Algorithm.NiceHashID; + } + private static bool IsSameDeviceType(MiningPair a, MiningPair b) { + return a.Device.DeviceType == b.Device.DeviceType; } } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 51c64f2..117c2d3 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -4,10 +4,8 @@ using System.Collections.Generic; using System.Text; -namespace NiceHashMiner.Miners +namespace NiceHashMiner.Miners.Grouping { - using MinersManager = MinersManager_NEW; - /// /// MinerPaths, used just to store miners paths strings. Only one instance needed /// @@ -58,6 +56,21 @@ public static class MinerPaths public const string NONE = ""; + public static string GetOptimizedMinerPath(MiningPair pair) { + return GetOptimizedMinerPath(pair.Device, pair.Algorithm); + } + + public static string GetOptimizedMinerPath(ComputeDevice computeDevice, Algorithm algorithm) { + if (computeDevice == null || algorithm == null) { + return NONE; + } + AlgorithmType algoType = algorithm.NiceHashID; + DeviceType devType = computeDevice.DeviceType; + DeviceGroupType devGroupType = computeDevice.DeviceGroupType; + string devCodename = computeDevice.Codename; + bool isOptimized = computeDevice.IsOptimizedVersion; + return GetOptimizedMinerPath(algoType, devType, devGroupType, devCodename, isOptimized); + } public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceType deviceType, DeviceGroupType deviceGroupType, string devCodename, bool isOptimized) { // special cases @@ -68,10 +81,10 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy } // AlgorithmType.Equihash special shared case if (algorithmType == AlgorithmType.Equihash) { - if (deviceType == DeviceType.NVIDIA_CPU || deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x + if (deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; - } else { + } else { // supports all DeviceTypes return MinerPaths.nheqminer; } } diff --git a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs new file mode 100644 index 0000000..913da9f --- /dev/null +++ b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs @@ -0,0 +1,23 @@ +using NiceHashMiner.Devices; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners.Grouping { + public class MiningAlgorithm { + public MiningAlgorithm(ComputeDevice dev, Algorithm algo) { + this.algoRef = algo; + // init speed that will be avaraged later + this.AvaragedSpeed = algo.BenchmarkSpeed; + this.MinerPath = MinerPaths.GetOptimizedMinerPath(dev, algo); + } + public Algorithm algoRef { get; private set; } + public string MinerPath { get; private set; } + // avarage speed of same devices to increase mining stability + public double AvaragedSpeed = 0; + public double CurrentProfit = 0; + public double CurNhmSMADataVal = 0; + } +} diff --git a/NiceHashMiner/Miners/Grouping/MiningDevice.cs b/NiceHashMiner/Miners/Grouping/MiningDevice.cs new file mode 100644 index 0000000..3cd845b --- /dev/null +++ b/NiceHashMiner/Miners/Grouping/MiningDevice.cs @@ -0,0 +1,122 @@ +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners.Grouping { + public class MiningDevice { + + // switch testing quick and dirty, runtime versions +#if (SWITCH_TESTING) + static List testingAlgos = new List() { + ////AlgorithmType.X13, + ////AlgorithmType.Keccak, + ////AlgorithmType.X15, + AlgorithmType.Nist5, + AlgorithmType.NeoScrypt, + AlgorithmType.Lyra2RE, + AlgorithmType.WhirlpoolX, + AlgorithmType.Qubit, + AlgorithmType.Quark, + AlgorithmType.Lyra2REv2, + ////AlgorithmType.Blake256r8, + ////AlgorithmType.Blake256r14, + ////AlgorithmType.Blake256r8vnl, + AlgorithmType.Hodl, + AlgorithmType.DaggerHashimoto, + AlgorithmType.Decred, + AlgorithmType.CryptoNight, + AlgorithmType.Lbry, + AlgorithmType.Equihash + }; + static int next = -1; + public static void SetNextTest() { + ++next; + if (next >= testingAlgos.Count) next = 0; + var mostProfitKeyName = AlgorithmNiceHashNames.GetName(testingAlgos[next]); + Helpers.ConsolePrint("SWITCH_TESTING", String.Format("Setting most MostProfitKey to {0}", mostProfitKeyName)); + } + + static bool ForceNone = false; + // globals testing variables + static int seconds = 20; + public static int SMAMinerCheckInterval = seconds * 1000; // 30s + public static bool ForcePerCardMiners = false; +#endif + + public MiningDevice(ComputeDevice device) { + Device = device; + foreach (var kvp in Device.DeviceBenchmarkConfig.AlgorithmSettings) { + AlgorithmType key = kvp.Key; + Algorithm algo = kvp.Value; + bool isAlgoMiningCapable = GroupSetupUtils.IsAlgoMiningCapable(algo); + bool isValidMinerPath = GroupSetupUtils.IsValidMinerPath(device, algo); + if (isAlgoMiningCapable && isValidMinerPath) { + var newMiningAlgo = new MiningAlgorithm(device, algo); + Algorithms[key] = newMiningAlgo; + } + } + } + public ComputeDevice Device { get; private set; } + public Dictionary Algorithms = new Dictionary(); + + public AlgorithmType MostProfitableKey { get; private set; } + + public double GetCurrentMostProfitValue { + get { + if (AlgorithmType.NONE != MostProfitableKey) { + return Algorithms[MostProfitableKey].CurrentProfit; + } + return 0; + } + } + + public MiningPair GetMostProfitablePair() { + return new MiningPair(this.Device, Algorithms[MostProfitableKey].algoRef); + } + + public bool HasProfitableAlgo() { + return MostProfitableKey != AlgorithmType.NONE; + } + + public void CalculateProfits(Dictionary NiceHashData) { + // assume none is profitable + MostProfitableKey = AlgorithmType.NONE; + // calculate new profits + foreach (var miningAlgo in Algorithms) { + AlgorithmType key = miningAlgo.Key; + MiningAlgorithm algo = miningAlgo.Value; + if (NiceHashData.ContainsKey(key)) { + algo.CurNhmSMADataVal = NiceHashData[key].paying; + algo.CurrentProfit = algo.CurNhmSMADataVal * algo.AvaragedSpeed * 0.000000001; + } else { + algo.CurrentProfit = 0; + } + } + // find max paying value and save key + double maxProfit = 0; + foreach (var miningAlgo in Algorithms) { + AlgorithmType key = miningAlgo.Key; + MiningAlgorithm algo = miningAlgo.Value; + if (maxProfit < algo.CurrentProfit) { + maxProfit = algo.CurrentProfit; + MostProfitableKey = key; + } + } +#if (SWITCH_TESTING) + var devName = Device.GetFullName(); + // set new most profit + if (Algorithms.ContainsKey(testingAlgos[next])) { + MostProfitableKey = testingAlgos[next]; + } else if(ForceNone) { + MostProfitableKey = AlgorithmType.NONE; + } + var mostProfitKeyName = AlgorithmNiceHashNames.GetName(MostProfitableKey); + Helpers.ConsolePrint("SWITCH_TESTING", String.Format("Setting device {0} to {1}", devName, mostProfitKeyName)); +#endif + } + } +} diff --git a/NiceHashMiner/Miners/Grouping/MiningPair.cs b/NiceHashMiner/Miners/Grouping/MiningPair.cs new file mode 100644 index 0000000..9649c3b --- /dev/null +++ b/NiceHashMiner/Miners/Grouping/MiningPair.cs @@ -0,0 +1,19 @@ +using NiceHashMiner.Devices; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners.Grouping { + public class MiningPair { + public readonly ComputeDevice Device; + public readonly Algorithm Algorithm; + public string CurrentExtraLaunchParameters; + public MiningPair(ComputeDevice d, Algorithm a) { + this.Device = d; + this.Algorithm = a; + this.CurrentExtraLaunchParameters = Algorithm.ExtraLaunchParameters; + } + } +} diff --git a/NiceHashMiner/Miners/Grouping/MiningSetup.cs b/NiceHashMiner/Miners/Grouping/MiningSetup.cs new file mode 100644 index 0000000..43e2782 --- /dev/null +++ b/NiceHashMiner/Miners/Grouping/MiningSetup.cs @@ -0,0 +1,31 @@ +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners.Grouping { + public class MiningSetup { + public List MiningPairs { get; private set; } + public string MinerPath { get; private set; } + public string MinerName { get; private set; } + public AlgorithmType CurrentAlgorithmType { get; private set; } + public bool IsInit { get; private set; } + + public MiningSetup(List miningPairs) { + this.IsInit = false; + this.CurrentAlgorithmType = AlgorithmType.NONE; + if (miningPairs != null && miningPairs.Count > 0) { + this.MinerPath = MinerPaths.GetOptimizedMinerPath(miningPairs[0]); + if(this.MinerPath != MinerPaths.NONE) { + this.MiningPairs = miningPairs; + this.MiningPairs.Sort((a, b) => a.Device.ID - b.Device.ID); + this.MinerName = miningPairs[0].Algorithm.MinerName; + this.CurrentAlgorithmType = miningPairs[0].Algorithm.NiceHashID; + this.IsInit = true; + } + } + } + } +} diff --git a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs b/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs deleted file mode 100644 index af3bcde..0000000 --- a/NiceHashMiner/Miners/ManagerPrivate/GroupMiners.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NiceHashMiner.Miners { - using NiceHashMiner.Enums; - using NiceHashMiner.Devices; - using NiceHashMiner.Configs; - // typedefs - using GroupedDevices = SortedSet; - - //public partial class MinersManager_OLD { - // // for switching different miners for different algorithms - // private class GroupMiners { - // public Miner CurrentWorkingMiner { get; protected set; } - // public string DevicesInfoString { get; private set; } - - // protected List _miners; - // protected SortedSet _deviceNames; - // protected string[] _deviceUUIDs; - // protected DeviceGroupType _deviceGroupType = DeviceGroupType.NONE; - - // public GroupMiners(GroupedDevices deviceUUIDSet) { - // _miners = new List(); - // _deviceNames = new SortedSet(); - // foreach (var uuid in deviceUUIDSet) { - // var tmpCdev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid); - // _deviceNames.Add(tmpCdev.NameCount); - // if (_deviceGroupType == DeviceGroupType.NONE) { - // _deviceGroupType = tmpCdev.DeviceGroupType; - // } - // } - // // init device uuids - // _deviceUUIDs = deviceUUIDSet.ToArray(); - - // DevicesInfoString = "{ " + string.Join(", ", _deviceNames) + " }"; - // } - - // private void StopMiner(Miner miner) { - // if (miner.IsRunning) { - // miner.Stop(MinerStopType.SWITCH); - // // wait 0.5 seconds before going on - // System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - // } - // } - - // public void Stop() { - // foreach (var miner in _miners) { - // StopMiner(miner); - // } - // } - - // public void End() { - // foreach (var miner in _miners) { - // miner.End(); - // } - // } - - // public void StartAlgorihtm(Algorithm algorithm, string miningLocation, string worker) { - // bool containsSupportedMiner = false; - // Miner startSwitchMiner = null; - // var algorithmType = algorithm.NiceHashID; - // foreach (var miner in _miners) { - // if (miner.IsSupportedMinerAlgorithms(algorithmType)) { - // containsSupportedMiner = true; - // startSwitchMiner = miner; - // break; - // } - // } - // // check if contains miner if not create one - // if (!containsSupportedMiner) { - // startSwitchMiner = CreateMiner(_deviceGroupType, algorithmType); - // startSwitchMiner.SetCDevs(_deviceUUIDs); - // _miners.Add(startSwitchMiner); - // } - - // // hanlde CurrentWorkingMiner change - // if (CurrentWorkingMiner != null && CurrentWorkingMiner != startSwitchMiner) { - // StopMiner(CurrentWorkingMiner); - // CurrentWorkingMiner = startSwitchMiner; - // } else { - // CurrentWorkingMiner = startSwitchMiner; - // } - // SwitchMinerAlgorithm(ref startSwitchMiner, algorithm, miningLocation, worker); - // } - - // private void SwitchMinerAlgorithm(ref Miner m, Algorithm algorithm, string miningLocation, string worker) { - // // if is running and the current algorithm is the same skip - // if (m.IsRunning && m.CurrentAlgorithmType == algorithm.NiceHashID) { - // return; - // } - - // if (m.CurrentAlgorithmType != AlgorithmType.NONE && m.CurrentAlgorithmType != AlgorithmType.INVALID) { - // m.Stop(MinerStopType.SWITCH); - // // wait 0.5 seconds before going on - // System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - // } - - // var MaxProfitKey = algorithm.NiceHashID; - - // // Wait before new start - // System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); - - // if (MaxProfitKey == AlgorithmType.Equihash) { - // if (m.IsNHLocked) { - // // TODO worker name not working with eqm - // string BTC = worker.Substring(0, worker.IndexOf(".")); - // m.Start(algorithm, miningLocation, BTC); - // } else { - // m.Start(algorithm, - // Globals.NiceHashData[MaxProfitKey].name - // + "." + miningLocation - // + ".nicehash.com:" - // + Globals.NiceHashData[MaxProfitKey].port, worker); - // } - // } else { - // m.Start(algorithm, - // "stratum+tcp://" - // + Globals.NiceHashData[MaxProfitKey].name - // + "." + miningLocation - // + ".nicehash.com:" - // + Globals.NiceHashData[MaxProfitKey].port, worker); - // } - // } - // } - //} -} diff --git a/NiceHashMiner/Miners/ManagerPrivate/MinersManager_OLD.cs b/NiceHashMiner/Miners/ManagerPrivate/MinersManager_OLD.cs deleted file mode 100644 index be32a31..0000000 --- a/NiceHashMiner/Miners/ManagerPrivate/MinersManager_OLD.cs +++ /dev/null @@ -1,575 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Diagnostics; -using System.IO; - -using NiceHashMiner.Interfaces; -using NiceHashMiner.Configs; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; - - -using Timer = System.Timers.Timer; -using System.Timers; - -namespace NiceHashMiner.Miners { - // typedefs - using DeviceSubsetList = List>; - using PerDeviceProifitDictionary = Dictionary>; - using PerDeviceSpeedDictionary = Dictionary>; - - using GroupedDevices = SortedSet; - -// public partial class MinersManager_OLD : BaseLazySingleton { - -// // temporary varibales for current session -// PerDeviceSpeedDictionary _perDeviceSpeedDictionary; -// string _miningLocation; - -// string _workerBtcStringWorker; - -// //// ccminers intensity checking -// //public readonly Dictionary> CCMinersIntensitiesBoundries = new Dictionary>() { -// // { MinerPaths.ccminer_decred, Tuple.Create(8.0, 25.0) }, -// // { MinerPaths.ccminer_nanashi, Tuple.Create(8.0, 25.0) }, -// // { MinerPaths.ccminer_tpruvot, Tuple.Create(8.0, 25.0) }, -// // { MinerPaths.ccminer_neoscrypt, Tuple.Create(8.0, 31.0) }, -// // { MinerPaths.ccminer_sp, Tuple.Create(8.0, 31.0) }, -// //}; - -// // GroupDevices hash code doesn't work correctly use string instead -// //Dictionary _groupedDevicesMiners; -// Dictionary _groupedDevicesMiners; -// List _enabledDevices; -// List> _previousAllGroupedDevices; -// List> _currentAllGroupedDevices; - -// IMainFormRatesComunication _mainFormRatesComunication; - -// private Timer _preventSleepTimer; -// // check internet connection -// private Timer _internetCheckTimer; - -// private bool IsProfitable = true; -// private bool IsConnectedToInternet = true; - -// readonly string TAG; - -// readonly string DOUBLE_FORMAT = "F12"; - -// private bool IsCurrentlyIdle = true; - -// protected MinersManager_OLD() { -// TAG = this.GetType().Name; -// _preventSleepTimer = new Timer(); -// _preventSleepTimer.Elapsed += PreventSleepTimer_Tick; -// // sleep time is minimal 1 minute -// _preventSleepTimer.Interval = 20 * 1000; // leave this interval, it works - -// // set internet checking -// _internetCheckTimer = new Timer(); -// _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; -// _internetCheckTimer.Interval = 1000 * 30 * 1; // every minute or 5?? // 1000 * 60 * 1 -// } - -// private void InternetCheckTimer_Tick(object sender, EventArgs e) { -// if (ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { -// IsConnectedToInternet = Helpers.IsConnectedToInternet(); -// } -// } - -// private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { -// // when mining keep system awake, prevent sleep -// Helpers.PreventSleep(); -// } - -// public void StopAllMiners() { -// IsCurrentlyIdle = true; -// if (_groupedDevicesMiners != null) { -// foreach (var kv in _groupedDevicesMiners) { -// kv.Value.End(); -// } -// } -// if (_mainFormRatesComunication != null) { -// _mainFormRatesComunication.ClearRatesALL(); -// } - -// // restroe/enable sleep -// _preventSleepTimer.Stop(); -// _internetCheckTimer.Stop(); -// Helpers.AllowMonitorPowerdownAndSleep(); - -// // delete generated bin files -// // check for bins files -// var dirInfo = new DirectoryInfo(MinerPaths.nheqminer.Replace("nheqminer.exe", "")); -// var DONT_DELETE = "equiw200k9.bin"; -// var deleteContains = "equiw200k9"; -// var alwaysDeleteContains2 = "silentarmy_gpu"; -// if (dirInfo != null && dirInfo.Exists) { -// foreach (FileInfo file in dirInfo.GetFiles()) { -// if (file.Name != DONT_DELETE && file.Name.Contains(deleteContains)) { -// file.Delete(); -// } -// if (file.Name.Contains(alwaysDeleteContains2)) { -// file.Delete(); -// } -// } -// } -// } - -// public void StopAllMinersNonProfitable() { -// IsCurrentlyIdle = true; -// if (_groupedDevicesMiners != null) { -// foreach (var kv in _groupedDevicesMiners) { -// kv.Value.End(); -// } -// } -// if (_mainFormRatesComunication != null) { -// _mainFormRatesComunication.ClearRates(-1); -// } -// } - -// public string GetActiveMinersGroup() { -// if (IsCurrentlyIdle) { -// return "IDLE"; -// } - -// string ActiveMinersGroup = ""; - -// //get unique miner groups like CPU, NVIDIA, AMD,... -// HashSet UniqueMinerGroups = new HashSet(); -// foreach (var curDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { -// if (curDevice.Enabled) { -// UniqueMinerGroups.Add(curDevice.DeviceGroupString); -// } -// } -// if (UniqueMinerGroups.Count > 0 && IsProfitable) { -// ActiveMinersGroup = string.Join("/", UniqueMinerGroups); -// } - -// return ActiveMinersGroup; -// } - -// public static bool EquihashCPU_USE_eqm() { -// var mostOptimized = CPUUtils.GetMostOptimized(); -// return mostOptimized == CPUExtensionType.AVX || mostOptimized == CPUExtensionType.AVX2 -// || mostOptimized == CPUExtensionType.AVX_AES || mostOptimized == CPUExtensionType.AVX2_AES; -// } - -// // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() -// public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType algorithmType) { -// if (AlgorithmType.Equihash == algorithmType) { -// if (DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType -// || (EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { -// return new eqm(); -// } else { -// return new nheqminer(); -// } -// } else if (AlgorithmType.DaggerHashimoto == algorithmType) { -// if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { -// return new MinerEtherumOCL(); -// } else { -// return new MinerEtherumCUDA(); -// } -// } else { -// switch (deviceGroupType) { -// case DeviceGroupType.AMD_OpenCL: -// return new sgminer(); -// case DeviceGroupType.NVIDIA_2_1: -// return new ccminer_sm21(); -// case DeviceGroupType.NVIDIA_3_x: -// return new ccminer_sm3x(); -// case DeviceGroupType.NVIDIA_5_x: -// return new ccminer_sm5x(); -// case DeviceGroupType.NVIDIA_6_x: -// return new ccminer_sm6x(); -// case DeviceGroupType.CPU: -// return new cpuminer(); -// } -// } - -// return null; -// } - -// private string CalcGroupedDevicesKey(GroupedDevices group) { -// return string.Join(", ", group); -// } - -// public double GetTotalRate() { -// double TotalRate = 0; - -// if (_currentAllGroupedDevices != null) { -// foreach (var group in _currentAllGroupedDevices) { -// var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; -// TotalRate += groupMiners.CurrentWorkingMiner.CurrentRate; -// } -// } - -// return TotalRate; -// } - -// public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication, -// string miningLocation, string worker, string btcAdress) { -// _mainFormRatesComunication = mainFormRatesComunication; -// _miningLocation = miningLocation; - -// if (worker.Length > 0) -// _workerBtcStringWorker = btcAdress + "." + worker; -// else -// _workerBtcStringWorker = btcAdress; - -// _perDeviceSpeedDictionary = GetEnabledDeviceTypeSpeeds(); -// //_groupedDevicesMiners = new Dictionary(); -// _groupedDevicesMiners = new Dictionary(); -// _enabledDevices = new List(); -// _currentAllGroupedDevices = new List>(); - -// // assume profitable -// IsProfitable = true; -// // assume we have internet -// IsConnectedToInternet = true; - - -// // this checks if there are enabled devices and enabled algorithms -// bool isMiningEnabled = false; - -// foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { -// if (cdev.Enabled) { -// _enabledDevices.Add(cdev); -// // check if any algorithm enabled -// if(!isMiningEnabled) { -// foreach (var algorithm in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { -// if (!algorithm.Value.Skip) { -// isMiningEnabled = true; -// break; -// } -// } -// } -// } -// } - -// if (isMiningEnabled) { -// _preventSleepTimer.Start(); -// _internetCheckTimer.Start(); -// } - -// IsCurrentlyIdle = !isMiningEnabled; - -// return isMiningEnabled; -// } - -// /// -// /// GetEnabledDeviceTypeBenchmarks calculates currently enabled ComputeDevice benchmark speeds. -// /// If there are more cards of the same model it multiplies the speeds by it's count -// /// -// /// -// PerDeviceSpeedDictionary GetEnabledDeviceTypeSpeeds() { -// PerDeviceSpeedDictionary perDeviceTypeBenchmarks = new PerDeviceSpeedDictionary(); - -// // init algorithms count 0 -// foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { -// if (curCDev.Enabled) { -// Dictionary cumulativeSpeeds = new Dictionary(); -// var deviceConfig = curCDev.DeviceBenchmarkConfig; -// foreach (var kvp in deviceConfig.AlgorithmSettings) { -// var key = kvp.Key; -// cumulativeSpeeds[key] = 0; -// } -// perDeviceTypeBenchmarks[curCDev.UUID] = cumulativeSpeeds; -// } -// } -// // set enabled algorithm count per device counts -// foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { -// if (curCDev.Enabled) { -// Dictionary cumulativeSpeeds = perDeviceTypeBenchmarks[curCDev.UUID]; -// var deviceConfig = curCDev.DeviceBenchmarkConfig; -// foreach (var kvp in deviceConfig.AlgorithmSettings) { -// var key = kvp.Key; -// var algorithm = kvp.Value; -// // check dagger RAM SIZE -// if (algorithm.Skip -// || (algorithm.NiceHashID == AlgorithmType.DaggerHashimoto && !curCDev.IsEtherumCapale)) { -// // for now set to negative value as not profitable -// cumulativeSpeeds[key]--; -// } else { -// cumulativeSpeeds[key]++; -// } -// } -// } -// } -// // calculate benchmarks -// foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { -// if (curCDev.Enabled) { -// Dictionary cumulativeSpeeds = perDeviceTypeBenchmarks[curCDev.UUID]; -// var deviceConfig = curCDev.DeviceBenchmarkConfig; -// foreach (var kvp in deviceConfig.AlgorithmSettings) { -// var key = kvp.Key; -// var algorithm = kvp.Value; -// // instead of cumulative speeds get just if enabled or not count x > 0 => enabled; x < 0 => disabled -// if (cumulativeSpeeds[key] > 0) { -// cumulativeSpeeds[key] = algorithm.BenchmarkSpeed; -// } else { -// cumulativeSpeeds[key] = -1 * algorithm.BenchmarkSpeed; -// } -// } -// } -// } - -// return perDeviceTypeBenchmarks; -// } - - -// PerDeviceProifitDictionary GetEnabledDeviceProifitDictionary(PerDeviceSpeedDictionary speedDict, Dictionary NiceHashData) { -// PerDeviceProifitDictionary profitDict = new PerDeviceProifitDictionary(); - -// // log stuff -// int MAX_NAME_LEN = "daggerhashimoto".Length; -// int MAX_SPEED_LEN = 15; -// StringBuilder stringBuilderFull = new StringBuilder(); -// stringBuilderFull.AppendLine("Current device profits:"); - -// foreach (var nameBenchKvp in speedDict) { -// var deviceUUID = nameBenchKvp.Key; -// var curDevProfits = new Dictionary(); -// StringBuilder stringBuilderDevice = new StringBuilder(); -// stringBuilderDevice.AppendLine(String.Format("\tProfits for {0} ({1}):", deviceUUID, ComputeDeviceManager.Avaliable.GetNameForUUID(deviceUUID))); -// AlgorithmType mostProfitKey = AlgorithmType.NONE; -// double mostProfitAlgoVal = -1; -// foreach (var algoSpeedKvp in nameBenchKvp.Value) { -// // Log stuff and calculation -// string name = AlgorithmNiceHashNames.GetName(algoSpeedKvp.Key); -// int namePreatyCount = MAX_NAME_LEN - name.Length; -// if (namePreatyCount <= 0) { -// namePreatyCount = 1; -// } -// string namePreaty = name + new String(' ', namePreatyCount); -// bool isEnabled = algoSpeedKvp.Value > 0; -// double nhmSMADataVal = NiceHashData[algoSpeedKvp.Key].paying; -// // TODO what is the constant at the end? -// double algoProfit = algoSpeedKvp.Value * nhmSMADataVal * 0.000000001; - -// // calculate -// if (isEnabled) { -// curDevProfits.Add(algoSpeedKvp.Key, algoProfit); -// if (mostProfitAlgoVal < algoProfit) { -// mostProfitKey = algoSpeedKvp.Key; -// mostProfitAlgoVal = algoProfit; -// } -// } else { -// // if disabled make unprofitable -// curDevProfits.Add(algoSpeedKvp.Key, -1000000); -// algoProfit *= -1; // make bigger then 0 for logging reasons -// } -// // log stuff -// string speedStr = algoSpeedKvp.Value.ToString("F3"); -// int speedStrCount = MAX_SPEED_LEN - speedStr.Length; -// if (speedStrCount <= 0) { -// speedStrCount = 1; -// } -// string speedPreaty = new String(' ', speedStrCount) + speedStr; -// stringBuilderDevice.AppendLine(String.Format("\t\t{0}\t:\tPROFIT = {1} ({2}, SPEED = {3}, NHSMA = {4})", -// namePreaty, // Name -// algoProfit.ToString(DOUBLE_FORMAT), // Profit -// isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED -// speedPreaty, // Speed -// nhmSMADataVal.ToString(DOUBLE_FORMAT) // NiceHashData -// )); -// } -// // add profits -// profitDict.Add(deviceUUID, curDevProfits); -// // log stuff -// stringBuilderDevice.AppendLine(String.Format("\t\tMOST PROFITABLE (ENABLED) ALGO: {0}, PROFIT: {1}", -// AlgorithmNiceHashNames.GetName(mostProfitKey), -// mostProfitAlgoVal.ToString(DOUBLE_FORMAT))); -// stringBuilderFull.AppendLine(stringBuilderDevice.ToString()); -// } - -// Helpers.ConsolePrint(TAG, stringBuilderFull.ToString()); -// return profitDict; -// } - -// /// -// /// SwichMostProfitable should check the best combination for most profit. -// /// Calculate profit for each supported algorithm per device group. -// /// Build from ground up compatible devices and algorithms. -// /// See #region Groupping logic -// /// Device groups are CPU, AMD_OpenCL and NVIDIA CUDA SM.x.x. -// /// NVIDIA SMx.x should be paired separately except for daggerhashimoto. -// /// -// /// -// public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData) { -// var devProfits = GetEnabledDeviceProifitDictionary(_perDeviceSpeedDictionary, NiceHashData); - -//#if (SWITCH_TESTING) -// SwitchTesting.Instance.SetNext(ref devProfits, _enabledDevices); -//#endif -// double CurrentProfit = 0.0d; -// // calculate most profitable algorithm per enabled device -// foreach (var cdev in _enabledDevices) { -// var curDevProfits = devProfits[cdev.UUID]; -// double maxProfit = double.MinValue; -// AlgorithmType maxAlgorithmTypeKey = AlgorithmType.NONE; -// var algorithmSettings = cdev.DeviceBenchmarkConfig.AlgorithmSettings; - -// foreach (var kvpTypeProfit in curDevProfits) { -// if (algorithmSettings.ContainsKey(kvpTypeProfit.Key) -// && !algorithmSettings[kvpTypeProfit.Key].Skip -// && kvpTypeProfit.Value > 0.0d -// && maxProfit < kvpTypeProfit.Value) { -// // extra check if current device can't handle dagger -// if (AlgorithmType.DaggerHashimoto == kvpTypeProfit.Key && !cdev.IsEtherumCapale) { -// continue; -// } -// maxProfit = kvpTypeProfit.Value; -// maxAlgorithmTypeKey = kvpTypeProfit.Key; -// } -// } -// if(maxAlgorithmTypeKey == AlgorithmType.NONE) { -// cdev.MostProfitableAlgorithm = null; -// } else { -// cdev.MostProfitableAlgorithm -// = algorithmSettings[maxAlgorithmTypeKey]; -// // add most profitable to cumulative profit -// CurrentProfit += maxProfit; -// } -// } - -// // now if profitable check -// // TODO FOR NOW USD ONLY -// var currentProfitUSD = (CurrentProfit * Globals.BitcoinRate); -// Helpers.ConsolePrint(TAG, "Current Global profit: " + currentProfitUSD.ToString("F8") + " USD/Day"); -// if (!IsConnectedToInternet || (ConfigManager.Instance.GeneralConfig.MinimumProfit > 0 -// && currentProfitUSD < ConfigManager.Instance.GeneralConfig.MinimumProfit)) { -// IsProfitable = false; -// IsCurrentlyIdle = true; -// if (!IsConnectedToInternet) { -// // change msg -// Helpers.ConsolePrint(TAG, "NO INTERNET!!! Stopping mining."); -// _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NO_INTERNET_CONNECTION")); -// } else { -// _mainFormRatesComunication.ShowNotProfitable(International.GetText("Form_Main_MINING_NOT_PROFITABLE")); -// } -// // return don't group -// StopAllMinersNonProfitable(); -// Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); -// return; -// } else { -// IsProfitable = true; -// IsCurrentlyIdle = false; -// _mainFormRatesComunication.HideNotProfitable(); -// string profitabilityInfo = ConfigManager.Instance.GeneralConfig.MinimumProfit == 0 ? "mine always regardless of profit" : ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"; -// Helpers.ConsolePrint(TAG, "Current Global profit: IS PROFITABLE MinProfit " + profitabilityInfo); -// } - -// // group devices with same supported algorithms -// _previousAllGroupedDevices = _currentAllGroupedDevices; -// _currentAllGroupedDevices = new List>(); -// Dictionary newGroupAndAlgorithm = new Dictionary(); -// for (int first = 0; first < _enabledDevices.Count; ++first) { -// var firstDev = _enabledDevices[first]; -// // skip if no algorithm is profitable -// if (firstDev.MostProfitableAlgorithm == null) { -// Helpers.ConsolePrint("SwichMostProfitableGroupUpMethod", String.Format("Device {0}, MostProfitableAlgorithm == null", firstDev.Name)); -// continue; -// } -// // check if is in group -// bool isInGroup = false; -// foreach (var groupedDevices in _currentAllGroupedDevices) { -// if (groupedDevices.Contains(firstDev.UUID)) { -// isInGroup = true; -// break; -// } -// } -// if (isInGroup) continue; - -// var newGroup = new GroupedDevices(); -// newGroup.Add(firstDev.UUID); -// for (int second = first + 1; second < _enabledDevices.Count; ++second) { -// var secondDev = _enabledDevices[second]; -// // first check if second device has profitable algorithm -// if (secondDev.MostProfitableAlgorithm != null) { -// // check if we should group -// if (GroupingLogic.IsEquihashGroupLogic(firstDev, secondDev) -// || GroupingLogic.IsDaggerAndSameComputePlatform(firstDev, secondDev) -// || GroupingLogic.IsGroupBinaryAndAlgorithmSame(firstDev, secondDev)) { -// newGroup.Add(secondDev.UUID); -// } -// } -// } - -// _currentAllGroupedDevices.Add(newGroup); -// newGroupAndAlgorithm.Add(newGroup, firstDev.MostProfitableAlgorithm); -// } - -// // stop groupes that aren't in current group devices -// foreach (var curPrevGroup in _previousAllGroupedDevices) { -// var curPrevGroupKey = CalcGroupedDevicesKey(curPrevGroup); -// bool contains = false; -// foreach (var curCheckGroup in _currentAllGroupedDevices) { -// var curCheckGroupKey = CalcGroupedDevicesKey(curCheckGroup); -// if (curPrevGroupKey == curCheckGroupKey) { -// contains = true; -// break; -// } -// } -// if (!contains) { -// _groupedDevicesMiners[curPrevGroupKey].Stop(); -// } -// } -// // switch to newGroupAndAlgorithm most profitable algorithm -// foreach (var kvpGroupAlgorithm in newGroupAndAlgorithm) { -// var group = kvpGroupAlgorithm.Key; -// var algorithm = kvpGroupAlgorithm.Value; - -// GroupMiners currentGroupMiners; -// // try find if it doesn't exist create new -// string groupStringKey = CalcGroupedDevicesKey(group); -// if (!_groupedDevicesMiners.TryGetValue(groupStringKey, out currentGroupMiners)) { -// currentGroupMiners = new GroupMiners(group); -// _groupedDevicesMiners.Add(groupStringKey, currentGroupMiners); -// } -// currentGroupMiners.StartAlgorihtm(algorithm, _miningLocation, _workerBtcStringWorker); -// } - -// // stats quick fix code -// if (_currentAllGroupedDevices.Count != _previousAllGroupedDevices.Count) { -// MinerStatsCheck(NiceHashData); -// } -// } - -// public void MinerStatsCheck(Dictionary NiceHashData) { -// _mainFormRatesComunication.ClearRates(_currentAllGroupedDevices.Count); -// foreach (var group in _currentAllGroupedDevices) { -// var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; -// Miner m = groupMiners.CurrentWorkingMiner; - -// // skip if not running -// if (!m.IsRunning) continue; - -// APIData AD = m.GetSummary(); -// if (AD == null) { -// Helpers.ConsolePrint(m.MinerTAG(), "GetSummary returned null.."); -// } -// // set rates -// if (NiceHashData != null && AD != null) { -// m.CurrentRate = NiceHashData[AD.AlgorithmID].paying * AD.Speed * 0.000000001; -// } else { -// m.CurrentRate = 0; -// // set empty -// AD = new APIData() { -// AlgorithmID = m.CurrentAlgorithmType, -// AlgorithmName = AlgorithmNiceHashNames.GetName(m.CurrentAlgorithmType), -// Speed = 0.0d -// }; -// } - -// // Update GUI -// _mainFormRatesComunication.AddRateInfo(m.MinerTAG(), groupMiners.DevicesInfoString, AD, m.CurrentRate, m.IsAPIReadException); -// } -// } -// } -} diff --git a/NiceHashMiner/Miners/ManagerPrivate/SwitchTesting.cs b/NiceHashMiner/Miners/ManagerPrivate/SwitchTesting.cs deleted file mode 100644 index 6b35513..0000000 --- a/NiceHashMiner/Miners/ManagerPrivate/SwitchTesting.cs +++ /dev/null @@ -1,65 +0,0 @@ -using NiceHashMiner.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - - -#if (SWITCH_TESTING) -namespace NiceHashMiner.Miners { - using NiceHashMiner.Devices; - using PerDeviceProifitDictionary = Dictionary>; - public partial class MinersManager { - // globals testing variables - static int seconds = 60; - public static int SMAMinerCheckInterval = seconds * 1000; // 30s - public static bool ForcePerCardMiners = false; - - - private class SwitchTesting : BaseLazySingleton { - - readonly string TAG; - // dev names - Dictionary _curStepCheck; - Dictionary> _allAvaliableAlgoKeys; - const double MOST_PROFIT_REPLACE_VAL = 500000.0d; - - protected SwitchTesting() { - TAG = this.GetType().Name; - - _curStepCheck = new Dictionary(); - _allAvaliableAlgoKeys = new Dictionary>(); - - foreach (var cDev in ComputeDevice.AllAvaliableDevices) { - _curStepCheck[cDev.UUID] = 0; - //_allAvaliableAlgoKeys[cDev.Name] = new List(cDev.DeviceBenchmarkConfig.AlgorithmSettings.Keys); - _allAvaliableAlgoKeys[cDev.UUID] = new List(new[] { AlgorithmType.DaggerHashimoto, AlgorithmType.Lyra2RE }); - } - } - - public void SetNext(ref PerDeviceProifitDictionary devProfits, List enabledDevices) { - - foreach (var cDev in enabledDevices) { - var devUUID = cDev.UUID; - var curStepCheckIndex = _curStepCheck[devUUID]; - var _mostProfitKey = _allAvaliableAlgoKeys[devUUID][curStepCheckIndex]; - var mostProfitKeyName = AlgorithmNiceHashNames.GetName(_mostProfitKey); - Helpers.ConsolePrint(TAG, String.Format("Setting most MostProfitKey to {0}", mostProfitKeyName)); - - // set new most profit - Helpers.ConsolePrint(TAG, String.Format("Setting device {0} to {1}", devUUID, mostProfitKeyName)); - devProfits[devUUID][_mostProfitKey] = MOST_PROFIT_REPLACE_VAL; - - ++curStepCheckIndex; - if (curStepCheckIndex >= _allAvaliableAlgoKeys[devUUID].Count) curStepCheckIndex = 0; - _curStepCheck[devUUID] = curStepCheckIndex; - } - - - } - - } - } -} -#endif \ No newline at end of file diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 6cb207d..91e84f3 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -13,6 +13,7 @@ using NiceHashMiner.Enums; using NiceHashMiner.Miners; using NiceHashMiner.Interfaces; +using NiceHashMiner.Miners.Grouping; using Timer = System.Timers.Timer; using System.Timers; @@ -24,6 +25,11 @@ public class APIData public AlgorithmType AlgorithmID; public string AlgorithmName; public double Speed; + public APIData(AlgorithmType algorithmID) { + this.AlgorithmID = algorithmID; + this.AlgorithmName = AlgorithmNiceHashNames.GetName(algorithmID); + this.Speed = 0.0; + } } // @@ -47,25 +53,11 @@ public abstract class Miner { public bool IsAPIReadException { get; protected set; } // inhouse miners that are locked on NH (our eqm) public bool IsNHLocked { get; protected set; } - protected List CDevs; - public DeviceType DeviceType { get; private set; } - public DeviceGroupType DeviceGroupType { get; private set; } - // mining algorithm stuff - public AlgorithmType CurrentAlgorithmType { get; protected set; } - private Algorithm _currentMiningAlgorithm; - protected Algorithm CurrentMiningAlgorithm { - get { return _currentMiningAlgorithm; } - set { - if (value == null) { - CurrentAlgorithmType = AlgorithmType.NONE; - } else { - CurrentAlgorithmType = value.NiceHashID; - } - _currentMiningAlgorithm = value; - } - } - public double CurrentRate; + protected bool IsInit { get; private set; } + protected MiningSetup MiningSetup { get; set; } + // sgminer workaround + protected bool IsSgminer { get; set; } public bool IsRunning { get; protected set; } protected string Path; protected string LastCommandLine { get; set; } @@ -84,20 +76,8 @@ protected Algorithm CurrentMiningAlgorithm { public bool BenchmarkSignalTimedout = false; protected bool BenchmarkSignalFinnished; IBenchmarkComunicator BenchmarkComunicator; - private bool OnBenchmarkCompleteCalled = false; - protected AlgorithmType CurrentBenchmarkAlgorithmType { get; private set; } - private Algorithm _benchmarkAlgorithm; - protected Algorithm BenchmarkAlgorithm { - get { return _benchmarkAlgorithm; } - set { - if (value == null) { - CurrentBenchmarkAlgorithmType = AlgorithmType.NONE; - } else { - CurrentBenchmarkAlgorithmType = value.NiceHashID; - } - _benchmarkAlgorithm = value; - } - } + private bool OnBenchmarkCompleteCalled = false; + protected Algorithm BenchmarkAlgorithm { get; set; } public BenchmarkProcessStatus BenchmarkProcessStatus { get; protected set; } protected string BenchmarkProcessPath { get; private set; } protected Process BenchmarkHandle { get; private set; } @@ -106,7 +86,6 @@ protected Algorithm BenchmarkAlgorithm { protected bool _isEthMinerExit = false; - protected AlgorithmType[] _supportedMinerAlgorithms; // TODO maybe set for individual miner cooldown/retries logic variables // this replaces MinerAPIGraceSeconds(AMD) @@ -121,32 +100,30 @@ protected Algorithm BenchmarkAlgorithm { private int _currentCooldownTimeInSeconds = _MIN_CooldownTimeInMilliseconds; private int _currentCooldownTimeInSecondsLeft = _MIN_CooldownTimeInMilliseconds; private const int IS_COOLDOWN_CHECK_TIMER_ALIVE_CAP = 15; + private bool NeedsRestart = false; private bool isEnded = false; - public Miner(DeviceType deviceType, DeviceGroupType deviceGroupType, string minerDeviceName) + public Miner(string minerDeviceName) { + MiningSetup = new MiningSetup(null); + IsInit = false; MINER_ID = MINER_ID_COUNT++; - CDevs = new List(); - DeviceType = deviceType; - DeviceGroupType = deviceGroupType; + MinerDeviceName = minerDeviceName; //WorkingDirectory = @"bin\dlls"; WorkingDirectory = ""; - CurrentAlgorithmType = AlgorithmType.NONE; - CurrentRate = 0; IsRunning = false; PreviousTotalMH = 0.0; LastCommandLine = ""; - InitSupportedMinerAlgorithms(); - APIPort = MinersApiPortsManager.Instance.GetAvaliablePort(); IsAPIReadException = false; IsNHLocked = false; + IsSgminer = false; _MAX_CooldownTimeInMilliseconds = GET_MAX_CooldownTimeInMilliseconds(); // Helpers.ConsolePrint(MinerTAG(), "NEW MINER CREATED"); @@ -158,12 +135,16 @@ public Miner(DeviceType deviceType, DeviceGroupType deviceGroupType, string mine Helpers.ConsolePrint(MinerTAG(), "MINER DESTROYED"); } - virtual public void SetCDevs(string[] deviceUUIDs) { - foreach (var uuid in deviceUUIDs) { - CDevs.Add(ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid)); - } - // sort devices by id - CDevs.Sort((a, b) => a.ID - b.ID); + + virtual public void InitMiningSetup(MiningSetup miningSetup) { + MiningSetup = miningSetup; + IsInit = MiningSetup.IsInit; + } + + // TODO remove or don't recheck + public void InitBenchmarkSetup(MiningPair benchmarkPair) { + InitMiningSetup(new MiningSetup(new List() { benchmarkPair })); + BenchmarkAlgorithm = benchmarkPair.Algorithm; } // TAG for identifying miner @@ -171,12 +152,12 @@ public string MinerTAG() { if (_minetTag == null) { const string MASK = "{0}-MINER_ID({1})-DEVICE_IDs({2})"; // no devices set - if (CDevs.Count == 0) { + if (!IsInit) { return String.Format(MASK, MinerDeviceName, MINER_ID, "NOT_SET"); } // contains ids List ids = new List(); - foreach (var cdevs in CDevs) ids.Add(cdevs.ID); + foreach (var cdevs in MiningSetup.MiningPairs) ids.Add(cdevs.Device.ID); _minetTag = String.Format(MASK, MinerDeviceName, MINER_ID, string.Join(",", ids)); } return _minetTag; @@ -193,28 +174,6 @@ public string ProcessTag() { return ProcessTag(_currentPidData); } - public bool IsSupportedMinerAlgorithms(AlgorithmType algorithmType) { - foreach (var supportedType in _supportedMinerAlgorithms) { - if (supportedType == algorithmType) return true; - } - return false; - } - - protected abstract void InitSupportedMinerAlgorithms(); - - // TODO remove somehow - /// - /// GetOptimizedMinerPath returns optimized miner path based on algorithm type and device codename. - /// Device codename is a quickfix for sgminer, other miners don't use it - /// - /// determines what miner path to return - /// sgminer extra - /// sgminer extra - /// - protected string GetOptimizedMinerPath(AlgorithmType algorithmType, string devCodename = "", bool isOptimized = true) { - return MinerPaths.GetOptimizedMinerPath(algorithmType, DeviceType, DeviceGroupType, devCodename, isOptimized); - } - public void KillAllUsedMinerProcesses() { List toRemovePidData = new List(); Helpers.ConsolePrint(MinerTAG(), "Trying to kill all miner processes for this instance:"); @@ -236,7 +195,7 @@ public void KillAllUsedMinerProcesses() { _allPidData.RemoveAll( x => toRemovePidData.Contains(x)); } - abstract public void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker); + abstract public void Start(string url, string btcAdress, string worker); protected string GetUsername(string btcAdress, string worker) { if (worker.Length > 0) { @@ -246,25 +205,17 @@ protected string GetUsername(string btcAdress, string worker) { } abstract protected void _Stop(MinerStopType willswitch); - virtual public void Stop(MinerStopType willswitch = MinerStopType.SWITCH, bool needsRestart = false) + virtual public void Stop(MinerStopType willswitch = MinerStopType.SWITCH) { if (_cooldownCheckTimer != null) _cooldownCheckTimer.Stop(); - if (!needsRestart) { - _Stop(willswitch); - PreviousTotalMH = 0.0; - IsRunning = false; - } else { - //_currentMinerReadStatus = MinerAPIReadStatus.RESTART; - Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Manually closed, will restart"); - Restart(); - } + _Stop(willswitch); + PreviousTotalMH = 0.0; + IsRunning = false; } public void End() { isEnded = true; Stop(MinerStopType.FORCE_END); - CurrentAlgorithmType = AlgorithmType.NONE; - CurrentRate = 0; } protected void ChangeToNextAvaliablePort() { @@ -295,7 +246,7 @@ protected void Stop_cpu_ccminer_sgminer_nheqminer(MinerStopType willswitch) { ProcessHandle = null; // sgminer needs to be removed and kill by PID - if (DeviceType == DeviceType.AMD) KillAllUsedMinerProcesses(); + if (IsSgminer) KillAllUsedMinerProcesses(); } } @@ -303,8 +254,8 @@ virtual protected string GetDevicesCommandString() { string deviceStringCommand = " "; List ids = new List(); - foreach (var cdev in CDevs) { - ids.Add(cdev.ID.ToString()); + foreach (var mPair in MiningSetup.MiningPairs) { + ids.Add(mPair.Device.ID.ToString()); } deviceStringCommand += string.Join(",", ids); @@ -314,10 +265,10 @@ virtual protected string GetDevicesCommandString() { #region BENCHMARK DE-COUPLED Decoupled benchmarking routines public int BenchmarkTimeoutInSeconds(int timeInSeconds) { - if (CurrentBenchmarkAlgorithmType == AlgorithmType.DaggerHashimoto) { + if (BenchmarkAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto) { return 5 * 60 + 120; // 5 minutes plus two minutes } - if (CurrentBenchmarkAlgorithmType == AlgorithmType.CryptoNight) { + if (BenchmarkAlgorithm.NiceHashID == AlgorithmType.CryptoNight) { return 5 * 60 + 120; // 5 minutes plus two minutes } return timeInSeconds + 120; // wait time plus two minutes @@ -328,12 +279,8 @@ public int BenchmarkTimeoutInSeconds(int timeInSeconds) { // The benchmark config and algorithm must guarantee that they are compatible with miner // we guarantee algorithm is supported // we will not have empty benchmark configs, all benchmark configs will have device list - virtual public void BenchmarkStart(ComputeDevice benchmarkDevice, Algorithm algorithm, int time, IBenchmarkComunicator benchmarkComunicator) { - // for extra launch parameters parsing purposes - benchmarkDevice.MostProfitableAlgorithm = algorithm; - + virtual public void BenchmarkStart(int time, IBenchmarkComunicator benchmarkComunicator) { BenchmarkComunicator = benchmarkComunicator; - BenchmarkAlgorithm = algorithm; BenchmarkTimeInSeconds = time; BenchmarkSignalFinnished = true; // check and kill @@ -341,7 +288,7 @@ virtual public void BenchmarkStart(ComputeDevice benchmarkDevice, Algorithm algo OnBenchmarkCompleteCalled = false; BenchmarkTimeOutStopWatch = null; - string CommandLine = BenchmarkCreateCommandLine(algorithm, time); + string CommandLine = BenchmarkCreateCommandLine(BenchmarkAlgorithm, time); Thread BenchmarkThread = new Thread(BenchmarkThreadRoutine); BenchmarkThread.Start(CommandLine); @@ -352,8 +299,8 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { Helpers.ConsolePrint(MinerTAG(), "Starting benchmark: " + CommandLine); Process BenchmarkHandle = new Process(); - - BenchmarkHandle.StartInfo.FileName = GetOptimizedMinerPath(BenchmarkAlgorithm.NiceHashID); + + BenchmarkHandle.StartInfo.FileName = MiningSetup.MinerPath; // TODO sgminer quickfix @@ -363,7 +310,7 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { } else { BenchmarkProcessPath = BenchmarkHandle.StartInfo.FileName; Helpers.ConsolePrint(MinerTAG(), "Using miner: " + BenchmarkHandle.StartInfo.FileName); - if (CurrentBenchmarkAlgorithmType == AlgorithmType.Equihash) { + if (BenchmarkAlgorithm.NiceHashID == AlgorithmType.Equihash) { BenchmarkHandle.StartInfo.WorkingDirectory = WorkingDirectory; } } @@ -600,15 +547,16 @@ protected void StartCoolDownTimerChecker() { virtual protected void Miner_Exited() { - //bool willswitch = _isEthMinerExit ? false : true; - //Stop(willswitch, true); + // TODO make miner restart in 5 seconds + //Stop(MinerStopType.END, true); + var RestartInMS = ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS > 5000 ? + ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS : 5000; + Helpers.ConsolePrint(MinerTAG(), ProcessTag() + String.Format(" Miner_Exited Will restart in {0} ms", RestartInMS)); + _currentMinerReadStatus = MinerAPIReadStatus.RESTART; + NeedsRestart = true; + _currentCooldownTimeInSecondsLeft = RestartInMS; - Stop(MinerStopType.END, true); } - //virtual protected void ethMiner_Exited() - //{ - // Stop(false); - //} protected abstract bool UpdateBindPortCommand(int oldPort, int newPort); @@ -633,13 +581,6 @@ private void Restart() { } } - protected void FillAlgorithm(string aname, ref APIData AD) { - if (CurrentMiningAlgorithm.MinerName.Equals(aname)) { - AD.AlgorithmID = CurrentMiningAlgorithm.NiceHashID; - AD.AlgorithmName = CurrentMiningAlgorithm.NiceHashName; - } - } - protected string GetAPIData(int port, string cmd) { string ResponseFromServer = null; @@ -651,7 +592,7 @@ protected string GetAPIData(int port, string cmd) "User-Agent: NiceHashMiner/" + Application.ProductVersion + "\r\n" + "\r\n"; - if (DeviceType == DeviceType.AMD || CurrentAlgorithmType == AlgorithmType.Equihash) + if (IsSgminer) DataToSend = cmd; byte[] BytesToSend = ASCIIEncoding.ASCII.GetBytes(DataToSend); @@ -682,6 +623,7 @@ protected string GetAPIData(int port, string cmd) } catch (Exception ex) { + Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " GetAPIData reason: " + ex.Message); return null; } @@ -692,8 +634,9 @@ protected string GetAPIData(int port, string cmd) protected APIData GetSummaryCPU_CCMINER() { string resp; + // TODO aname string aname = null; - APIData ad = new APIData(); + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); resp = GetAPIData(APIPort, "summary"); if (resp == null) { @@ -719,7 +662,6 @@ protected APIData GetSummaryCPU_CCMINER() { } _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; - FillAlgorithm(aname, ref ad); // check if speed zero if (ad.Speed == 0) _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; @@ -756,7 +698,10 @@ private void MinerCoolingCheck_Tick(object sender, ElapsedEventArgs e) { _currentCooldownTimeInSecondsLeft -= (int)_cooldownCheckTimer.Interval; // if times up if (_currentCooldownTimeInSecondsLeft <= 0) { - if (_currentMinerReadStatus == MinerAPIReadStatus.GOT_READ) { + if (NeedsRestart) { + NeedsRestart = false; + Restart(); + } else if (_currentMinerReadStatus == MinerAPIReadStatus.GOT_READ) { CoolDown(); } else if (_currentMinerReadStatus == MinerAPIReadStatus.READ_SPEED_ZERO) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " READ SPEED ZERO, will cool up"); diff --git a/NiceHashMiner/Miners/MinersManager_NEW.cs b/NiceHashMiner/Miners/MinersManager.cs similarity index 69% rename from NiceHashMiner/Miners/MinersManager_NEW.cs rename to NiceHashMiner/Miners/MinersManager.cs index 80f2b52..e8a0d05 100644 --- a/NiceHashMiner/Miners/MinersManager_NEW.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -16,7 +16,8 @@ namespace NiceHashMiner.Miners { using PerDeviceSpeedDictionary = Dictionary>; using GroupedDevices = SortedSet; - public class MinersManager_NEW : BaseLazySingleton { + using NiceHashMiner.Miners.Grouping; + public class MinersManager : BaseLazySingleton { private MiningSession CurMiningSession; @@ -43,37 +44,33 @@ public static bool EquihashCPU_USE_eqm() { } // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() - public static Miner CreateMiner(DeviceGroupType deviceGroupType, AlgorithmType algorithmType) { - if (AlgorithmType.Equihash == algorithmType) { - if (DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType - || (EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { - return new eqm(); - } else { - return new nheqminer(); - } - } else if (AlgorithmType.DaggerHashimoto == algorithmType) { - if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { + public static Miner CreateMiner(ComputeDevice device, Algorithm algorithm) { + var minerPath = MinerPaths.GetOptimizedMinerPath(device, algorithm); + if (minerPath != MinerPaths.NONE) { + return CreateMiner(device.DeviceType, minerPath); + } + return null; + } + + public static Miner CreateMiner(DeviceType deviceType, string minerPath) { + if (minerPath.Contains("eqm") && DeviceType.AMD != deviceType) { + return new eqm(); + } else if (minerPath.Contains("nheqminer")) { + return new nheqminer(); + } else if (minerPath.Contains("ethminer") && DeviceType.CPU != deviceType) { + if (DeviceType.AMD == deviceType) { return new MinerEtherumOCL(); } else { return new MinerEtherumCUDA(); } - } else { - switch (deviceGroupType) { - case DeviceGroupType.AMD_OpenCL: - return new sgminer(); - case DeviceGroupType.NVIDIA_2_1: - return new ccminer_sm21(); - case DeviceGroupType.NVIDIA_3_x: - return new ccminer_sm3x(); - case DeviceGroupType.NVIDIA_5_x: - return new ccminer_sm5x(); - case DeviceGroupType.NVIDIA_6_x: - return new ccminer_sm6x(); - case DeviceGroupType.CPU: - return new cpuminer(); - } + } else if (minerPath.Contains("cpuminer") && DeviceType.CPU == deviceType) { + return new cpuminer(); + } else if (minerPath.Contains("sgminer") && DeviceType.AMD == deviceType) { + return new sgminer(); + } else if(minerPath.Contains("ccminer") && DeviceType.NVIDIA == deviceType) { + return new ccminer(); } - + return null; } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 94f149d..2cabc40 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using NiceHashMiner.Miners.Grouping; using Timer = System.Timers.Timer; using System.Timers; @@ -28,9 +29,9 @@ public class MiningSession { // session varibles changing // GroupDevices hash code doesn't work correctly use string instead //Dictionary _groupedDevicesMiners; - Dictionary _groupedDevicesMiners = new Dictionary(); - List> _previousAllGroupedDevices = new List(); - List> _currentAllGroupedDevices = new List(); + Dictionary _runningGroupMiners = new Dictionary(); + GroupMiner _ethminerNVIDIAPaused = null; + GroupMiner _ethminerAMDPaused = null; private bool IsProfitable = true; @@ -71,101 +72,9 @@ public MiningSession(List devices, _worker = worker; // initial settup - { - // used for logging - List> disabledDevicesStatuses = new List>(); - // logging and settup - List enabledDevices = new List(); - // get enabled devices - { - // check passed devices statuses - List> devicesStatuses = new List>(); - foreach (var device in devices) { - devicesStatuses.Add(getDeviceMiningStatus(device)); - } - // sort device statuses - foreach (var deviceStatus in devicesStatuses) { - if (deviceStatus.Item2 == DeviceMiningStatus.CanMine) { - enabledDevices.Add(deviceStatus.Item1); - } else { - disabledDevicesStatuses.Add(deviceStatus); - } - } - } - // print statuses - if (disabledDevicesStatuses.Count > 0) { - Helpers.ConsolePrint(TAG, "Disabled Devices:"); - foreach (var deviceStatus in disabledDevicesStatuses) { - ComputeDevice device = deviceStatus.Item1; - DeviceMiningStatus status = deviceStatus.Item2; - if (status == DeviceMiningStatus.DeviceNull) { - Helpers.ConsolePrint(TAG, "Critical Device is NULL"); - } else if (status == DeviceMiningStatus.Disabled) { - Helpers.ConsolePrint(TAG, String.Format("DISABLED ({0})", device.GetFullName())); - } else if (status == DeviceMiningStatus.NoEnabledAlgorithms) { - Helpers.ConsolePrint(TAG, String.Format("No Enabled Algorithms ({0})", device.GetFullName())); - } - } - } - if (enabledDevices.Count > 0) { - // print enabled - Helpers.ConsolePrint(TAG, "Enabled Devices for Mining session:"); - foreach (var device in enabledDevices) { - Helpers.ConsolePrint(TAG, String.Format("ENABLED ({0})", device.GetFullName())); - foreach (var algo in device.DeviceBenchmarkConfig.AlgorithmSettings.Values) { - var isEnabled = IsAlgoMiningCapable(algo); - Helpers.ConsolePrint(TAG, String.Format("\t\tALGORITHM {0} ({1})", - isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED - AlgorithmNiceHashNames.GetName(algo.NiceHashID))); - } - } - // settup mining devices - foreach (var device in enabledDevices) { - _miningDevices.Add(new MiningDevice(device)); - } - } - } + _miningDevices = GroupSetupUtils.GetMiningDevices(devices, true); if (_miningDevices.Count > 0) { - // calculate avarage speeds, to ensure mining stability - // device name, algo key, algos refs list - Dictionary>> avarager = new Dictionary>>(); - // init empty avarager - foreach (var device in _miningDevices) { - string devName = device.Device.Name; - avarager[devName] = new Dictionary>(); - foreach (var key in AlgorithmNiceHashNames.GetAllAvaliableTypes()) { - avarager[devName][key] = new List(); - } - } - // fill avarager - foreach (var device in _miningDevices) { - string devName = device.Device.Name; - foreach (var kvp in device.Algorithms) { - var key = kvp.Key; - MiningAlgorithm algo = kvp.Value; - avarager[devName][key].Add(algo); - } - } - // calculate avarages - foreach (var devDict in avarager.Values) { - foreach (List miningAlgosList in devDict.Values) { - // if list not empty calculate avarage - if (miningAlgosList.Count > 0) { - // calculate avarage - double sum = 0; - foreach (var algo in miningAlgosList) { - sum += algo.AvaragedSpeed; - } - double avarageSpeed = sum / miningAlgosList.Count; - // set avarage - foreach (var algo in miningAlgosList) { - algo.AvaragedSpeed = avarageSpeed; - } - } - } - } + GroupSetupUtils.AvarageSpeeds(_miningDevices); } // init timer stuff @@ -214,38 +123,19 @@ private void MiningStatusCheckTimer_Tick(object sender, ElapsedEventArgs e) { } #endregion - #region CanMine Checking - - static bool IsAlgoMiningCapable(Algorithm algo) { - return algo != null && !algo.Skip && algo.BenchmarkSpeed > 0; - } - - Tuple getDeviceMiningStatus(ComputeDevice device) { - DeviceMiningStatus status = DeviceMiningStatus.CanMine; - if (device == null) { // C# is null happy - status = DeviceMiningStatus.DeviceNull; - } else if(device.Enabled == false) { - status = DeviceMiningStatus.Disabled; - } else { - bool hasEnabledAlgo = false; - foreach(Algorithm algo in device.DeviceBenchmarkConfig.AlgorithmSettings.Values) { - hasEnabledAlgo |= IsAlgoMiningCapable(algo); - } - if (hasEnabledAlgo == false) { - status = DeviceMiningStatus.NoEnabledAlgorithms; - } - } - return new Tuple(device, status); - } - #endregion CanMine Checking - #region Start/Stop public void StopAllMiners() { - if (_groupedDevicesMiners != null) { - foreach (var kv in _groupedDevicesMiners) { - kv.Value.End(); + if (_runningGroupMiners != null) { + foreach (var groupMiner in _runningGroupMiners.Values) { + groupMiner.End(); } } + if (_ethminerNVIDIAPaused != null) { + _ethminerNVIDIAPaused.End(); + } + if (_ethminerAMDPaused != null) { + _ethminerAMDPaused.End(); + } if (_mainFormRatesComunication != null) { _mainFormRatesComunication.ClearRatesALL(); } @@ -275,11 +165,17 @@ public void StopAllMiners() { } public void StopAllMinersNonProfitable() { - if (_groupedDevicesMiners != null) { - foreach (var kv in _groupedDevicesMiners) { - kv.Value.End(); + if (_runningGroupMiners != null) { + foreach (var groupMiner in _runningGroupMiners.Values) { + groupMiner.End(); } } + if (_ethminerNVIDIAPaused != null) { + _ethminerNVIDIAPaused.End(); + } + if (_ethminerAMDPaused != null) { + _ethminerAMDPaused.End(); + } if (_mainFormRatesComunication != null) { _mainFormRatesComunication.ClearRates(-1); } @@ -299,10 +195,10 @@ public string GetActiveMinersGroup() { //get unique miner groups like CPU, NVIDIA, AMD,... HashSet UniqueMinerGroups = new HashSet(); - foreach (var curDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (curDevice.Enabled) { - UniqueMinerGroups.Add(GroupNames.GetNameGeneral(curDevice.DeviceType)); - } + foreach (var miningDevice in _miningDevices) { + //if (miningDevice.MostProfitableKey != AlgorithmType.NONE) { + UniqueMinerGroups.Add(GroupNames.GetNameGeneral(miningDevice.Device.DeviceType)); + //} } if (UniqueMinerGroups.Count > 0 && IsProfitable) { ActiveMinersGroup = string.Join("/", UniqueMinerGroups); @@ -314,10 +210,9 @@ public string GetActiveMinersGroup() { public double GetTotalRate() { double TotalRate = 0; - if (_currentAllGroupedDevices != null) { - foreach (var group in _currentAllGroupedDevices) { - var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; - TotalRate += groupMiners.CurrentWorkingMiner.CurrentRate; + if (_runningGroupMiners != null) { + foreach (var groupMiner in _runningGroupMiners.Values) { + TotalRate += groupMiner.CurrentRate; } } @@ -363,16 +258,18 @@ private bool CheckIfShouldMine(double CurrentProfit, bool log = true) { } public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData, bool log = true) { - List profitableDevices = new List(); +#if (SWITCH_TESTING) + MiningDevice.SetNextTest(); +#endif + List profitableDevices = new List(); double CurrentProfit = 0.0d; foreach (var device in _miningDevices) { // calculate profits device.CalculateProfits(NiceHashData); // check if device has profitable algo - if (device.MostProfitableKey != AlgorithmType.NONE) { - profitableDevices.Add(device); + if (device.HasProfitableAlgo()) { + profitableDevices.Add(device.GetMostProfitablePair()); CurrentProfit += device.GetCurrentMostProfitValue; - device.Device.MostProfitableAlgorithm = device.Algorithms[device.MostProfitableKey].algoRef; } } // print profit statuses @@ -404,91 +301,124 @@ public void SwichMostProfitableGroupUpMethod(Dictionary> newGroupedMiningPairs = new Dictionary>(); // group devices with same supported algorithms - _previousAllGroupedDevices = _currentAllGroupedDevices; - _currentAllGroupedDevices = new List>(); - Dictionary newGroupAndAlgorithm = new Dictionary(); - for (int first = 0; first < profitableDevices.Count; ++first) { - var firstDev = profitableDevices[first].Device; - // skip if no algorithm is profitable - if (firstDev.MostProfitableAlgorithm == null) { - if (log) Helpers.ConsolePrint("SwichMostProfitableGroupUpMethod", String.Format("Device {0}, MostProfitableAlgorithm == null", firstDev.Name)); - continue; - } - // check if is in group - bool isInGroup = false; - foreach (var groupedDevices in _currentAllGroupedDevices) { - if (groupedDevices.Contains(firstDev.UUID)) { - isInGroup = true; - break; + { + var currentGroupedDevices = new List(); + for (int first = 0; first < profitableDevices.Count; ++first) { + var firstDev = profitableDevices[first].Device; + // check if is in group + bool isInGroup = false; + foreach (var groupedDevices in currentGroupedDevices) { + if (groupedDevices.Contains(firstDev.UUID)) { + isInGroup = true; + break; + } } - } - if (isInGroup) continue; - - var newGroup = new GroupedDevices(); - newGroup.Add(firstDev.UUID); - for (int second = first + 1; second < profitableDevices.Count; ++second) { - var secondDev = profitableDevices[second].Device; - // first check if second device has profitable algorithm - if (secondDev.MostProfitableAlgorithm != null) { - // check if we should group - bool isEquihashGroup = GroupingLogic.IsEquihashGroupLogic(firstDev, secondDev); - bool isDaggerAndSameComputePlatform = GroupingLogic.IsDaggerAndSameComputePlatform(firstDev, secondDev); - bool isGroupBinaryAndAlgorithmSame = GroupingLogic.IsGroupBinaryAndAlgorithmSame(firstDev, secondDev); - if (isEquihashGroup - || isDaggerAndSameComputePlatform - || isGroupBinaryAndAlgorithmSame) { - newGroup.Add(secondDev.UUID); + // if device is not in any group create new group and check if other device should group + if (isInGroup == false) { + var newGroup = new GroupedDevices(); + var miningPairs = new List() { profitableDevices[first] }; + newGroup.Add(firstDev.UUID); + for (int second = first + 1; second < profitableDevices.Count; ++second) { + // check if we should group + var firstPair = profitableDevices[first]; + var secondPair = profitableDevices[second]; + if (GroupingLogic.ShouldGroup(firstPair, secondPair)) { + var secondDev = profitableDevices[second].Device; + newGroup.Add(secondDev.UUID); + miningPairs.Add(profitableDevices[second]); + } } + currentGroupedDevices.Add(newGroup); + newGroupedMiningPairs[CalcGroupedDevicesKey(newGroup)] = miningPairs; } } - - _currentAllGroupedDevices.Add(newGroup); - newGroupAndAlgorithm.Add(newGroup, firstDev.MostProfitableAlgorithm); } - - // stop groupes that aren't in current group devices - foreach (var curPrevGroup in _previousAllGroupedDevices) { - var curPrevGroupKey = CalcGroupedDevicesKey(curPrevGroup); - bool contains = false; - foreach (var curCheckGroup in _currentAllGroupedDevices) { - var curCheckGroupKey = CalcGroupedDevicesKey(curCheckGroup); - if (curPrevGroupKey == curCheckGroupKey) { - contains = true; - break; + //bool IsMinerStatsCheckUpdate = false; + { + // check which groupMiners should be stopped and which ones should be started and which to keep running + Dictionary toStopGroupMiners = new Dictionary(); + Dictionary toRunNewGroupMiners = new Dictionary(); + // check what to stop/update + foreach (string runningGroupKey in _runningGroupMiners.Keys) { + if (newGroupedMiningPairs.ContainsKey(runningGroupKey) == false) { + // runningGroupKey not in new group definately needs to be stopped and removed from curently running + toStopGroupMiners[runningGroupKey] = _runningGroupMiners[runningGroupKey]; + } else { + // runningGroupKey is contained but needs to check if mining algorithm is changed + var miningPairs = newGroupedMiningPairs[runningGroupKey]; + var newAlgoType = GetMinerPairAlgorithmType(miningPairs); + if(newAlgoType != AlgorithmType.NONE && newAlgoType != AlgorithmType.INVALID) { + // if algoType valid and different from currently running update + if (newAlgoType != _runningGroupMiners[runningGroupKey].AlgorithmType) { + // remove current one and schedule to stop mining + toStopGroupMiners[runningGroupKey] = _runningGroupMiners[runningGroupKey]; + // create new one TODO check if DaggerHashimoto + GroupMiner newGroupMiner = null; + if (newAlgoType == AlgorithmType.DaggerHashimoto) { + if (_ethminerNVIDIAPaused != null && _ethminerNVIDIAPaused.Key == runningGroupKey) { + newGroupMiner = _ethminerNVIDIAPaused; + } + if (_ethminerAMDPaused != null && _ethminerAMDPaused.Key == runningGroupKey) { + newGroupMiner = _ethminerAMDPaused; + } + } + if (newGroupMiner == null) { + newGroupMiner = new GroupMiner(miningPairs, runningGroupKey); + } + toRunNewGroupMiners[runningGroupKey] = newGroupMiner; + } + } } } - if (!contains) { - _groupedDevicesMiners[curPrevGroupKey].Stop(); + // check brand new + foreach (var kvp in newGroupedMiningPairs) { + var key = kvp.Key; + var miningPairs = kvp.Value; + if (_runningGroupMiners.ContainsKey(key) == false) { + GroupMiner newGroupMiner = new GroupMiner(miningPairs, key); + toRunNewGroupMiners[key] = newGroupMiner; + } } - } - // switch to newGroupAndAlgorithm most profitable algorithm - foreach (var kvpGroupAlgorithm in newGroupAndAlgorithm) { - var group = kvpGroupAlgorithm.Key; - var algorithm = kvpGroupAlgorithm.Value; - - GroupMiners currentGroupMiners; - // try find if it doesn't exist create new - string groupStringKey = CalcGroupedDevicesKey(group); - if (!_groupedDevicesMiners.TryGetValue(groupStringKey, out currentGroupMiners)) { - currentGroupMiners = new GroupMiners(group); - _groupedDevicesMiners.Add(groupStringKey, currentGroupMiners); + // stop old miners + foreach (var toStop in toStopGroupMiners.Values) { + toStop.Stop(); + _runningGroupMiners.Remove(toStop.Key); + // TODO check if daggerHashimoto and save + if(toStop.AlgorithmType == AlgorithmType.DaggerHashimoto) { + if (toStop.DeviceType == DeviceType.NVIDIA) { + _ethminerNVIDIAPaused = toStop; + } else if (toStop.DeviceType == DeviceType.AMD) { + _ethminerAMDPaused = toStop; + } + } + } + // start new miners + foreach (var toStart in toRunNewGroupMiners.Values) { + toStart.Start(_miningLocation, _btcAdress, _worker); + _runningGroupMiners[toStart.Key] = toStart; } - currentGroupMiners.StartAlgorihtm(algorithm, _miningLocation, _btcAdress, _worker); } // stats quick fix code - if (_currentAllGroupedDevices.Count != _previousAllGroupedDevices.Count) { + //if (_currentAllGroupedDevices.Count != _previousAllGroupedDevices.Count) { MinerStatsCheck(NiceHashData); + //} + } + + private AlgorithmType GetMinerPairAlgorithmType(List miningPairs) { + if (miningPairs.Count > 0) { + return miningPairs[0].Algorithm.NiceHashID; } + return AlgorithmType.NONE; } public void MinerStatsCheck(Dictionary NiceHashData) { double CurrentProfit = 0.0d; - _mainFormRatesComunication.ClearRates(_currentAllGroupedDevices.Count); - foreach (var group in _currentAllGroupedDevices) { - var groupMiners = _groupedDevicesMiners[CalcGroupedDevicesKey(group)]; - Miner m = groupMiners.CurrentWorkingMiner; + _mainFormRatesComunication.ClearRates(_runningGroupMiners.Count); + foreach (var groupMiners in _runningGroupMiners.Values) { + Miner m = groupMiners.Miner; // skip if not running if (!m.IsRunning) continue; @@ -499,19 +429,15 @@ public void MinerStatsCheck(Dictionary NiceHashData) } // set rates if (NiceHashData != null && AD != null) { - m.CurrentRate = NiceHashData[AD.AlgorithmID].paying * AD.Speed * 0.000000001; + groupMiners.CurrentRate = NiceHashData[AD.AlgorithmID].paying * AD.Speed * 0.000000001; } else { - m.CurrentRate = 0; + groupMiners.CurrentRate = 0; // set empty - AD = new APIData() { - AlgorithmID = m.CurrentAlgorithmType, - AlgorithmName = AlgorithmNiceHashNames.GetName(m.CurrentAlgorithmType), - Speed = 0.0d - }; + AD = new APIData(groupMiners.AlgorithmType); } - CurrentProfit += m.CurrentRate; + CurrentProfit += groupMiners.CurrentRate; // Update GUI - _mainFormRatesComunication.AddRateInfo(m.MinerTAG(), groupMiners.DevicesInfoString, AD, m.CurrentRate, m.IsAPIReadException); + _mainFormRatesComunication.AddRateInfo(m.MinerTAG(), groupMiners.DevicesInfoString, AD, groupMiners.CurrentRate, m.IsAPIReadException); } // check if profitabile if (CheckStatus && !IsMiningRegardlesOfProfit) { @@ -525,77 +451,5 @@ public void MinerStatsCheck(Dictionary NiceHashData) } } } - - #region Private // Private classes, enums, structs - private enum DeviceMiningStatus { - Disabled, - NoEnabledAlgorithms, - DeviceNull, - CanMine - } - private class MiningAlgorithm { - public MiningAlgorithm(Algorithm algo) { - algoRef = algo; - // init speed that will be avaraged later - AvaragedSpeed = algo.BenchmarkSpeed; - } - public Algorithm algoRef { get; private set; } - // avarage speed of same devices to increase mining stability - public double AvaragedSpeed = 0; - public double CurrentProfit = 0; - public double CurNhmSMADataVal = 0; - } - private class MiningDevice { - public MiningDevice(ComputeDevice device) { - Device = device; - foreach (var kvp in Device.DeviceBenchmarkConfig.AlgorithmSettings) { - AlgorithmType key = kvp.Key; - Algorithm algo = kvp.Value; - if (IsAlgoMiningCapable(algo)) { - Algorithms[key] = new MiningAlgorithm(algo); - } - } - } - public ComputeDevice Device { get; private set; } - public Dictionary Algorithms = new Dictionary(); - - public AlgorithmType MostProfitableKey { get; private set; } - - public double GetCurrentMostProfitValue { - get { - if (AlgorithmType.NONE != MostProfitableKey) { - return Algorithms[MostProfitableKey].CurrentProfit; - } - return 0; - } - } - - public void CalculateProfits(Dictionary NiceHashData) { - // assume none is profitable - MostProfitableKey = AlgorithmType.NONE; - // calculate new profits - foreach (var miningAlgo in Algorithms) { - AlgorithmType key = miningAlgo.Key; - MiningAlgorithm algo = miningAlgo.Value; - if (NiceHashData.ContainsKey(key)) { - algo.CurNhmSMADataVal = NiceHashData[key].paying; - algo.CurrentProfit = algo.CurNhmSMADataVal * algo.AvaragedSpeed * 0.000000001; - } else { - algo.CurrentProfit = 0; - } - } - // find max paying value and save key - double maxProfit = 0; - foreach (var miningAlgo in Algorithms) { - AlgorithmType key = miningAlgo.Key; - MiningAlgorithm algo = miningAlgo.Value; - if (maxProfit < algo.CurrentProfit) { - maxProfit = algo.CurrentProfit; - MostProfitableKey = key; - } - } - } - } - #endregion Private // Private classes, enums, structs } } diff --git a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs similarity index 64% rename from NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs rename to NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 414714f..ee66e97 100644 --- a/NiceHashMiner/Miners/Grouping/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -1,13 +1,14 @@ using NiceHashMiner.Configs; using NiceHashMiner.Devices; using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace NiceHashMiner.Miners { +namespace NiceHashMiner.Miners.Parsing { static class ExtraLaunchParametersParser { private static readonly string TAG = "ExtraLaunchParametersParser"; @@ -100,13 +101,12 @@ private static void LogParser(string msg) { } // exception... - public static int GetEqmThreadCount(ComputeDevice cDev) { - if (cDev.MostProfitableAlgorithm.ExtraLaunchParameters.Contains("-ct")) { + public static int GetEqmCudaThreadCount(MiningPair pair) { + if (pair.CurrentExtraLaunchParameters.Contains("-ct")) { List eqm_CUDA_Options = new List() { new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "1", MinerOptionFlagType.MultiParam, " "), }; - cDev.CurrentExtraLaunchParameters = cDev.MostProfitableAlgorithm.ExtraLaunchParameters; - string parsedStr = Parse(new List() { cDev }, eqm_CUDA_Options, true); + string parsedStr = Parse(new List() { pair }, eqm_CUDA_Options, true); try { int threads = Int32.Parse(parsedStr.Trim().Replace("-ct", "").Trim()); return threads; @@ -115,7 +115,7 @@ public static int GetEqmThreadCount(ComputeDevice cDev) { return 1; // default } - private static string Parse(List CDevs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { + private static string Parse(List MiningPairs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); //Dictionary paramsFlags = new Dictionary(); @@ -123,29 +123,25 @@ private static string Parse(List CDevs, List options Dictionary isOptionDefaults = new Dictionary(); Dictionary isOptionExist = new Dictionary(); // init devs options, and defaults - foreach (var cDev in CDevs) { + foreach (var pair in MiningPairs) { var defaults = new Dictionary(); foreach (var option in options) { - //defaults.Add(option.Type, option.Default); defaults[option.Type] = option.Default; } - //cdevOptions.Add(cDev.UUID, defaults); - cdevOptions[cDev.UUID] = defaults; + cdevOptions[pair.Device.UUID] = defaults; } // init order and params flags, and params list foreach (var option in options) { MinerOptionType optionType = option.Type; optionsOrder.Add(optionType); - //isOptionDefaults.Add(optionType, true); - //isOptionExist.Add(optionType, false); isOptionDefaults[optionType] = true; isOptionExist[optionType] = false; } // parse - foreach (var cDev in CDevs) { - LogParser(String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", cDev.CurrentExtraLaunchParameters, cDev.UUID)); - var parameters = cDev.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' '); + foreach (var pair in MiningPairs) { + LogParser(String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", pair.CurrentExtraLaunchParameters, pair.Device.UUID)); + var parameters = pair.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' '); bool prevHasIgnoreParam = false; int logCount = 0; @@ -184,7 +180,7 @@ private static string Parse(List CDevs, List options isIngored = false; if (option.FlagType == MinerOptionFlagType.Uni) { isOptionExist[option.Type] = true; - cdevOptions[cDev.UUID][option.Type] = "notNull"; // if Uni param is null it is not present + cdevOptions[pair.Device.UUID][option.Type] = "notNull"; // if Uni param is null it is not present } else { // Sinlge and Multi param currentFlag = option.Type; } @@ -195,7 +191,7 @@ private static string Parse(List CDevs, List options } } else if (currentFlag != MinerOptionType.NONE) { isOptionExist[currentFlag] = true; - cdevOptions[cDev.UUID][currentFlag] = param; + cdevOptions[pair.Device.UUID][currentFlag] = param; currentFlag = MinerOptionType.NONE; } else { // problem ignorePrintLog(param); @@ -207,9 +203,9 @@ private static string Parse(List CDevs, List options // check if is all defaults bool isAllDefault = true; - foreach (var cDev in CDevs) { + foreach (var pair in MiningPairs) { foreach (var option in options) { - if (option.Default != cdevOptions[cDev.UUID][option.Type]) { + if (option.Default != cdevOptions[pair.Device.UUID][option.Type]) { isAllDefault = false; isOptionDefaults[option.Type] = false; } @@ -222,8 +218,8 @@ private static string Parse(List CDevs, List options if(option.FlagType == MinerOptionFlagType.Uni) { // uni params if one exist use or all must exist? bool isOptionInUse = false; - foreach (var cDev in CDevs) { - if (cdevOptions[cDev.UUID][option.Type] != null) { + foreach (var pair in MiningPairs) { + if (cdevOptions[pair.Device.UUID][option.Type] != null) { isOptionInUse = true; break; } @@ -233,8 +229,8 @@ private static string Parse(List CDevs, List options } } else if(option.FlagType == MinerOptionFlagType.MultiParam) { List values = new List(); - foreach (var cDev in CDevs) { - values.Add(cdevOptions[cDev.UUID][option.Type]); + foreach (var pair in MiningPairs) { + values.Add(cdevOptions[pair.Device.UUID][option.Type]); } string MASK = " {0} {1}"; if(option.LongName.Contains('=')) { @@ -243,8 +239,8 @@ private static string Parse(List CDevs, List options retVal += String.Format(MASK, option.LongName, string.Join(option.Separator, values)); } else if (option.FlagType == MinerOptionFlagType.SingleParam) { HashSet values = new HashSet(); - foreach (var cDev in CDevs) { - values.Add(cdevOptions[cDev.UUID][option.Type]); + foreach (var pair in MiningPairs) { + values.Add(cdevOptions[pair.Device.UUID][option.Type]); } string setValue = option.Default; if (values.Count >= 1) { @@ -266,84 +262,86 @@ private static string Parse(List CDevs, List options return retVal; } + public static string ParseForMiningSetup(MiningSetup miningSetup, DeviceType deviceType, bool showLog = true) { + return ParseForMiningPairs( + miningSetup.MiningPairs, + miningSetup.CurrentAlgorithmType, + deviceType, miningSetup.MinerPath, showLog); + } + + public static string ParseForMiningPair(MiningPair miningPair, AlgorithmType algorithmType, DeviceType deviceType, bool showLog = true) { + return ParseForMiningPairs( + new List() { miningPair }, + algorithmType, deviceType, + MinerPaths.GetOptimizedMinerPath(miningPair), showLog); + } - public static string ParseForCDevs(List CDevs, AlgorithmType algorithmType, DeviceType deviceType, string minerPath = "", bool showLog = true) { + private static string ParseForMiningPairs(List MiningPairs, AlgorithmType algorithmType, DeviceType deviceType, string minerPath = "", bool showLog = true) { _showLog = showLog; - // init cdevs extra launch parameters - foreach (var cDev in CDevs) { - cDev.CurrentExtraLaunchParameters = cDev.MostProfitableAlgorithm.ExtraLaunchParameters; - } // parse for nheqminer + bool deviceCheckSkip = algorithmType == AlgorithmType.Equihash || algorithmType == AlgorithmType.DaggerHashimoto; if (algorithmType == AlgorithmType.Equihash) { // nheqminer - if(minerPath == MinerPaths.nheqminer) { + if (minerPath == MinerPaths.nheqminer) { if (deviceType == DeviceType.CPU) { - foreach (var cDev in CDevs) { - // extra thread check - if (cDev.CurrentExtraLaunchParameters.Contains("-t")) { - // nothing - } else { // add threads params mandatory - cDev.CurrentExtraLaunchParameters += " -t " + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); - } - } - return Parse(CDevs, _nheqminer_CPU_Options); + CheckAndSetCPUPairs(MiningPairs); + return Parse(MiningPairs, _nheqminer_CPU_Options); } if (deviceType == DeviceType.NVIDIA) { - return Parse(CDevs, _nheqminer_CUDA_Options); + return Parse(MiningPairs, _nheqminer_CUDA_Options); } if (deviceType == DeviceType.AMD) { - return Parse(CDevs, _nheqminer_AMD_Options); + return Parse(MiningPairs, _nheqminer_AMD_Options); } } else if (minerPath == MinerPaths.eqm) { if (deviceType == DeviceType.CPU) { - foreach (var cDev in CDevs) { - // extra thread check - if (cDev.CurrentExtraLaunchParameters.Contains("-t")) { - // nothing - } else { // add threads params mandatory - cDev.CurrentExtraLaunchParameters += " -t " + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); - } - // use only first CPU dev - break; - } - return Parse(CDevs, _eqm_CPU_Options); + CheckAndSetCPUPairs(MiningPairs); + return Parse(MiningPairs, _eqm_CPU_Options); } if (deviceType == DeviceType.NVIDIA) { - return Parse(CDevs, _eqm_CUDA_Options); + return Parse(MiningPairs, _eqm_CUDA_Options); } } - } - - // parse for device - if (deviceType == DeviceType.NVIDIA) { - if (algorithmType != AlgorithmType.DaggerHashimoto && algorithmType != AlgorithmType.CryptoNight) { - return Parse(CDevs, _ccimerOptions); - } else if (algorithmType == AlgorithmType.CryptoNight) { - // check if any device is SM21 or SM3.x if yes return empty for stability reasons - foreach (var cDev in CDevs) { - if (cDev.DeviceGroupType == DeviceGroupType.NVIDIA_2_1 - || cDev.DeviceGroupType == DeviceGroupType.NVIDIA_3_x) { - return ""; - } - } - return Parse(CDevs, _ccimerCryptoNightOptions, true); - } else { // ethminer dagger - // use if missing compute device for correct mapping + } else if (algorithmType == AlgorithmType.DaggerHashimoto) { // ethminer dagger + // use if missing compute device for correct mapping + // init fakes workaround + var cdevs_mappings = new List(); + { int id = -1; - var cdevs_mappings = new List(); - foreach (var cDev in CDevs) { - while(++id != cDev.ID) { + var fakeAlgo = new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto"); + foreach (var pair in MiningPairs) { + while (++id != pair.Device.ID) { var fakeCdev = new ComputeDevice(id, "", ""); - fakeCdev.CurrentExtraLaunchParameters = ""; // empty - cdevs_mappings.Add(fakeCdev); + cdevs_mappings.Add(new MiningPair(fakeCdev, fakeAlgo)); } - cdevs_mappings.Add(cDev); + cdevs_mappings.Add(pair); } + } + if (deviceType == DeviceType.NVIDIA) { return Parse(cdevs_mappings, _cudaEthminerOptions); + } else if (deviceType == DeviceType.AMD) { + return Parse(cdevs_mappings, _oclEthminerOptions); } - } else if (deviceType == DeviceType.AMD) { - if (algorithmType != AlgorithmType.DaggerHashimoto) { + } else if (deviceCheckSkip == false) { + // parse for device + if (deviceType == DeviceType.CPU) { + CheckAndSetCPUPairs(MiningPairs); + return Parse(MiningPairs, _cpuminerOptions); + } else if (deviceType == DeviceType.NVIDIA) { + if (algorithmType != AlgorithmType.CryptoNight) { + return Parse(MiningPairs, _ccimerOptions); + } else if (algorithmType == AlgorithmType.CryptoNight) { + // check if any device is SM21 or SM3.x if yes return empty for stability reasons + foreach (var pair in MiningPairs) { + var groupType = pair.Device.DeviceGroupType; + if (groupType == DeviceGroupType.NVIDIA_2_1 || groupType == DeviceGroupType.NVIDIA_3_x) { + return ""; + } + } + return Parse(MiningPairs, _ccimerCryptoNightOptions, true); + } + } else if (deviceType == DeviceType.AMD) { // rawIntensity overrides xintensity, xintensity overrides intensity var sgminer_intensities = new List() { new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d", MinerOptionFlagType.MultiParam, ","), // default is "d" check if -1 works @@ -356,28 +354,27 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo { MinerOptionType.Rawintensity, false }, }; // check intensity and xintensity, the latter overrides so change accordingly - foreach (var cDev in CDevs) { + foreach (var cDev in MiningPairs) { foreach (var intensityOption in sgminer_intensities) { if (!string.IsNullOrEmpty(intensityOption.ShortName) && cDev.CurrentExtraLaunchParameters.Contains(intensityOption.ShortName)) { cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace(intensityOption.ShortName, intensityOption.LongName); - contains_intensity[intensityOption.Type] = true; + contains_intensity[intensityOption.Type] = true; } if (cDev.CurrentExtraLaunchParameters.Contains(intensityOption.LongName)) { contains_intensity[intensityOption.Type] = true; } } } - // replace - if(contains_intensity[MinerOptionType.Intensity] && contains_intensity[MinerOptionType.Xintensity]) { + if (contains_intensity[MinerOptionType.Intensity] && contains_intensity[MinerOptionType.Xintensity]) { LogParser("Sgminer replacing --intensity with --xintensity"); - foreach (var cDev in CDevs) { + foreach (var cDev in MiningPairs) { cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--intensity", "--xintensity"); } } if (contains_intensity[MinerOptionType.Xintensity] && contains_intensity[MinerOptionType.Rawintensity]) { LogParser("Sgminer replacing --xintensity with --rawintensity"); - foreach (var cDev in CDevs) { + foreach (var cDev in MiningPairs) { cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--xintensity", "--rawintensity"); } } @@ -389,100 +386,35 @@ public static string ParseForCDevs(List CDevs, AlgorithmType algo LogParser("DisableAMDTempControl is TRUE, temp control parameters will be ignored"); } else { LogParser("Sgminer parsing temperature control parameters"); - temperatureControl = Parse(CDevs, _sgminerTemperatureOptions, true, _sgminerOptions); + temperatureControl = Parse(MiningPairs, _sgminerTemperatureOptions, true, _sgminerOptions); } LogParser("Sgminer parsing default parameters"); - string returnStr = String.Format("{0} {1}", Parse(CDevs, _sgminerOptions, false, _sgminerTemperatureOptions), temperatureControl); + string returnStr = String.Format("{0} {1}", Parse(MiningPairs, _sgminerOptions, false, _sgminerTemperatureOptions), temperatureControl); LogParser("Sgminer extra launch parameters merged: " + returnStr); return returnStr; - } else { // ethminer dagger - // use if missing compute device for correct mapping - int id = -1; - var cdevs_mappings = new List(); - foreach (var cDev in CDevs) { - while (++id != cDev.ID) { - var fakeCdev = new ComputeDevice(id, "", ""); - fakeCdev.CurrentExtraLaunchParameters = ""; // empty - cdevs_mappings.Add(fakeCdev); - } - cdevs_mappings.Add(cDev); - } - return Parse(cdevs_mappings, _oclEthminerOptions); - } - } else if (deviceType == DeviceType.CPU) { - foreach (var cDev in CDevs) { - // extra thread check - if (cDev.CurrentExtraLaunchParameters.Contains("--threads=") || cDev.CurrentExtraLaunchParameters.Contains("-t")) { - // nothing - } else { // add threads params mandatory - cDev.CurrentExtraLaunchParameters += " --threads=" + GetThreads(cDev.Threads, cDev.MostProfitableAlgorithm.LessThreads).ToString(); - } } - return Parse(CDevs, _cpuminerOptions); } return ""; } + private static void CheckAndSetCPUPairs(List MiningPairs) { + foreach (var pair in MiningPairs) { + var cDev = pair.Device; + // extra thread check + if (pair.CurrentExtraLaunchParameters.Contains("--threads=") || pair.CurrentExtraLaunchParameters.Contains("-t")) { + // nothing + } else { // add threads params mandatory + pair.CurrentExtraLaunchParameters += " -t " + GetThreads(cDev.Threads, pair.Algorithm.LessThreads).ToString(); + } + } + } + private static int GetThreads(int Threads, int LessThreads) { if (Threads > LessThreads) { return Threads - LessThreads; } return Threads; } - - - /////////////////////////////////////////////////////////////////// testing - private static List CreateFakeCDevs(List algos) { - List CDevs = new List(); - int uuid = 0; - foreach (var algo in algos) { - ++uuid; - ComputeDevice cDev = new ComputeDevice(0, String.Format("device_{0}", uuid.ToString()), uuid.ToString()); - cDev.MostProfitableAlgorithm = algo; - CDevs.Add(cDev); - } - return CDevs; - } - - public static string GetCcminer_CryptonightTest() { - List algos = new List() { - new Algorithm(AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x13" }, - new Algorithm(AlgorithmType.CryptoNight, "cryptonight") {ExtraLaunchParameters = "should not be here --bfactor= ssw"}, // no extra launch params - new Algorithm(AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x8" } - }; - return ParseForCDevs(CreateFakeCDevs(algos), AlgorithmType.CryptoNight, DeviceType.NVIDIA); - } - - public static string GetCcminer_CryptonightTest2() { - List algos = new List() { - new Algorithm(AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = "--bsleep= 0 --bfactor= 0 --launch=32x13" }, - new Algorithm(AlgorithmType.CryptoNight, "cryptonight"), // no extra launch params - new Algorithm(AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = "--bsleep=0 --bfactor=0 --launch=32x8" } - }; - return ParseForCDevs(CreateFakeCDevs(algos), AlgorithmType.CryptoNight, DeviceType.NVIDIA); - } - - public static string Get_NoParamsTest() { - List algos = new List() { - new Algorithm(AlgorithmType.CryptoNight, "cryptonight"), - new Algorithm(AlgorithmType.CryptoNight, "cryptonight"), // no extra launch params - new Algorithm(AlgorithmType.CryptoNight, "cryptonight") - }; - return ParseForCDevs(CreateFakeCDevs(algos), AlgorithmType.CryptoNight, DeviceType.NVIDIA); - } - - public static string Get_SgminerTest() { - List algos = new List() { - new Algorithm(AlgorithmType.X13, "x13") - { ExtraLaunchParameters = AmdGpuDevice.TemperatureParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 64 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam }, - new Algorithm(AlgorithmType.X13, "x13") - { ExtraLaunchParameters = AmdGpuDevice.TemperatureParam + "--nfactor 10 --xintensity 512 --thread-concurrency 128 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam }, - new Algorithm(AlgorithmType.X13, "x13") - { ExtraLaunchParameters = AmdGpuDevice.TemperatureParam + "--nfactor 10 --xintensity 64 --thread-concurrency 64 --worksize 64 --gpu-threads 4" + AmdGpuDevice.TemperatureParam }, - }; - - return ParseForCDevs(CreateFakeCDevs(algos), AlgorithmType.X13, DeviceType.AMD); - } } } diff --git a/NiceHashMiner/Miners/Grouping/MinerOption.cs b/NiceHashMiner/Miners/Parsing/MinerOption.cs similarity index 95% rename from NiceHashMiner/Miners/Grouping/MinerOption.cs rename to NiceHashMiner/Miners/Parsing/MinerOption.cs index 1933f0c..bd222c4 100644 --- a/NiceHashMiner/Miners/Grouping/MinerOption.cs +++ b/NiceHashMiner/Miners/Parsing/MinerOption.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; -namespace NiceHashMiner.Miners { +namespace NiceHashMiner.Miners.Parsing { public class MinerOption { public MinerOption(MinerOptionType iType, string iShortName, string iLongName, string iDefault, MinerOptionFlagType iFlagType, string iSeparator) { this.Type = iType; diff --git a/NiceHashMiner/Miners/ccminer/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs similarity index 77% rename from NiceHashMiner/Miners/ccminer/ccminer.cs rename to NiceHashMiner/Miners/ccminer.cs index 361d6fe..ce3f7b9 100644 --- a/NiceHashMiner/Miners/ccminer/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -10,12 +10,14 @@ using NiceHashMiner.Configs; using NiceHashMiner.Enums; using NiceHashMiner.Devices; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; namespace NiceHashMiner.Miners { - abstract public class ccminer : Miner + public class ccminer : Miner { - public ccminer(DeviceGroupType deviceGroupType, string minerDeviceName) : base(DeviceType.NVIDIA, deviceGroupType, minerDeviceName) { } + public ccminer() : base("ccminer_NVIDIA") { } // cryptonight benchmark exception int _cryptonightTotalCount = 0; @@ -26,34 +28,35 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { return 60 * 1000; // 1 minute max, whole waiting time 75seconds } - public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) + public override void Start(string url, string btcAdress, string worker) { + if (!IsInit) { + Helpers.ConsolePrint(MinerTAG(), "MiningSetup is not initialized exiting Start()"); + return; + } string username = GetUsername(btcAdress, worker); - CurrentMiningAlgorithm = miningAlgorithm; - if (miningAlgorithm == null) return; string algo = ""; string apiBind = ""; - if (CurrentMiningAlgorithm.NiceHashID != AlgorithmType.CryptoNight) { - algo = "--algo=" + miningAlgorithm.MinerName; + if (MiningSetup.CurrentAlgorithmType != AlgorithmType.CryptoNight) { + algo = "--algo=" + MiningSetup.MinerName; apiBind = " --api-bind=" + APIPort.ToString(); } - IsAPIReadException = CurrentMiningAlgorithm.NiceHashID == AlgorithmType.CryptoNight; + IsAPIReadException = MiningSetup.CurrentAlgorithmType == AlgorithmType.CryptoNight; LastCommandLine = algo + " --url=" + url + - " --userpass=" + username + ":" + Algorithm.PasswordDefault + + " --userpass=" + username + ":" + Globals.PasswordDefault + apiBind + " " + - ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - CurrentMiningAlgorithm.NiceHashID, + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.NVIDIA) + " --devices "; LastCommandLine += GetDevicesCommandString(); - Path = GetOptimizedMinerPath(miningAlgorithm.NiceHashID); + Path = MiningSetup.MinerPath; ProcessHandle = _Start(); } @@ -74,15 +77,14 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti string CommandLine = " --algo=" + algorithm.MinerName + " --benchmark" + timeLimit + " " + - ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - algorithm.NiceHashID, + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.NVIDIA) + " --devices "; CommandLine += GetDevicesCommandString(); - Path = GetOptimizedMinerPath(algorithm.NiceHashID); + Path = MiningSetup.MinerPath; // cryptonight exception helper variables _cryptonightTotalCount = BenchmarkTimeInSeconds / _cryptonightTotalDelim; @@ -145,7 +147,7 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { public override APIData GetSummary() { // CryptoNight does not have api bind port - if (CurrentAlgorithmType == AlgorithmType.CryptoNight) { + if (MiningSetup.CurrentAlgorithmType == AlgorithmType.CryptoNight) { // check if running if (ProcessHandle == null) { _currentMinerReadStatus = MinerAPIReadStatus.RESTART; @@ -156,28 +158,20 @@ public override APIData GetSummary() { var runningProcess = Process.GetProcessById(ProcessHandle.Id); } catch (ArgumentException ex) { _currentMinerReadStatus = MinerAPIReadStatus.RESTART; - Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Could not read data from CryptoNight"); + Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Could not read data from CryptoNight reason: " + ex.Message); return null; // will restart outside } catch (InvalidOperationException ex) { _currentMinerReadStatus = MinerAPIReadStatus.RESTART; - Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Could not read data from CryptoNight"); + Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Could not read data from CryptoNight reason: " + ex.Message); return null; // will restart outside } - // extra check - if (CurrentMiningAlgorithm == null) { - _currentMinerReadStatus = MinerAPIReadStatus.RESTART; - Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Could not read data from CryptoNight Proccess CurrentMiningAlgorithm is NULL"); - return null; - } var totalSpeed = 0.0d; - foreach (var cdev in CDevs) { - totalSpeed += cdev.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.CryptoNight].BenchmarkSpeed; + foreach (var miningPair in MiningSetup.MiningPairs) { + totalSpeed += miningPair.Device.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.CryptoNight].BenchmarkSpeed; } - APIData CryptoNightData = new APIData(); - CryptoNightData.AlgorithmID = AlgorithmType.CryptoNight; - CryptoNightData.AlgorithmName = "cryptonight"; + APIData CryptoNightData = new APIData(MiningSetup.CurrentAlgorithmType); CryptoNightData.Speed = totalSpeed; _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; // check if speed zero diff --git a/NiceHashMiner/Miners/ccminer/ccminer_sm21.cs b/NiceHashMiner/Miners/ccminer/ccminer_sm21.cs deleted file mode 100644 index 0f9de5b..0000000 --- a/NiceHashMiner/Miners/ccminer/ccminer_sm21.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using NiceHashMiner.Configs; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; - -namespace NiceHashMiner.Miners -{ - class ccminer_sm21 : ccminer - { - public ccminer_sm21() - : base(DeviceGroupType.NVIDIA_2_1, "NVIDIA2.1") - { - Path = MinerPaths.ccminer_tpruvot; - } - - protected override void InitSupportedMinerAlgorithms() { - var allGroupSupportedList = GroupAlgorithms.GetAlgorithmKeysForGroup(DeviceGroupType.NVIDIA_2_1); - allGroupSupportedList.Remove(AlgorithmType.DaggerHashimoto); - allGroupSupportedList.Remove(AlgorithmType.Equihash); - _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); - } - } -} diff --git a/NiceHashMiner/Miners/ccminer/ccminer_sm3x.cs b/NiceHashMiner/Miners/ccminer/ccminer_sm3x.cs deleted file mode 100644 index d7bdbba..0000000 --- a/NiceHashMiner/Miners/ccminer/ccminer_sm3x.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using NiceHashMiner.Configs; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; - -namespace NiceHashMiner.Miners -{ - class ccminer_sm3x : ccminer - { - public ccminer_sm3x() : base(DeviceGroupType.NVIDIA_3_x, "NVIDIA3.x") - { - Path = MinerPaths.ccminer_tpruvot; - } - - protected override void InitSupportedMinerAlgorithms() { - var allGroupSupportedList = GroupAlgorithms.GetAlgorithmKeysForGroup(DeviceGroupType.NVIDIA_3_x); - allGroupSupportedList.Remove(AlgorithmType.DaggerHashimoto); - allGroupSupportedList.Remove(AlgorithmType.Equihash); - _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); - } - } -} diff --git a/NiceHashMiner/Miners/ccminer/ccminer_sm5x.cs b/NiceHashMiner/Miners/ccminer/ccminer_sm5x.cs deleted file mode 100644 index 4b5ad13..0000000 --- a/NiceHashMiner/Miners/ccminer/ccminer_sm5x.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; -using NiceHashMiner.Configs; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; - -namespace NiceHashMiner.Miners -{ - class ccminer_sm5x : ccminer - { - public ccminer_sm5x(DeviceGroupType deviceGroupType = DeviceGroupType.NVIDIA_5_x, string minerDeviceName = "NVIDIA5.x") : - base(deviceGroupType, minerDeviceName) - { - Path = MinerPaths.ccminer_sp; - } - - protected override void InitSupportedMinerAlgorithms() { - var allGroupSupportedList = GroupAlgorithms.GetAlgorithmKeysForGroup(DeviceGroupType.NVIDIA_5_x); - allGroupSupportedList.Remove(AlgorithmType.DaggerHashimoto); - allGroupSupportedList.Remove(AlgorithmType.Equihash); - _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); - } - } -} diff --git a/NiceHashMiner/Miners/ccminer/ccminer_sm6x.cs b/NiceHashMiner/Miners/ccminer/ccminer_sm6x.cs deleted file mode 100644 index fb78f1c..0000000 --- a/NiceHashMiner/Miners/ccminer/ccminer_sm6x.cs +++ /dev/null @@ -1,18 +0,0 @@ -using NiceHashMiner.Configs; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NiceHashMiner.Miners { - class ccminer_sm6x : ccminer_sm5x { - public ccminer_sm6x() : - base(DeviceGroupType.NVIDIA_6_x, "NVIDIA6.x") - { } - - } -} diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index 1d74ede..fe956df 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -6,42 +6,32 @@ using NiceHashMiner.Configs; using NiceHashMiner.Devices; using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; namespace NiceHashMiner.Miners { public class cpuminer : Miner { - //private int Threads; - //private ulong AffinityMask; - public cpuminer() - : base(DeviceType.CPU, DeviceGroupType.CPU, "CPU") { + : base("cpuminer_CPU") { } protected override int GET_MAX_CooldownTimeInMilliseconds() { return 60 * 1000; // 1 minute max, whole waiting time 75seconds } - protected override void InitSupportedMinerAlgorithms() { - var allGroupSupportedList = GroupAlgorithms.GetAlgorithmKeysForGroup(DeviceGroupType.CPU); - _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); - } - - public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) { + public override void Start(string url, string btcAdress, string worker) { + if(!IsInit) { + Helpers.ConsolePrint(MinerTAG(), "MiningSetup is not initialized exiting Start()"); + return; + } string username = GetUsername(btcAdress, worker); - CurrentMiningAlgorithm = miningAlgorithm; - if (ProcessHandle != null) return; // ignore, already running - - if (CDevs.Count == 0 || !CDevs[0].Enabled) return; - - if (miningAlgorithm == null) return; - - Path = GetOptimizedMinerPath(miningAlgorithm.NiceHashID); + Path = MiningSetup.MinerPath; - LastCommandLine = "--algo=" + miningAlgorithm.MinerName + + LastCommandLine = "--algo=" + MiningSetup.MinerName + " --url=" + url + - " --userpass=" + username + ":" + Algorithm.PasswordDefault + - ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - CurrentMiningAlgorithm.NiceHashID, + " --userpass=" + username + ":" + Globals.PasswordDefault + + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.CPU) + " --api-bind=" + APIPort.ToString(); @@ -59,8 +49,9 @@ protected override void _Stop(MinerStopType willswitch) { protected override NiceHashProcess _Start() { NiceHashProcess P = base._Start(); - if (CDevs[0].AffinityMask != 0 && P != null) - CPUID.AdjustAffinity(P.Id, CDevs[0].AffinityMask); + var AffinityMask = MiningSetup.MiningPairs[0].Device.AffinityMask; + if (AffinityMask != 0 && P != null) + CPUID.AdjustAffinity(P.Id, AffinityMask); return P; } @@ -73,13 +64,12 @@ protected override bool UpdateBindPortCommand(int oldPort, int newPort) { #region Decoupled benchmarking routines protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - Path = GetOptimizedMinerPath(algorithm.NiceHashID); + Path = MiningSetup.MinerPath; return "--algo=" + algorithm.MinerName + " --benchmark" + - ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - algorithm.NiceHashID, + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.CPU) + " --time-limit " + time.ToString(); } @@ -87,8 +77,9 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti protected override Process BenchmarkStartProcess(string CommandLine) { Process BenchmarkHandle = base.BenchmarkStartProcess(CommandLine); - if (CDevs[0].AffinityMask != 0 && BenchmarkHandle != null) - CPUID.AdjustAffinity(BenchmarkHandle.Id, CDevs[0].AffinityMask); + var AffinityMask = MiningSetup.MiningPairs[0].Device.AffinityMask; + if (AffinityMask != 0 && BenchmarkHandle != null) + CPUID.AdjustAffinity(BenchmarkHandle.Id, AffinityMask); return BenchmarkHandle; } diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index c8bff5f..8c9f871 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using System.Net.Sockets; using System.Net; +using NiceHashMiner.Miners.Grouping; namespace NiceHashMiner.Miners { @@ -24,8 +25,8 @@ public abstract class MinerEtherum : Miner { protected bool IsPaused = false; - public MinerEtherum(DeviceType deviceType, string minerDeviceName, string blockString) - : base(deviceType, DeviceGroupType.NONE, minerDeviceName) { + public MinerEtherum(string minerDeviceName, string blockString) + : base(minerDeviceName) { Path = Ethereum.EtherMinerPath; _isEthMinerExit = true; CurrentBlockString = blockString; @@ -36,19 +37,15 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { return 90 * 1000; // 1.5 minute max, whole waiting time 75seconds } - protected override void InitSupportedMinerAlgorithms() { - _supportedMinerAlgorithms = new AlgorithmType[] { AlgorithmType.DaggerHashimoto }; - } - - protected abstract string GetStartCommandStringPart(Algorithm miningAlgorithm, string url, string username); + protected abstract string GetStartCommandStringPart(string url, string username); protected abstract string GetBenchmarkCommandStringPart(Algorithm algorithm); protected override string GetDevicesCommandString() { string deviceStringCommand = " "; List ids = new List(); - foreach (var cdev in CDevs) { - ids.Add(cdev.ID.ToString()); + foreach (var mPair in MiningSetup.MiningPairs) { + ids.Add(mPair.Device.ID.ToString()); } deviceStringCommand += string.Join(" ", ids); // set dag load mode @@ -75,7 +72,11 @@ public static string GetDagGenerationString(DagGenerationType type) { return "singlekeep"; } - public void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker, List usedMiners) { + public void Start(string url, string btcAdress, string worker, List usedMiners) { + if (!IsInit) { + Helpers.ConsolePrint(MinerTAG(), "MiningSetup is not initialized exiting Start()"); + return; + } foreach (var ethminer in usedMiners) { if (ethminer.MINER_ID != MINER_ID && (ethminer.IsRunning || ethminer.IsPaused)) { Helpers.ConsolePrint(MinerTAG(), String.Format("Will end {0} {1}", ethminer.MinerTAG(), ethminer.ProcessTag())); @@ -86,13 +87,8 @@ public void Start(Algorithm miningAlgorithm, string url, string btcAdress, strin IsPaused = false; if (ProcessHandle == null) { - CurrentMiningAlgorithm = miningAlgorithm; - if (miningAlgorithm == null && miningAlgorithm.NiceHashID != AlgorithmType.DaggerHashimoto) { - Helpers.ConsolePrint(MinerTAG(), "Algorithm is null or not DaggerHashimoto"); - return; - } string username = GetUsername(btcAdress, worker); - LastCommandLine = GetStartCommandStringPart(miningAlgorithm, url, username) + GetDevicesCommandString(); + LastCommandLine = GetStartCommandStringPart(url, username) + GetDevicesCommandString(); ProcessHandle = _Start(); } else { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Resuming ethminer.."); @@ -109,23 +105,22 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti return CommandLine; } - public override void SetCDevs(string[] deviceUUIDs) { - base.SetCDevs(deviceUUIDs); + public override void InitMiningSetup(MiningSetup miningSetup) { + base.InitMiningSetup(miningSetup); // now find the fastest for DAG generation double fastestSpeed = double.MinValue; - foreach (var cdev in CDevs) { - double compareSpeed = cdev.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.DaggerHashimoto].BenchmarkSpeed; + foreach (var mPair in MiningSetup.MiningPairs) { + double compareSpeed = mPair.Device.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.DaggerHashimoto].BenchmarkSpeed; if (fastestSpeed < compareSpeed) { - DaggerHashimotoGenerateDevice = cdev; + DaggerHashimotoGenerateDevice = mPair.Device; fastestSpeed = compareSpeed; } } } public override APIData GetSummary() { - APIData ad = new APIData(); + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); - FillAlgorithm("daggerhashimoto", ref ad); bool ismining; var getSpeedStatus = GetSpeed(out ismining, out ad.Speed); if (GetSpeedStatus.GOT == getSpeedStatus) { diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs index 90d2bee..836b41d 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs @@ -6,6 +6,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; namespace NiceHashMiner.Miners { public class MinerEtherumCUDA : MinerEtherum { @@ -15,7 +17,7 @@ public class MinerEtherumCUDA : MinerEtherum { private static List MinerEtherumCUDAList = new List(); public MinerEtherumCUDA() - : base(DeviceType.NVIDIA, "MinerEtherumCUDA", "NVIDIA") { + : base("MinerEtherumCUDA", "NVIDIA") { MinerEtherumCUDAList.Add(this); } @@ -24,20 +26,19 @@ public MinerEtherumCUDA() MinerEtherumCUDAList.Remove(this); } - public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) { + public override void Start(string url, string btcAdress, string worker) { Helpers.ConsolePrint(MinerTAG(), "Starting MinerEtherumCUDA, checking existing MinerEtherumCUDA to stop"); - base.Start(miningAlgorithm, url, btcAdress, worker, MinerEtherumCUDAList); + base.Start(url, btcAdress, worker, MinerEtherumCUDAList); } - protected override string GetStartCommandStringPart(Algorithm miningAlgorithm, string url, string username) { + protected override string GetStartCommandStringPart(string url, string username) { return " --cuda" + " " - + ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - AlgorithmType.DaggerHashimoto, + + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.NVIDIA) + " -S " + url.Substring(14) - + " -O " + username + ":" + Algorithm.PasswordDefault + + " -O " + username + ":" + Globals.PasswordDefault + " --api-port " + APIPort.ToString() + " --cuda-devices "; } @@ -45,9 +46,8 @@ protected override string GetStartCommandStringPart(Algorithm miningAlgorithm, s protected override string GetBenchmarkCommandStringPart(Algorithm algorithm) { return " --benchmark-warmup 40 --benchmark-trial 20" + " " - + ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - AlgorithmType.DaggerHashimoto, + + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.NVIDIA) + " --cuda --cuda-devices "; } diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs index b793eb3..772e3e9 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs @@ -6,6 +6,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; namespace NiceHashMiner.Miners { @@ -20,7 +22,7 @@ public class MinerEtherumOCL : MinerEtherum { private readonly int GPUPlatformNumber; public MinerEtherumOCL() - : base(DeviceType.AMD, "MinerEtherumOCL", "AMD OpenCL") { + : base("MinerEtherumOCL", "AMD OpenCL") { GPUPlatformNumber = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; MinerEtherumOCLList.Add(this); } @@ -30,22 +32,21 @@ public MinerEtherumOCL() MinerEtherumOCLList.Remove(this); } - public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) { + public override void Start(string url, string btcAdress, string worker) { Helpers.ConsolePrint(MinerTAG(), "Starting MinerEtherumOCL, checking existing MinerEtherumOCL to stop"); - base.Start(miningAlgorithm, url, btcAdress, worker, MinerEtherumOCLList); + base.Start(url, btcAdress, worker, MinerEtherumOCLList); } - protected override string GetStartCommandStringPart(Algorithm miningAlgorithm, string url, string username) { + protected override string GetStartCommandStringPart(string url, string username) { // set directory WorkingDirectory = ""; return " --opencl --opencl-platform " + GPUPlatformNumber + " " - + ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - AlgorithmType.DaggerHashimoto, + + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.AMD) + " -S " + url.Substring(14) - + " -O " + username + ":" + Algorithm.PasswordDefault + + " -O " + username + ":" + Globals.PasswordDefault + " --api-port " + APIPort.ToString() + " --opencl-devices "; } @@ -53,9 +54,8 @@ protected override string GetStartCommandStringPart(Algorithm miningAlgorithm, s protected override string GetBenchmarkCommandStringPart(Algorithm algorithm) { return " --opencl --opencl-platform " + GPUPlatformNumber + " " - + ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - AlgorithmType.DaggerHashimoto, + + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.AMD) + " --benchmark-warmup 40 --benchmark-trial 20" + " --opencl-devices "; diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index d57f3fd..202672c 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -11,29 +11,24 @@ using NiceHashMiner.Configs; using NiceHashMiner.Devices; using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; namespace NiceHashMiner.Miners { - // TODO IMPORTANT, Intensity not handled correctly - // for now AMD only class sgminer : Miner { private readonly int GPUPlatformNumber; - - // we only group devices that are compatible. for sgminer we have gpucodename and enabled optimized vesrion as mandatory extra parameters - private string CommonGpuCodenameSetting = ""; - private bool EnableOptimizedVersion = true; - // benchmark helper variables bool _benchmarkOnce = true; Stopwatch _benchmarkTimer = new Stopwatch(); public sgminer() - : base(DeviceType.AMD, DeviceGroupType.AMD_OpenCL, "AMD_OpenCL") + : base("sgminer_AMD") { Path = MinerPaths.sgminer_5_5_0_general; - EnableOptimizedVersion = true; GPUPlatformNumber = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; + IsSgminer = true; } // use ONLY for exiting a benchmark @@ -61,48 +56,30 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { return 90 * 1000; // 1.5 minute max, whole waiting time 75seconds } - protected override void InitSupportedMinerAlgorithms() { - var allGroupSupportedList = GroupAlgorithms.GetAlgorithmKeysForGroup(DeviceGroupType.AMD_OpenCL); - allGroupSupportedList.Remove(AlgorithmType.DaggerHashimoto); - _supportedMinerAlgorithms = allGroupSupportedList.ToArray(); - } - - public override void SetCDevs(string[] deviceUUIDs) { - base.SetCDevs(deviceUUIDs); - // now set extra sgminer settings, first dev is enough because of grouping logic - if(CDevs.Count != 0) { - CommonGpuCodenameSetting = CDevs[0].Codename; - EnableOptimizedVersion = CDevs[0].IsOptimizedVersion; - } - } - protected override void _Stop(MinerStopType willswitch) { Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } - public override void Start(Algorithm miningAlgorithm, string url, string btcAdress, string worker) + public override void Start(string url, string btcAdress, string worker) { - string username = GetUsername(btcAdress, worker); - CurrentMiningAlgorithm = miningAlgorithm; - if (miningAlgorithm == null) - { - Helpers.ConsolePrint(MinerTAG(), "GetMinerAlgorithm(" + miningAlgorithm.NiceHashID + "): Algo equals to null"); + if (!IsInit) { + Helpers.ConsolePrint(MinerTAG(), "MiningSetup is not initialized exiting Start()"); return; } + string username = GetUsername(btcAdress, worker); - Path = GetOptimizedMinerPath(miningAlgorithm.NiceHashID, CommonGpuCodenameSetting, EnableOptimizedVersion); + Path = MiningSetup.MinerPath; WorkingDirectory = Path.Replace("sgminer.exe", ""); LastCommandLine = " --gpu-platform " + GPUPlatformNumber + - " -k " + miningAlgorithm.MinerName + + " -k " + MiningSetup.MinerName + " --url=" + url + - " --userpass=" + username + ":" + Algorithm.PasswordDefault + + " --userpass=" + username + ":" + Globals.PasswordDefault + " --api-listen" + " --api-port=" + APIPort.ToString() + " " + - ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - CurrentMiningAlgorithm.NiceHashID, + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.AMD) + " --device "; @@ -129,7 +106,7 @@ protected override bool UpdateBindPortCommand(int oldPort, int newPort) { protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { string CommandLine; Path = "cmd"; - string MinerPath = GetOptimizedMinerPath(algorithm.NiceHashID, CommonGpuCodenameSetting, EnableOptimizedVersion); + string MinerPath = MiningSetup.MinerPath; var nhAlgorithmData = Globals.NiceHashData[algorithm.NiceHashID]; string url = "stratum+tcp://" + nhAlgorithmData.name + "." + @@ -147,13 +124,12 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti " --gpu-platform " + GPUPlatformNumber + " -k " + algorithm.MinerName + " --url=" + url + - " --userpass=" + username + ":" + Algorithm.PasswordDefault + + " --userpass=" + username + ":" + Globals.PasswordDefault + " --sched-stop " + DateTime.Now.AddSeconds(time).ToString("HH:mm") + " -T --log 10 --log-file dump.txt" + " " + - ExtraLaunchParametersParser.ParseForCDevs( - CDevs, - algorithm.NiceHashID, + ExtraLaunchParametersParser.ParseForMiningSetup( + MiningSetup, DeviceType.AMD) + " --device "; @@ -233,8 +209,7 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { // TODO _currentMinerReadStatus public override APIData GetSummary() { string resp; - string aname = null; - APIData ad = new APIData(); + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); resp = GetAPIData(APIPort, "summary"); if (resp == null) { @@ -272,9 +247,6 @@ public override APIData GetSummary() { ad.Speed = Double.Parse(speed[1]) * 1000; - aname = CurrentMiningAlgorithm.MinerName; - - if (total_mh <= PreviousTotalMH) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " SGMiner might be stuck as no new hashes are being produced"); Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Prev Total MH: " + PreviousTotalMH + " .. Current Total MH: " + total_mh); @@ -292,7 +264,6 @@ public override APIData GetSummary() { } _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; - FillAlgorithm(aname, ref ad); // check if speed zero if (ad.Speed == 0) _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index ad5b3ef..a9174c9 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -102,6 +102,7 @@ + @@ -179,31 +180,29 @@ - - + + + + - - - + + + - + - - + - - - - + Form diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index d7c26b1..34988a2 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -12,7 +12,6 @@ namespace NiceHashMiner { - using MinersManager = MinersManager_NEW; #pragma warning disable 649 public class NiceHashSMA { From 9f86c00b1893e4d5ed2b166b84b0541368171d49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 21 Nov 2016 21:28:50 +0100 Subject: [PATCH 112/366] Claymore Zcash WIP --- .../Miners/Equihash/ClaymoreZcashMiner.cs | 130 ++++++++++++++++++ NiceHashMiner/Miners/Grouping/MinerPaths.cs | 9 +- NiceHashMiner/Miners/Miner.cs | 1 + NiceHashMiner/Miners/MinersManager.cs | 6 +- NiceHashMiner/NiceHashMiner.csproj | 1 + 5 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs new file mode 100644 index 0000000..720282c --- /dev/null +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -0,0 +1,130 @@ +using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Miners { + public class ClaymoreZcashMiner : Miner { + public ClaymoreZcashMiner() + : base("ClaymoreZcashMiner") { + Path = MinerPaths.ClaymoreZcashMiner; + WorkingDirectory = MinerPaths.ClaymoreZcashMiner.Replace("ZecMiner64.exe", ""); + } + const int BENCHMARK_MAX_GET = 10; + const string LOOK_FOR_START = "ZEC - Total Speed:"; + const string LOOK_FOR_END = " H/s"; + int benchmark_read_count = 0; + double benchmark_sum = 0.0d; + + + public override void Start(string url, string btcAdress, string worker) { + string username = GetUsername(btcAdress, worker); + LastCommandLine = GetDevicesCommandString() + " -mport " + APIPort + " -zpool " + url + " -zwal " + username; + ProcessHandle = _Start(); + } + + protected override int GET_MAX_CooldownTimeInMilliseconds() { + return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds + } + + protected override bool UpdateBindPortCommand(int oldPort, int newPort) { + // TODO + //const string MASK = "-a {0}"; + //var oldApiBindStr = String.Format(MASK, oldPort); + //var newApiBindStr = String.Format(MASK, newPort); + //if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { + // LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); + // return true; + //} + return false; + } + + protected override void _Stop(MinerStopType willswitch) { + // STOP + //Stop_cpu_ccminer_sgminer_nheqminer(willswitch); + } + + public override APIData GetSummary() { + // TODO + _currentMinerReadStatus = MinerAPIReadStatus.NONE; + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); + + //TcpClient client = null; + //JsonApiResponse resp = null; + //try { + // byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("status\n"); + // client = new TcpClient("127.0.0.1", APIPort); + // NetworkStream nwStream = client.GetStream(); + // nwStream.Write(bytesToSend, 0, bytesToSend.Length); + // byte[] bytesToRead = new byte[client.ReceiveBufferSize]; + // int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); + // string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); + // resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); + // client.Close(); + //} catch (Exception ex) { + // Helpers.ConsolePrint("ERROR", ex.Message); + //} + + //if (resp != null && resp.error == null) { + // ad.Speed = resp.result.speed_sps; + // _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + // if (ad.Speed == 0) { + // _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; + // } + //} else if (resp == null) { + // _currentMinerReadStatus = MinerAPIReadStatus.NONE; + //} + + return ad; + } + + protected override string GetDevicesCommandString() { + string deviceStringCommand = " -di "; + List ids = new List(); + foreach (var mPair in MiningSetup.MiningPairs) { + ids.Add(mPair.Device.ID); + } + deviceStringCommand += string.Join("", ids); + + return deviceStringCommand; + } + + // benchmark stuff + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + String ret = "-benchmark 1 " + GetDevicesCommandString(); + return ret; + } + protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { + CheckOutdata(outdata); + } + + double getNumber(string outdata) { + try { + int speedStart = outdata.IndexOf(LOOK_FOR_START); + String speed = outdata.Substring(speedStart, outdata.Length - speedStart); + speed = speed.Replace(LOOK_FOR_START, ""); + speed = speed.Substring(0, speed.IndexOf(LOOK_FOR_END)); + speed = speed.Trim(); + return Double.Parse(speed, CultureInfo.InvariantCulture); + } catch { + } + return 0; + } + + protected override bool BenchmarkParseLine(string outdata) { + if (outdata.Contains(LOOK_FOR_START)) { + benchmark_sum += getNumber(outdata); + ++benchmark_read_count; + if (benchmark_read_count == BENCHMARK_MAX_GET) { + BenchmarkAlgorithm.BenchmarkSpeed = benchmark_sum / BENCHMARK_MAX_GET; + return true; + } + } + return false; + } + } +} diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 117c2d3..a5541e7 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -56,6 +56,10 @@ public static class MinerPaths public const string NONE = ""; + // root binary folder + private const string _bin_3rdparty = @"bin_3rdparty"; + public const string ClaymoreZcashMiner = _bin_3rdparty + @"\claymore_zcash\ZecMiner64.exe"; + public static string GetOptimizedMinerPath(MiningPair pair) { return GetOptimizedMinerPath(pair.Device, pair.Algorithm); } @@ -84,7 +88,10 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy if (deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; - } else { // supports all DeviceTypes + } else if(deviceType == DeviceType.AMD) { // TODO and 3rdparty enabled + return MinerPaths.ClaymoreZcashMiner; + } + else { // supports all DeviceTypes return MinerPaths.nheqminer; } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 91e84f3..cc360fe 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -274,6 +274,7 @@ public int BenchmarkTimeoutInSeconds(int timeInSeconds) { return timeInSeconds + 120; // wait time plus two minutes } + // TODO remove algorithm abstract protected string BenchmarkCreateCommandLine(Algorithm algorithm, int time); // The benchmark config and algorithm must guarantee that they are compatible with miner diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index e8a0d05..eca288b 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -53,10 +53,12 @@ public static Miner CreateMiner(ComputeDevice device, Algorithm algorithm) { } public static Miner CreateMiner(DeviceType deviceType, string minerPath) { - if (minerPath.Contains("eqm") && DeviceType.AMD != deviceType) { + if (minerPath == MinerPaths.eqm && DeviceType.AMD != deviceType) { return new eqm(); - } else if (minerPath.Contains("nheqminer")) { + } else if (minerPath == MinerPaths.nheqminer) { return new nheqminer(); + } else if (minerPath == MinerPaths.ClaymoreZcashMiner && DeviceType.AMD == deviceType) { + return new ClaymoreZcashMiner(); } else if (minerPath.Contains("ethminer") && DeviceType.CPU != deviceType) { if (DeviceType.AMD == deviceType) { return new MinerEtherumOCL(); diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index a9174c9..7d7040c 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -180,6 +180,7 @@ + From a4e296fb4b5ab8518c187135e5dd7221f5526a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 21 Nov 2016 21:40:05 +0100 Subject: [PATCH 113/366] sgminer sync read benchmark --- NiceHashMiner/Miners/Miner.cs | 6 +-- NiceHashMiner/Miners/sgminer.cs | 71 ++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index cc360fe..bae05f0 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -75,12 +75,12 @@ public abstract class Miner { Stopwatch BenchmarkTimeOutStopWatch = null; public bool BenchmarkSignalTimedout = false; protected bool BenchmarkSignalFinnished; - IBenchmarkComunicator BenchmarkComunicator; - private bool OnBenchmarkCompleteCalled = false; + protected IBenchmarkComunicator BenchmarkComunicator; + protected bool OnBenchmarkCompleteCalled = false; protected Algorithm BenchmarkAlgorithm { get; set; } public BenchmarkProcessStatus BenchmarkProcessStatus { get; protected set; } protected string BenchmarkProcessPath { get; private set; } - protected Process BenchmarkHandle { get; private set; } + protected Process BenchmarkHandle { get; set; } protected Exception BenchmarkException = null; protected int BenchmarkTimeInSeconds; diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 202672c..10ce3e5 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -13,6 +13,7 @@ using NiceHashMiner.Enums; using NiceHashMiner.Miners.Grouping; using NiceHashMiner.Miners.Parsing; +using System.Threading; namespace NiceHashMiner.Miners { @@ -184,7 +185,7 @@ protected override void BenchmarkThreadRoutineStartSettup() { _benchmarkTimer.Reset(); _benchmarkTimer.Start(); // call base, read only outpus - BenchmarkHandle.BeginOutputReadLine(); + //BenchmarkHandle.BeginOutputReadLine(); } protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { @@ -199,11 +200,77 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { KillSGMiner(); BenchmarkSignalHanged = true; } - if (!BenchmarkSignalFinnished) { + if (!BenchmarkSignalFinnished && outdata != null) { CheckOutdata(outdata); } } + protected override void BenchmarkThreadRoutine(object CommandLine) { + Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + + BenchmarkSignalQuit = false; + BenchmarkSignalHanged = false; + BenchmarkSignalFinnished = false; + BenchmarkException = null; + + try { + Helpers.ConsolePrint("BENCHMARK", "Benchmark starts"); + BenchmarkHandle = BenchmarkStartProcess((string)CommandLine); + BenchmarkThreadRoutineStartSettup(); + // wait a little longer then the benchmark routine if exit false throw + //var timeoutTime = BenchmarkTimeoutInSeconds(BenchmarkTimeInSeconds); + //var exitSucces = BenchmarkHandle.WaitForExit(timeoutTime * 1000); + // don't use wait for it breaks everything + BenchmarkProcessStatus = BenchmarkProcessStatus.Running; + while(true) { + string outdata = BenchmarkHandle.StandardOutput.ReadLine(); + BenchmarkOutputErrorDataReceivedImpl(outdata); + // terminate process situations + if (BenchmarkSignalQuit + || BenchmarkSignalFinnished + || BenchmarkSignalHanged + || BenchmarkSignalTimedout + || BenchmarkException != null) { + //EndBenchmarkProcces(); + // this is safe in a benchmark + KillSGMiner(); + } + + if (BenchmarkSignalTimedout) { + throw new Exception("Benchmark timedout"); + } + if (BenchmarkException != null) { + throw BenchmarkException; + } + if (BenchmarkSignalQuit) { + throw new Exception("Termined by user request"); + } + if (BenchmarkSignalHanged) { + throw new Exception("SGMiner is not responding"); + } + if (BenchmarkSignalFinnished) { + break; + } + } + } catch (Exception ex) { + BenchmarkAlgorithm.BenchmarkSpeed = 0; + + Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); + if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { + OnBenchmarkCompleteCalled = true; + BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); + } + } finally { + BenchmarkProcessStatus = BenchmarkProcessStatus.Success; + Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); + Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); + if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { + OnBenchmarkCompleteCalled = true; + BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); + } + } + } + #endregion // Decoupled benchmarking routines // TODO _currentMinerReadStatus From db314b97e41a4a3573deb37b8ca2c9d96e1427df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 23 Nov 2016 13:39:22 +0100 Subject: [PATCH 114/366] Zcash Claymore Zcash Claymore added, dl link update, remove unused code, sgminer benchmark race condition fix --- NiceHashMiner/Configs/GeneralConfig.cs | 4 + NiceHashMiner/Enums/BenchmarkProcessStatus.cs | 1 + NiceHashMiner/Enums/Use3rdPartyMiners.cs | 13 + .../Miners/Equihash/ClaymoreZcashMiner.cs | 195 ++++- NiceHashMiner/Miners/Equihash/nheqBase.cs | 2 - NiceHashMiner/Miners/Miner.cs | 12 +- NiceHashMiner/Miners/sgminer.cs | 33 +- NiceHashMiner/NiceHashMiner.csproj | 4 +- NiceHashMiner/Utils/BINS_CODEGEN_AMD.cs | 753 ------------------ NiceHashMiner/Utils/BINS_CODEGEN_NVIDIA.cs | 23 - NiceHashMiner/Utils/BINS_CODEGEN_SHARED.cs | 57 -- NiceHashMiner/Utils/MinersDownloadManager.cs | 32 +- 12 files changed, 199 insertions(+), 930 deletions(-) create mode 100644 NiceHashMiner/Enums/Use3rdPartyMiners.cs delete mode 100644 NiceHashMiner/Utils/BINS_CODEGEN_AMD.cs delete mode 100644 NiceHashMiner/Utils/BINS_CODEGEN_NVIDIA.cs delete mode 100644 NiceHashMiner/Utils/BINS_CODEGEN_SHARED.cs diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index 1475410..5add22e 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -114,6 +114,8 @@ public int ApiBindPortPoolStart { public bool DownloadInit { get; set; } + Use3rdPartyMiners Use3rdPartyMiners { get; set; } + [JsonIgnore] public bool hwidOK { get; private set; } @@ -173,6 +175,7 @@ public void SetDefaults() { EthminerDagGenerationType = DagGenerationType.SingleKeep; DownloadInit = false; ContinueMiningIfNoInternetAccess = false; + Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; } public GeneralConfig(bool initDefaults = false) { @@ -254,6 +257,7 @@ protected override void InitializeObject() { if (!IsNewVersion) { DownloadInit = _file.DownloadInit; } + Use3rdPartyMiners = _file.Use3rdPartyMiners; hwidLoadFromFile = true; hwidOK = this.hwid == _file.hwid; diff --git a/NiceHashMiner/Enums/BenchmarkProcessStatus.cs b/NiceHashMiner/Enums/BenchmarkProcessStatus.cs index e06cbd7..1b77fa9 100644 --- a/NiceHashMiner/Enums/BenchmarkProcessStatus.cs +++ b/NiceHashMiner/Enums/BenchmarkProcessStatus.cs @@ -11,6 +11,7 @@ public enum BenchmarkProcessStatus { Running, Killing, DoneKilling, + Finished, Success } } diff --git a/NiceHashMiner/Enums/Use3rdPartyMiners.cs b/NiceHashMiner/Enums/Use3rdPartyMiners.cs new file mode 100644 index 0000000..1471169 --- /dev/null +++ b/NiceHashMiner/Enums/Use3rdPartyMiners.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Enums { + public enum Use3rdPartyMiners { + NOT_SET = 0, + NO, + YES + } +} diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 720282c..85df93e 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -1,10 +1,16 @@ -using NiceHashMiner.Enums; +using Newtonsoft.Json; +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; using NiceHashMiner.Miners.Grouping; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Globalization; +using System.IO; using System.Linq; +using System.Net.Sockets; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace NiceHashMiner.Miners { @@ -13,17 +19,33 @@ public ClaymoreZcashMiner() : base("ClaymoreZcashMiner") { Path = MinerPaths.ClaymoreZcashMiner; WorkingDirectory = MinerPaths.ClaymoreZcashMiner.Replace("ZecMiner64.exe", ""); + //Path = WorkingDirectory + "benchmark.bat"; + + IsKillAllUsedMinerProcs = true; } const int BENCHMARK_MAX_GET = 10; const string LOOK_FOR_START = "ZEC - Total Speed:"; const string LOOK_FOR_END = " H/s"; + const string LOG_FILE_NAME = "cl_log_noappend.txt"; int benchmark_read_count = 0; double benchmark_sum = 0.0d; + private class JsonApiResponse { + public List result { get; set; } + public int id { get; set; } + public object error { get; set; } + } + + public void KillZecMiner64() { + foreach (Process process in Process.GetProcessesByName("ZecMiner64")) { + try { process.Kill(); } catch (Exception e) { Helpers.ConsolePrint(MinerDeviceName, e.ToString()); } + } + } + public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); - LastCommandLine = GetDevicesCommandString() + " -mport " + APIPort + " -zpool " + url + " -zwal " + username; + LastCommandLine = "-wd 1 -colors 0 -logfile cl_log_noappend.txt " + GetDevicesCommandString() + " -mport -" + APIPort + " -zpool " + url + " -zwal " + username; ProcessHandle = _Start(); } @@ -32,52 +54,63 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { } protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - // TODO - //const string MASK = "-a {0}"; - //var oldApiBindStr = String.Format(MASK, oldPort); - //var newApiBindStr = String.Format(MASK, newPort); - //if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { - // LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - // return true; - //} + const string MASK = "-mport -{0}"; + var oldApiBindStr = String.Format(MASK, oldPort); + var newApiBindStr = String.Format(MASK, newPort); + if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { + LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); + return true; + } return false; } protected override void _Stop(MinerStopType willswitch) { - // STOP - //Stop_cpu_ccminer_sgminer_nheqminer(willswitch); + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } public override APIData GetSummary() { - // TODO _currentMinerReadStatus = MinerAPIReadStatus.NONE; APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); - //TcpClient client = null; - //JsonApiResponse resp = null; - //try { - // byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("status\n"); - // client = new TcpClient("127.0.0.1", APIPort); - // NetworkStream nwStream = client.GetStream(); - // nwStream.Write(bytesToSend, 0, bytesToSend.Length); - // byte[] bytesToRead = new byte[client.ReceiveBufferSize]; - // int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); - // string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); - // resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); - // client.Close(); - //} catch (Exception ex) { - // Helpers.ConsolePrint("ERROR", ex.Message); - //} - - //if (resp != null && resp.error == null) { - // ad.Speed = resp.result.speed_sps; - // _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; - // if (ad.Speed == 0) { - // _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; - // } - //} else if (resp == null) { - // _currentMinerReadStatus = MinerAPIReadStatus.NONE; - //} + TcpClient client = null; + JsonApiResponse resp = null; + try { + byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("{\"id\":0,\"jsonrpc\":\"2.0\",\"method\":\"miner_getstat1\"}n"); + client = new TcpClient("127.0.0.1", APIPort); + NetworkStream nwStream = client.GetStream(); + nwStream.Write(bytesToSend, 0, bytesToSend.Length); + byte[] bytesToRead = new byte[client.ReceiveBufferSize]; + int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); + string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); + resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); + client.Close(); + //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", respStr); + } catch (Exception ex) { + Helpers.ConsolePrint("ClaymoreZcashMiner", "GetSummary exception: " + ex.Message); + } + + if (resp != null && resp.error == null) { + //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "resp != null && resp.error == null"); + if (resp.result != null && resp.result.Count > 4) { + //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "resp.result != null && resp.result.Count > 4"); + var speeds = resp.result[3].Split(';'); + ad.Speed = 0; + foreach (var speed in speeds) { + //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "foreach (var speed in speeds) {"); + double tmpSpeed = 0; + try { + tmpSpeed = Double.Parse(speed, CultureInfo.InvariantCulture); + } catch { + tmpSpeed = 0; + } + ad.Speed += tmpSpeed; + } + _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + } + if (ad.Speed == 0) { + _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; + } + } return ad; } @@ -94,14 +127,97 @@ protected override string GetDevicesCommandString() { } // benchmark stuff + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - String ret = "-benchmark 1 " + GetDevicesCommandString(); + string ret = "-wd 0 -colors 0 -logfile " + LOG_FILE_NAME + " -benchmark 1 " + GetDevicesCommandString(); return ret; } protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { CheckOutdata(outdata); } + protected override void BenchmarkThreadRoutine(object CommandLine) { + Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + + BenchmarkSignalQuit = false; + BenchmarkSignalHanged = false; + BenchmarkSignalFinnished = false; + BenchmarkException = null; + + try { + Helpers.ConsolePrint("BENCHMARK", "Benchmark starts"); + BenchmarkHandle = BenchmarkStartProcess((string)CommandLine); + Stopwatch _benchmarkTimer = new Stopwatch(); + _benchmarkTimer.Reset(); + _benchmarkTimer.Start(); + //BenchmarkThreadRoutineStartSettup(); + // wait a little longer then the benchmark routine if exit false throw + //var timeoutTime = BenchmarkTimeoutInSeconds(BenchmarkTimeInSeconds); + //var exitSucces = BenchmarkHandle.WaitForExit(timeoutTime * 1000); + // don't use wait for it breaks everything + BenchmarkProcessStatus = BenchmarkProcessStatus.Running; + while (true) { + //string outdata = BenchmarkHandle.StandardOutput.ReadLine(); + //BenchmarkOutputErrorDataReceivedImpl(outdata); + // terminate process situations + if (_benchmarkTimer.Elapsed.Seconds >= 45 + 2 + || BenchmarkSignalQuit + || BenchmarkSignalFinnished + || BenchmarkSignalHanged + || BenchmarkSignalTimedout + || BenchmarkException != null) { + // maybe will have to KILL process + KillZecMiner64(); + if (BenchmarkSignalTimedout) { + throw new Exception("Benchmark timedout"); + } + if (BenchmarkException != null) { + throw BenchmarkException; + } + if (BenchmarkSignalQuit) { + throw new Exception("Termined by user request"); + } + if (BenchmarkSignalFinnished) { + break; + } + if (_benchmarkTimer.Elapsed.Seconds >= 30) { + break; + } + } + } + } catch (Exception ex) { + BenchmarkAlgorithm.BenchmarkSpeed = 0; + Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); + if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { + OnBenchmarkCompleteCalled = true; + BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); + } + } finally { + BenchmarkAlgorithm.BenchmarkSpeed = 0; + BenchmarkProcessStatus = BenchmarkProcessStatus.Finished; + // read file log + if(File.Exists(WorkingDirectory + LOG_FILE_NAME)) { + var lines = File.ReadAllLines(WorkingDirectory + LOG_FILE_NAME); + foreach (var line in lines) { + if (line != null && line.Contains(LOOK_FOR_START)) { + benchmark_sum += getNumber(line); + ++benchmark_read_count; + } + } + if (benchmark_read_count > 0) { + BenchmarkAlgorithm.BenchmarkSpeed = benchmark_sum / benchmark_read_count; + BenchmarkProcessStatus = BenchmarkProcessStatus.Success; + } + } + Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); + Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); + if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { + OnBenchmarkCompleteCalled = true; + BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); + } + } + } + double getNumber(string outdata) { try { int speedStart = outdata.IndexOf(LOOK_FOR_START); @@ -116,6 +232,7 @@ double getNumber(string outdata) { } protected override bool BenchmarkParseLine(string outdata) { + Helpers.ConsolePrint("BENCHMARK", outdata); if (outdata.Contains(LOOK_FOR_START)) { benchmark_sum += getNumber(outdata); ++benchmark_read_count; diff --git a/NiceHashMiner/Miners/Equihash/nheqBase.cs b/NiceHashMiner/Miners/Equihash/nheqBase.cs index df1b6db..063f5bd 100644 --- a/NiceHashMiner/Miners/Equihash/nheqBase.cs +++ b/NiceHashMiner/Miners/Equihash/nheqBase.cs @@ -96,8 +96,6 @@ public override APIData GetSummary() { if (ad.Speed == 0) { _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; } - } else if (resp == null) { - _currentMinerReadStatus = MinerAPIReadStatus.NONE; } return ad; diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index bae05f0..e636bea 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -56,8 +56,8 @@ public abstract class Miner { // mining algorithm stuff protected bool IsInit { get; private set; } protected MiningSetup MiningSetup { get; set; } - // sgminer workaround - protected bool IsSgminer { get; set; } + // sgminer/zcash claymore workaround + protected bool IsKillAllUsedMinerProcs { get; set; } public bool IsRunning { get; protected set; } protected string Path; protected string LastCommandLine { get; set; } @@ -79,7 +79,7 @@ public abstract class Miner { protected bool OnBenchmarkCompleteCalled = false; protected Algorithm BenchmarkAlgorithm { get; set; } public BenchmarkProcessStatus BenchmarkProcessStatus { get; protected set; } - protected string BenchmarkProcessPath { get; private set; } + protected string BenchmarkProcessPath { get; set; } protected Process BenchmarkHandle { get; set; } protected Exception BenchmarkException = null; protected int BenchmarkTimeInSeconds; @@ -123,7 +123,7 @@ public Miner(string minerDeviceName) APIPort = MinersApiPortsManager.Instance.GetAvaliablePort(); IsAPIReadException = false; IsNHLocked = false; - IsSgminer = false; + IsKillAllUsedMinerProcs = false; _MAX_CooldownTimeInMilliseconds = GET_MAX_CooldownTimeInMilliseconds(); // Helpers.ConsolePrint(MinerTAG(), "NEW MINER CREATED"); @@ -246,7 +246,7 @@ protected void Stop_cpu_ccminer_sgminer_nheqminer(MinerStopType willswitch) { ProcessHandle = null; // sgminer needs to be removed and kill by PID - if (IsSgminer) KillAllUsedMinerProcesses(); + if (IsKillAllUsedMinerProcs) KillAllUsedMinerProcesses(); } } @@ -593,7 +593,7 @@ protected string GetAPIData(int port, string cmd) "User-Agent: NiceHashMiner/" + Application.ProductVersion + "\r\n" + "\r\n"; - if (IsSgminer) + if (IsKillAllUsedMinerProcs) DataToSend = cmd; byte[] BytesToSend = ASCIIEncoding.ASCII.GetBytes(DataToSend); diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 10ce3e5..c892c02 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -29,7 +29,7 @@ public sgminer() { Path = MinerPaths.sgminer_5_5_0_general; GPUPlatformNumber = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; - IsSgminer = true; + IsKillAllUsedMinerProcs = true; } // use ONLY for exiting a benchmark @@ -234,22 +234,21 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { //EndBenchmarkProcces(); // this is safe in a benchmark KillSGMiner(); - } - - if (BenchmarkSignalTimedout) { - throw new Exception("Benchmark timedout"); - } - if (BenchmarkException != null) { - throw BenchmarkException; - } - if (BenchmarkSignalQuit) { - throw new Exception("Termined by user request"); - } - if (BenchmarkSignalHanged) { - throw new Exception("SGMiner is not responding"); - } - if (BenchmarkSignalFinnished) { - break; + if (BenchmarkSignalTimedout) { + throw new Exception("Benchmark timedout"); + } + if (BenchmarkException != null) { + throw BenchmarkException; + } + if (BenchmarkSignalQuit) { + throw new Exception("Termined by user request"); + } + if (BenchmarkSignalHanged) { + throw new Exception("SGMiner is not responding"); + } + if (BenchmarkSignalFinnished) { + break; + } } } } catch (Exception ex) { diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 7d7040c..c8be22e 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -109,6 +109,7 @@ + UserControl @@ -243,9 +244,6 @@ - - - diff --git a/NiceHashMiner/Utils/BINS_CODEGEN_AMD.cs b/NiceHashMiner/Utils/BINS_CODEGEN_AMD.cs deleted file mode 100644 index e44722b..0000000 --- a/NiceHashMiner/Utils/BINS_CODEGEN_AMD.cs +++ /dev/null @@ -1,753 +0,0 @@ - -namespace NiceHashMiner.Utils { - public partial class MinersDownloadManager : BaseLazySingleton { - #region CODE_GEN STUFF // listFiles.py -private static string[] ALL_FILES_BINS_AMD = { - -@"\amd\sgminer-5-1-0-optimized\darkcoin-modHawaiigw64l4.bin", - -@"\amd\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4.bin", - -@"\amd\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\darkcoin-modTahitigw64l4.bin", - -@"\amd\sgminer-5-1-0-optimized\darkcoin-modTongagw64l4.bin", - -@"\amd\sgminer-5-1-0-optimized\libcurl-4.dll", - -@"\amd\sgminer-5-1-0-optimized\libcurl.dll", - -@"\amd\sgminer-5-1-0-optimized\libeay32.dll", - -@"\amd\sgminer-5-1-0-optimized\libgcc_s_dw2-1.dll", - -@"\amd\sgminer-5-1-0-optimized\libidn-11.dll", - -@"\amd\sgminer-5-1-0-optimized\libpdcurses.dll", - -@"\amd\sgminer-5-1-0-optimized\Lyra2REv2Hawaiigw64l4.bin", - -@"\amd\sgminer-5-1-0-optimized\Lyra2REv2Pitcairngw64l4.bin", - -@"\amd\sgminer-5-1-0-optimized\Lyra2REv2Tahitigw64l4.bin", - -@"\amd\sgminer-5-1-0-optimized\Lyra2REv2Tongagw64l4.bin", - -@"\amd\sgminer-5-1-0-optimized\pthreadGC2.dll", - -@"\amd\sgminer-5-1-0-optimized\quarkcoinHawaiigw256l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\quarkcoinHawaiigw64l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\quarkcoinPitcairngw256l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\quarkcoinPitcairngw64l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\quarkcoinTahitigw256l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\quarkcoinTahitigw64l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\quarkcoinTongagw256l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\quarkcoinTongagw64l4ku0.bin", - -@"\amd\sgminer-5-1-0-optimized\runme.bat", - -@"\amd\sgminer-5-1-0-optimized\sgminer-fixed.conf", - -@"\amd\sgminer-5-1-0-optimized\sgminer.exe", - -@"\amd\sgminer-5-1-0-optimized\ssleay32.dll", - -@"\amd\sgminer-5-1-0-optimized\zlib1.dll", - -@"\amd\sgminer-5-1-0-optimized\kernel\aes_helper.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\alexkarnew.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\alexkarold.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\animecoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\arebyp.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\bitblock.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\bitblockold.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\blake.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\blake256.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\bmw.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\bmw256.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\bufius.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\ckolivas.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\credits.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\cubehash.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\cubehash256.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\darkcoin-mod.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\darkcoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\diamond.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\echo.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\fresh.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\fugue.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\fuguecoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\groestl.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\groestl256.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\groestlcoin-v1.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\groestlcoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\hamsi.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\hamsi_helper.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\hamsi_helper_big.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\inkcoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\jh.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\keccak.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\keccak1600.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\luffa.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\Lyra2.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\Lyra2RE.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\Lyra2REv2.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\Lyra2v2.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\marucoin-mod.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\marucoin-modold.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\marucoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\maxcoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\myriadcoin-groestl.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\neoscrypt.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\panama.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\pluck.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\psw.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\quarkcoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\qubitcoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\shabal.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\shavite.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\sifcoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\simd.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\skein.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\skein256.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\talkcoin-mod.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\twecoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\whirlcoin.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\whirlpool.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\x14.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\x14old.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\yescrypt-multi.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\yescrypt.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\yescrypt_essential.cl", - -@"\amd\sgminer-5-1-0-optimized\kernel\zuikkis.cl", - -@"\amd\sgminer-5-1-1-optimized\darkcoin-modHawaiigw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\darkcoin-modPitcairngw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\darkcoin-modTahitigw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\darkcoin-modTongagw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\libcurl.dll", - -@"\amd\sgminer-5-1-1-optimized\libeay32.dll", - -@"\amd\sgminer-5-1-1-optimized\libgcc_s_dw2-1.dll", - -@"\amd\sgminer-5-1-1-optimized\libidn-11.dll", - -@"\amd\sgminer-5-1-1-optimized\libpdcurses.dll", - -@"\amd\sgminer-5-1-1-optimized\pthreadGC2.dll", - -@"\amd\sgminer-5-1-1-optimized\quarkcoinHawaiigw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\quarkcoinPitcairngw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\quarkcoinTahitigw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\quarkcoinTongagw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\qubitcoinHawaiigw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\qubitcoinPitcairngw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\qubitcoinTahitigw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\qubitcoinTongagw64l4ku0.bin", - -@"\amd\sgminer-5-1-1-optimized\runme.bat", - -@"\amd\sgminer-5-1-1-optimized\sgminer-fixed.conf", - -@"\amd\sgminer-5-1-1-optimized\sgminer.exe", - -@"\amd\sgminer-5-1-1-optimized\ssleay32.dll", - -@"\amd\sgminer-5-1-1-optimized\zlib1.dll", - -@"\amd\sgminer-5-1-1-optimized\kernel\aes_helper.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\alexkarnew.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\alexkarold.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\animecoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\arebyp.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\bitblock.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\bitblockold.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\blake.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\blake256.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\bmw.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\bufius.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\ckolivas.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\cubehash.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\darkcoin-mod.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\darkcoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\diamond.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\echo.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\fresh.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\fugue.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\fuguecoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\groestl.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\groestl256.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\groestlcoin-v1.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\groestlcoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\hamsi.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\hamsi_helper.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\hamsi_helper_big.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\inkcoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\jh.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\keccak.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\keccak1600.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\luffa.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\lyra2.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\lyra2re.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\marucoin-mod.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\marucoin-modold.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\marucoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\maxcoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\myriadcoin-groestl.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\neoscrypt.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\panama.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\pluck.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\psw.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\quarkcoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\qubitcoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\shabal.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\shavite.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\sifcoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\simd.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\skein.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\skein256.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\talkcoin-mod.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\twecoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\whirlcoin.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\whirlpool.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\whirlpoolx.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\x14.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\x14old.cl", - -@"\amd\sgminer-5-1-1-optimized\kernel\zuikkis.cl", - -@"\amd\sgminer-5-4-0-general\bitblockFijigw64l4ku0big4.bin", - -@"\amd\sgminer-5-4-0-general\bitblockHawaiigw64l4ku0big4.bin", - -@"\amd\sgminer-5-4-0-general\bitblockTongagw64l4ku0big4.bin", - -@"\amd\sgminer-5-4-0-general\blake256r8Fijigw128l4.bin", - -@"\amd\sgminer-5-4-0-general\blake256r8Hawaiigw128l4.bin", - -@"\amd\sgminer-5-4-0-general\blake256r8Tongagw128l4.bin", - -@"\amd\sgminer-5-4-0-general\decredFijigw64l4tc24512.bin", - -@"\amd\sgminer-5-4-0-general\decredHawaiigw64l4tc24512.bin", - -@"\amd\sgminer-5-4-0-general\decredTongagw64l4tc24512.bin", - -@"\amd\sgminer-5-4-0-general\marucoin-modFijigw64l4ku0big4.bin", - -@"\amd\sgminer-5-4-0-general\marucoin-modHawaiigw64l4ku0big4.bin", - -@"\amd\sgminer-5-4-0-general\marucoin-modTongagw64l4ku0big4.bin", - -@"\amd\sgminer-5-4-0-general\maxcoinFijigw64l4.bin", - -@"\amd\sgminer-5-4-0-general\maxcoinHawaiigw64l4.bin", - -@"\amd\sgminer-5-4-0-general\maxcoinTongagw64l4.bin", - -@"\amd\sgminer-5-4-0-general\neoscryptFijigw64l4lgtc8192.bin", - -@"\amd\sgminer-5-4-0-general\neoscryptHawaiigw64l4lgtc8192.bin", - -@"\amd\sgminer-5-4-0-general\neoscryptTongagw64l4lgtc8192.bin", - -@"\amd\sgminer-5-4-0-general\runme.bat", - -@"\amd\sgminer-5-4-0-general\sgminer-fixed.conf", - -@"\amd\sgminer-5-4-0-general\sgminer.exe", - -@"\amd\sgminer-5-4-0-general\talkcoin-modFijigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-general\talkcoin-modHawaiigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-general\talkcoin-modTongagw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-general\vanillaFijigw128l4.bin", - -@"\amd\sgminer-5-4-0-general\vanillaHawaiigw128l4.bin", - -@"\amd\sgminer-5-4-0-general\vanillaTongagw128l4.bin", - -@"\amd\sgminer-5-4-0-general\kernel\aes_helper.cl", - -@"\amd\sgminer-5-4-0-general\kernel\alexkarnew.cl", - -@"\amd\sgminer-5-4-0-general\kernel\alexkarold.cl", - -@"\amd\sgminer-5-4-0-general\kernel\animecoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\arebyp.cl", - -@"\amd\sgminer-5-4-0-general\kernel\bitblock.cl", - -@"\amd\sgminer-5-4-0-general\kernel\bitblockold.cl", - -@"\amd\sgminer-5-4-0-general\kernel\blake.cl", - -@"\amd\sgminer-5-4-0-general\kernel\blake256.cl", - -@"\amd\sgminer-5-4-0-general\kernel\blake256r14.cl", - -@"\amd\sgminer-5-4-0-general\kernel\blake256r8.cl", - -@"\amd\sgminer-5-4-0-general\kernel\bmw.cl", - -@"\amd\sgminer-5-4-0-general\kernel\bmw256.cl", - -@"\amd\sgminer-5-4-0-general\kernel\bufius.cl", - -@"\amd\sgminer-5-4-0-general\kernel\ckolivas.cl", - -@"\amd\sgminer-5-4-0-general\kernel\credits.cl", - -@"\amd\sgminer-5-4-0-general\kernel\cubehash.cl", - -@"\amd\sgminer-5-4-0-general\kernel\cubehash256.cl", - -@"\amd\sgminer-5-4-0-general\kernel\darkcoin-mod.cl", - -@"\amd\sgminer-5-4-0-general\kernel\darkcoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\decred.cl", - -@"\amd\sgminer-5-4-0-general\kernel\diamond.cl", - -@"\amd\sgminer-5-4-0-general\kernel\echo.cl", - -@"\amd\sgminer-5-4-0-general\kernel\fresh.cl", - -@"\amd\sgminer-5-4-0-general\kernel\fugue.cl", - -@"\amd\sgminer-5-4-0-general\kernel\fuguecoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\groestl.cl", - -@"\amd\sgminer-5-4-0-general\kernel\groestl256.cl", - -@"\amd\sgminer-5-4-0-general\kernel\groestlcoin-v1.cl", - -@"\amd\sgminer-5-4-0-general\kernel\groestlcoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\hamsi.cl", - -@"\amd\sgminer-5-4-0-general\kernel\hamsi_helper.cl", - -@"\amd\sgminer-5-4-0-general\kernel\hamsi_helper_big.cl", - -@"\amd\sgminer-5-4-0-general\kernel\inkcoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\jh.cl", - -@"\amd\sgminer-5-4-0-general\kernel\keccak.cl", - -@"\amd\sgminer-5-4-0-general\kernel\keccak1600.cl", - -@"\amd\sgminer-5-4-0-general\kernel\luffa.cl", - -@"\amd\sgminer-5-4-0-general\kernel\lyra2.cl", - -@"\amd\sgminer-5-4-0-general\kernel\lyra2re.cl", - -@"\amd\sgminer-5-4-0-general\kernel\lyra2rev2.cl", - -@"\amd\sgminer-5-4-0-general\kernel\lyra2v2.cl", - -@"\amd\sgminer-5-4-0-general\kernel\marucoin-mod.cl", - -@"\amd\sgminer-5-4-0-general\kernel\marucoin-modold.cl", - -@"\amd\sgminer-5-4-0-general\kernel\marucoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\maxcoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\myriadcoin-groestl.cl", - -@"\amd\sgminer-5-4-0-general\kernel\neoscrypt.cl", - -@"\amd\sgminer-5-4-0-general\kernel\panama.cl", - -@"\amd\sgminer-5-4-0-general\kernel\pluck.cl", - -@"\amd\sgminer-5-4-0-general\kernel\psw.cl", - -@"\amd\sgminer-5-4-0-general\kernel\quarkcoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\qubitcoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\shabal.cl", - -@"\amd\sgminer-5-4-0-general\kernel\shavite.cl", - -@"\amd\sgminer-5-4-0-general\kernel\sifcoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\simd.cl", - -@"\amd\sgminer-5-4-0-general\kernel\skein.cl", - -@"\amd\sgminer-5-4-0-general\kernel\skein256.cl", - -@"\amd\sgminer-5-4-0-general\kernel\talkcoin-mod.cl", - -@"\amd\sgminer-5-4-0-general\kernel\twecoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\vanilla.cl", - -@"\amd\sgminer-5-4-0-general\kernel\whirlcoin.cl", - -@"\amd\sgminer-5-4-0-general\kernel\whirlpool.cl", - -@"\amd\sgminer-5-4-0-general\kernel\whirlpoolx.cl", - -@"\amd\sgminer-5-4-0-general\kernel\x14.cl", - -@"\amd\sgminer-5-4-0-general\kernel\x14old.cl", - -@"\amd\sgminer-5-4-0-general\kernel\yescrypt-multi.cl", - -@"\amd\sgminer-5-4-0-general\kernel\yescrypt.cl", - -@"\amd\sgminer-5-4-0-general\kernel\yescrypt_essential.cl", - -@"\amd\sgminer-5-4-0-general\kernel\zuikkis.cl", - -@"\amd\sgminer-5-4-0-tweaked\darkcoin-modBonairegw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\darkcoin-modFijigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\darkcoin-modHawaiigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\darkcoin-modPitcairngw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\darkcoin-modTahitigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\darkcoin-modTongagw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\lyra2rev2Bonairegw64l4.bin", - -@"\amd\sgminer-5-4-0-tweaked\lyra2rev2Fijigw64l4.bin", - -@"\amd\sgminer-5-4-0-tweaked\lyra2rev2Hawaiigw64l4.bin", - -@"\amd\sgminer-5-4-0-tweaked\lyra2rev2Pitcairngw64l4.bin", - -@"\amd\sgminer-5-4-0-tweaked\lyra2rev2Tahitigw64l4.bin", - -@"\amd\sgminer-5-4-0-tweaked\lyra2rev2Tongagw64l4.bin", - -@"\amd\sgminer-5-4-0-tweaked\quarkcoinBonairegw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\quarkcoinFijigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\quarkcoinHawaiigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\quarkcoinPitcairngw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\quarkcoinTahitigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\quarkcoinTongagw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\qubitcoinBonairegw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\qubitcoinFijigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\qubitcoinHawaiigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\qubitcoinPitcairngw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\qubitcoinTahitigw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\qubitcoinTongagw64l4ku0.bin", - -@"\amd\sgminer-5-4-0-tweaked\sgminer.exe", - -@"\amd\sgminer-5-4-0-tweaked\kernel\aes_helper.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\alexkarnew.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\alexkarold.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\animecoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\arebyp.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\bitblock.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\bitblockold.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\blake.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\blake256.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\blake256r14.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\blake256r8.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\bmw.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\bmw256.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\bufius.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\ckolivas.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\credits.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\cubehash.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\cubehash256.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\darkcoin-mod.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\darkcoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\decred.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\diamond.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\echo.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\fresh.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\fugue.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\fuguecoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\groestl.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\groestl256.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\groestlcoin-v1.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\groestlcoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\hamsi.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\hamsi_helper.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\hamsi_helper_big.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\inkcoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\jh.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\keccak.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\keccak1600.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\luffa.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\lyra2.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\lyra2re.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\lyra2rev2.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\lyra2v2.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\marucoin-mod.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\marucoin-modold.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\marucoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\maxcoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\myriadcoin-groestl.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\neoscrypt.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\panama.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\pluck.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\psw.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\quarkcoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\qubitcoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\shabal.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\shavite.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\sifcoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\simd.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\skein.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\skein256.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\talkcoin-mod.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\twecoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\vanilla.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\whirlcoin.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\whirlpool.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\whirlpoolx.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\x14.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\x14old.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\yescrypt-multi.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\yescrypt.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\yescrypt_essential.cl", - -@"\amd\sgminer-5-4-0-tweaked\kernel\zuikkis.cl", - -}; -#endregion //CODE_GEN STUFF // listFiles.py -} -} - diff --git a/NiceHashMiner/Utils/BINS_CODEGEN_NVIDIA.cs b/NiceHashMiner/Utils/BINS_CODEGEN_NVIDIA.cs deleted file mode 100644 index b1af0ba..0000000 --- a/NiceHashMiner/Utils/BINS_CODEGEN_NVIDIA.cs +++ /dev/null @@ -1,23 +0,0 @@ - -namespace NiceHashMiner.Utils { - public partial class MinersDownloadManager : BaseLazySingleton { - #region CODE_GEN STUFF // listFiles.py -private static string[] ALL_FILES_BINS_NVIDIA = { - -@"\nvidia\ccminer_cryptonight.exe", - -@"\nvidia\ccminer_decred.exe", - -@"\nvidia\ccminer_nanashi.exe", - -@"\nvidia\ccminer_neoscrypt.exe", - -@"\nvidia\ccminer_sp.exe", - -@"\nvidia\ccminer_tpruvot.exe", - -}; -#endregion //CODE_GEN STUFF // listFiles.py -} -} - diff --git a/NiceHashMiner/Utils/BINS_CODEGEN_SHARED.cs b/NiceHashMiner/Utils/BINS_CODEGEN_SHARED.cs deleted file mode 100644 index a801d67..0000000 --- a/NiceHashMiner/Utils/BINS_CODEGEN_SHARED.cs +++ /dev/null @@ -1,57 +0,0 @@ - -namespace NiceHashMiner.Utils { - public partial class MinersDownloadManager : BaseLazySingleton { - #region CODE_GEN STUFF // listFiles.py -private static string[] ALL_FILES_BINS_SHARED = { - -@"\cpu\cpuminer_opt_AVX.exe", - -@"\cpu\cpuminer_opt_AVX2.exe", - -@"\cpu\cpuminer_opt_SSE2.exe", - -@"\dlls\cudart32_80.dll", - -@"\dlls\cudart64_80.dll", - -@"\dlls\libcrypto-1.0.0.dll", - -@"\dlls\libcurl-4.dll", - -@"\dlls\libcurl.dll", - -@"\dlls\libgcc_s_seh-1.dll", - -@"\dlls\libgmp-10.dll", - -@"\dlls\libgmpxx-4.dll", - -@"\dlls\libjansson-4.dll", - -@"\dlls\libjson-c-2.dll", - -@"\dlls\libmicrohttpd-dll.dll", - -@"\dlls\libsigc-2.0-0.dll", - -@"\dlls\libssl-1.0.0.dll", - -@"\dlls\libstdc++-6.dll", - -@"\dlls\libwinpthread-1.dll", - -@"\dlls\libz-1.dll", - -@"\dlls\msvcr120.dll", - -@"\dlls\OpenCL.dll", - -@"\dlls\zlib1.dll", - -@"\shared\ethminer.exe", - -}; -#endregion //CODE_GEN STUFF // listFiles.py -} -} - diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 0760f38..d9c80fe 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -22,8 +22,8 @@ public partial class MinersDownloadManager : BaseLazySingleton Date: Wed, 23 Nov 2016 14:47:01 +0100 Subject: [PATCH 115/366] redo downloading classes, added 3rdparty separate downloading 3rdparty configs TODO --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 2 +- NiceHashMiner/Forms/Form_Loading.cs | 16 +- NiceHashMiner/Forms/Form_Main.cs | 95 ++++++--- NiceHashMiner/Miners/MinersManager.cs | 6 +- NiceHashMiner/NiceHashMiner.csproj | 3 + NiceHashMiner/Utils/BINS_CODEGEN.cs | 4 +- NiceHashMiner/Utils/DownloadSetup.cs | 18 ++ NiceHashMiner/Utils/MinersDownloadManager.cs | 180 ++---------------- NiceHashMiner/Utils/MinersDownloader.cs | 169 ++++++++++++++++ NiceHashMiner/Utils/MinersExistanceChecker.cs | 24 +++ 10 files changed, 305 insertions(+), 212 deletions(-) create mode 100644 NiceHashMiner/Utils/DownloadSetup.cs create mode 100644 NiceHashMiner/Utils/MinersDownloader.cs create mode 100644 NiceHashMiner/Utils/MinersExistanceChecker.cs diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index c826275..56884c9 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -519,7 +519,7 @@ static public void QueryAMD() { Helpers.ConsolePrint(TAG, "WARNING!!! Old AMD GPU driver detected! All optimized versions disabled, mining " + "speed will not be optimal. Consider upgrading AMD GPU driver. Recommended AMD GPU driver version is 15.7.1."); } else if (AMDDriverVersion.Major == 16 && AMDDriverVersion.Minor >= 150) { - if (MinersDownloadManager.Instance.IsMinerBinFolder()) { + if (MinersDownloadManager.IsMinerBinFolder()) { // TODO why this copy? string src = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\" + minerPath.Split('\\')[0] + "\\" + minerPath.Split('\\')[1] + "\\kernel"; diff --git a/NiceHashMiner/Forms/Form_Loading.cs b/NiceHashMiner/Forms/Form_Loading.cs index 65d75d3..28a2f76 100644 --- a/NiceHashMiner/Forms/Form_Loading.cs +++ b/NiceHashMiner/Forms/Form_Loading.cs @@ -20,6 +20,7 @@ public interface IAfterInitializationCaller { private int TotalLoadSteps = 12; private readonly IAfterInitializationCaller AfterInitCaller; + // init loading stuff public Form_Loading(IAfterInitializationCaller initCaller, string loadFormTitle, string startInfoMsg, int totalLoadSteps) { InitializeComponent(); @@ -36,11 +37,12 @@ public Form_Loading(IAfterInitializationCaller initCaller, string loadFormTitle, SetInfoMsg(startInfoMsg); } - // download miners - public Form_Loading() { + // download miners constructor + MinersDownloader _minersDownloader = null; + public Form_Loading(MinersDownloader minersDownloader) { InitializeComponent(); label_LoadingText.Location = new Point((this.Size.Width - label_LoadingText.Size.Width) / 2, label_LoadingText.Location.Y); - _startMinersInitLogic = true; + _minersDownloader = minersDownloader; } public void IncreaseLoadCounterAndMessage(string infoMsg) { @@ -117,7 +119,7 @@ public void SetTitle(string title) { }); } - public void FinishMsg(bool success) { + public void FinishMsg(bool ok) { this.Invoke((MethodInvoker)delegate { //if (success) { // label_LoadingText.Text = "Init Finished!"; @@ -131,10 +133,10 @@ public void FinishMsg(bool success) { #endregion IMinerUpdateIndicator - bool _startMinersInitLogic = false; + private void Form_Loading_Shown(object sender, EventArgs e) { - if (_startMinersInitLogic) { - MinersDownloadManager.Instance.Start(this); + if (_minersDownloader != null) { + _minersDownloader.Start(this); } } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index c5f2bbd..22c2197 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -43,7 +43,8 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, private Random R; - private Form_Loading _downloadUnzipForm; + //private Form_Loading _downloadUnzipForm; + //private Form_Loading _download3rdPartyUnzipForm; private Form_Loading LoadingScreen; private Form BenchmarkForm; @@ -174,8 +175,7 @@ private void IdleCheck_Tick(object sender, EventArgs e) } // This is a single shot _benchmarkTimer - private void StartupTimer_Tick(object sender, EventArgs e) - { + private void StartupTimer_Tick(object sender, EventArgs e) { StartupTimer.Stop(); StartupTimer = null; @@ -209,7 +209,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) /////// from here on we have our devices and Miners initialized ConfigManager.Instance.AfterDeviceQueryInitialization(); LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SaveConfig")); - + // All devices settup should be initialized in AllDevices devicesListViewEnableControl1.ResetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); // set properties after @@ -272,15 +272,13 @@ private void StartupTimer_Tick(object sender, EventArgs e) SetEnvironmentVariables(); LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetWindowsErrorReporting")); - + Helpers.DisableWindowsErrorReporting(ConfigManager.Instance.GeneralConfig.DisableWindowsErrorReporting); LoadingScreen.IncreaseLoadCounter(); - if (ConfigManager.Instance.GeneralConfig.NVIDIAP0State) - { + if (ConfigManager.Instance.GeneralConfig.NVIDIAP0State) { LoadingScreen.SetInfoMsg(International.GetText("Form_Main_loadtext_NVIDIAP0State")); - try - { + try { ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "nvidiasetp0state.exe"; psi.Verb = "runas"; @@ -292,36 +290,73 @@ private void StartupTimer_Tick(object sender, EventArgs e) Helpers.ConsolePrint("NICEHASH", "nvidiasetp0state returned error code: " + p.ExitCode.ToString()); else Helpers.ConsolePrint("NICEHASH", "nvidiasetp0state all OK"); - } - catch (Exception ex) - { + } catch (Exception ex) { Helpers.ConsolePrint("NICEHASH", "nvidiasetp0state error: " + ex.Message); } } LoadingScreen.FinishLoad(); - // check if download needed - if (!MinersDownloadManager.Instance.IsMinersBinsInit() && !ConfigManager.Instance.GeneralConfig.DownloadInit) { - _downloadUnzipForm = new Form_Loading(); - SetChildFormCenter(_downloadUnzipForm); - _downloadUnzipForm.ShowDialog(); - } - // check if files are mising - if (!MinersDownloadManager.Instance.IsMinersBinsInit()) { - var result = MessageBox.Show(International.GetText("Form_Main_bins_folder_files_missing"), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (result == DialogResult.Yes) { - ConfigManager.Instance.GeneralConfig.DownloadInit = false; + // standard miners check scope + { + // check if download needed + if (!MinersExistanceChecker.IsMinersBinsInit() && !ConfigManager.Instance.GeneralConfig.DownloadInit) { + Form_Loading downloadUnzipForm = new Form_Loading(new MinersDownloader(MinersDownloadManager.StandardDlSetup)); + SetChildFormCenter(downloadUnzipForm); + downloadUnzipForm.ShowDialog(); + } + // check if files are mising + if (!MinersExistanceChecker.IsMinersBinsInit()) { + var result = MessageBox.Show(International.GetText("Form_Main_bins_folder_files_missing"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (result == DialogResult.Yes) { + ConfigManager.Instance.GeneralConfig.DownloadInit = false; + ConfigManager.Instance.GeneralConfig.Commit(); + Process PHandle = new Process(); + PHandle.StartInfo.FileName = Application.ExecutablePath; + PHandle.Start(); + Close(); + return; + } + } else { + // all good + ConfigManager.Instance.GeneralConfig.DownloadInit = true; ConfigManager.Instance.GeneralConfig.Commit(); - Process PHandle = new Process(); - PHandle.StartInfo.FileName = Application.ExecutablePath; - PHandle.Start(); - Close(); - return; } } + // 3rdparty miners check scope + { + // + // check if download needed + if ( + //!MinersExistanceChecker.IsMinersBinsInit() && !ConfigManager.Instance.GeneralConfig.DownloadInit + true + ) { + Form_Loading download3rdPartyUnzipForm = new Form_Loading(new MinersDownloader(MinersDownloadManager.ThirdPartyDlSetup)); + SetChildFormCenter(download3rdPartyUnzipForm); + download3rdPartyUnzipForm.ShowDialog(); + } + // check if files are mising + //if (!MinersExistanceChecker.IsMinersBinsInit()) { + // var result = MessageBox.Show(International.GetText("Form_Main_bins_folder_files_missing"), + // International.GetText("Warning_with_Exclamation"), + // MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + // if (result == DialogResult.Yes) { + // ConfigManager.Instance.GeneralConfig.DownloadInit = false; + // ConfigManager.Instance.GeneralConfig.Commit(); + // Process PHandle = new Process(); + // PHandle.StartInfo.FileName = Application.ExecutablePath; + // PHandle.Start(); + // Close(); + // return; + // } + //} else { + // // all good + // ConfigManager.Instance.GeneralConfig.DownloadInit = true; + // ConfigManager.Instance.GeneralConfig.Commit(); + //} + } // no bots please if (ConfigManager.Instance.GeneralConfig.hwidLoadFromFile && !ConfigManager.Instance.GeneralConfig.hwidOK) { diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index eca288b..75cf2ff 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -94,11 +94,7 @@ public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication /// /// SwichMostProfitable should check the best combination for most profit. - /// Calculate profit for each supported algorithm per device group. - /// Build from ground up compatible devices and algorithms. - /// See #region Groupping logic - /// Device groups are CPU, AMD_OpenCL and NVIDIA CUDA SM.x.x. - /// NVIDIA SMx.x should be paired separately except for daggerhashimoto. + /// Calculate profit for each supported algorithm per device and group. /// /// public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData) { diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index c8be22e..fe9e465 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -245,7 +245,10 @@ + + + AlgorithmsListView.cs Designer diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index 7cadbc4..b1837b8 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -1,8 +1,8 @@ namespace NiceHashMiner.Utils { - public partial class MinersDownloadManager : BaseLazySingleton { + public static class Bins_Data { #region CODE_GEN STUFF // listFiles.py -private static string[] ALL_FILES_BINS = { +public static string[] ALL_FILES_BINS = { @"\ccminer_cryptonight.exe", @"\ccminer_decred.exe", @"\ccminer_nanashi.exe", diff --git a/NiceHashMiner/Utils/DownloadSetup.cs b/NiceHashMiner/Utils/DownloadSetup.cs new file mode 100644 index 0000000..5761bb3 --- /dev/null +++ b/NiceHashMiner/Utils/DownloadSetup.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Utils { + public class DownloadSetup { + public DownloadSetup(string url, string dlName, string inFolderName) { + BinsDownloadURL = url; + BinsZipLocation = dlName; + ZipedFolderName = inFolderName; + } + public readonly string BinsDownloadURL; + public readonly string BinsZipLocation; + public readonly string ZipedFolderName; + } +} diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index d9c80fe..43eb290 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,178 +15,24 @@ using NiceHashMiner.Devices; namespace NiceHashMiner.Utils { - public partial class MinersDownloadManager : BaseLazySingleton { + public static class MinersDownloadManager { + public static DownloadSetup StandardDlSetup = new DownloadSetup( + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_6.zip", + "bins.zip", + "bin"); - private readonly string TAG; - - private WebClient _webClient; - private Stopwatch _stopwatch; - - const string d_v1_7_3_6 = "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_6.zip"; - public string BinsDownloadURL = d_v1_7_3_6; - public string BinsZipLocation = "bins.zip"; - - bool isDownloadSizeInit = false; - - IMinerUpdateIndicator _minerUpdateIndicator; - - protected MinersDownloadManager() { - TAG = this.GetType().Name; - } - - public void Start(IMinerUpdateIndicator minerUpdateIndicator) { - _minerUpdateIndicator = minerUpdateIndicator; - - // if something not right delete previous and download new - try { - if (File.Exists(BinsZipLocation)) { - File.Delete(BinsZipLocation); - } - if (Directory.Exists("bin")) { - Directory.Delete("bin", true); - } - } catch { } - Downlaod(); - } + public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_3_6.zip", + "bins_3rdparty.zip", + "bin_3rdparty"); // #1 check if miners exits - public bool IsMinerBinFolder() { - return Directory.Exists("bin"); - } - - bool IsMinerBinZip() { - return File.Exists(BinsZipLocation); - } - - // #2 download the file - private void Downlaod() { - _minerUpdateIndicator.SetTitle(International.GetText("MinersDownloadManager_Title_Downloading")); - _stopwatch = new Stopwatch(); - using (_webClient = new WebClient()) { - _webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); - _webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted); - - Uri downloadURL = new Uri(BinsDownloadURL); - - _stopwatch.Start(); - try { - _webClient.DownloadFileAsync(downloadURL, BinsZipLocation); - } catch (Exception ex) { - Helpers.ConsolePrint("MinersDownloadManager", ex.Message); - } - } - } - - #region Download delegates - - private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { - if (!isDownloadSizeInit) { - isDownloadSizeInit = true; - _minerUpdateIndicator.SetMaxProgressValue((int)(e.TotalBytesToReceive / 1024)); - } - - // Calculate download speed and output it to labelSpeed. - var speedString = string.Format("{0} kb/s", (e.BytesReceived / 1024d / _stopwatch.Elapsed.TotalSeconds).ToString("0.00")); - - // Show the percentage on our label. - var percString = e.ProgressPercentage.ToString() + "%"; - - // Update the label with how much data have been downloaded so far and the total size of the file we are currently downloading - var labelDownloaded = string.Format("{0} MB / {1} MB", - (e.BytesReceived / 1024d / 1024d).ToString("0.00"), - (e.TotalBytesToReceive / 1024d / 1024d).ToString("0.00")); - - _minerUpdateIndicator.SetProgressValueAndMsg( - (int)(e.BytesReceived / 1024d), - String.Format("{0} {1} {2}", speedString, percString,labelDownloaded)); - - } - - // The event that will trigger when the WebClient is completed - private void DownloadCompleted(object sender, AsyncCompletedEventArgs e) { - _stopwatch.Stop(); - _stopwatch = null; - - if (e.Cancelled == true) { - // TODO handle Cancelled - Helpers.ConsolePrint(TAG, "DownloadCompleted Cancelled"); - } else { - // TODO handle Success - Helpers.ConsolePrint(TAG, "DownloadCompleted Success"); - // wait one second for binary to exist - System.Threading.Thread.Sleep(1000); - // extra check dirty - int try_count = 50; - while (!File.Exists(BinsZipLocation) && try_count > 0) { --try_count; } - - UnzipStart(); - } - } - - #endregion Download delegates - - - private void UnzipStart() { - _minerUpdateIndicator.SetTitle(International.GetText("MinersDownloadManager_Title_Settup")); - Thread BenchmarkThread = new Thread(UnzipThreadRoutine); - BenchmarkThread.Start(); - } - - private void UnzipThreadRoutine() { - if (File.Exists(BinsZipLocation)) { - Helpers.ConsolePrint(TAG, BinsZipLocation + " already downloaded"); - Helpers.ConsolePrint(TAG, "unzipping"); - using (ZipArchive archive = ZipFile.Open(BinsZipLocation, ZipArchiveMode.Read)) { - //archive.ExtractToDirectory("bin"); - _minerUpdateIndicator.SetMaxProgressValue(archive.Entries.Count); - int prog = 0; - // first create dirs - foreach (ZipArchiveEntry entry in archive.Entries) { - if (entry.Length == 0) { - Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); - Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); - Directory.CreateDirectory(entry.FullName); - _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); - } - } - // unzip files - foreach (ZipArchiveEntry entry in archive.Entries) { - if (entry.Length > 0) { - Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); - Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); - entry.ExtractToFile(entry.FullName); - _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); - } - } - } - // after unzip stuff - ConfigManager.Instance.GeneralConfig.DownloadInit = true; - ConfigManager.Instance.GeneralConfig.Commit(); - _minerUpdateIndicator.FinishMsg(IsMinersBinsInit()); - // remove bins zip - try { - if (File.Exists(BinsZipLocation)) { - File.Delete(BinsZipLocation); - } - } catch { } - } else { - Helpers.ConsolePrint(TAG, "UnzipThreadRoutine bin.zip file not found"); - } - } - - - public bool IsMinersBins_ALL_Init() { - foreach (var filePath in ALL_FILES_BINS) { - if (!File.Exists(String.Format("bin{0}", filePath))) { - return false; - } - } - return true; + public static bool IsMinerBinFolder() { + return Directory.Exists(StandardDlSetup.ZipedFolderName); } - public bool IsMinersBinsInit() { - //return isOk; - return IsMinersBins_ALL_Init(); + static bool IsMinerBinZip() { + return File.Exists(StandardDlSetup.BinsZipLocation); } } diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs new file mode 100644 index 0000000..ac6390b --- /dev/null +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -0,0 +1,169 @@ +using NiceHashMiner.Interfaces; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace NiceHashMiner.Utils { + public class MinersDownloader { + private const string TAG = "MinersDownloader"; + + DownloadSetup _downloadSetup; + + private WebClient _webClient; + private Stopwatch _stopwatch; + + bool isDownloadSizeInit = false; + + IMinerUpdateIndicator _minerUpdateIndicator; + + public MinersDownloader(DownloadSetup downloadSetup) { + _downloadSetup = downloadSetup; + } + + public void Start(IMinerUpdateIndicator minerUpdateIndicator) { + _minerUpdateIndicator = minerUpdateIndicator; + + // if something not right delete previous and download new + try { + if (File.Exists(_downloadSetup.BinsZipLocation)) { + File.Delete(_downloadSetup.BinsZipLocation); + } + if (Directory.Exists(_downloadSetup.ZipedFolderName)) { + Directory.Delete(_downloadSetup.ZipedFolderName, true); + } + } catch { } + Downlaod(); + } + + //// #1 check if miners exits + //public bool IsMinerBinFolder() { + // return Directory.Exists("bin"); + //} + + //bool IsMinerBinZip() { + // return File.Exists(_downloadSetup.BinsZipLocation); + //} + + // #2 download the file + private void Downlaod() { + _minerUpdateIndicator.SetTitle(International.GetText("MinersDownloadManager_Title_Downloading")); + _stopwatch = new Stopwatch(); + using (_webClient = new WebClient()) { + _webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); + _webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted); + + Uri downloadURL = new Uri(_downloadSetup.BinsDownloadURL); + + _stopwatch.Start(); + try { + _webClient.DownloadFileAsync(downloadURL, _downloadSetup.BinsZipLocation); + } catch (Exception ex) { + Helpers.ConsolePrint("MinersDownloadManager", ex.Message); + } + } + } + + #region Download delegates + + private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { + if (!isDownloadSizeInit) { + isDownloadSizeInit = true; + _minerUpdateIndicator.SetMaxProgressValue((int)(e.TotalBytesToReceive / 1024)); + } + + // Calculate download speed and output it to labelSpeed. + var speedString = string.Format("{0} kb/s", (e.BytesReceived / 1024d / _stopwatch.Elapsed.TotalSeconds).ToString("0.00")); + + // Show the percentage on our label. + var percString = e.ProgressPercentage.ToString() + "%"; + + // Update the label with how much data have been downloaded so far and the total size of the file we are currently downloading + var labelDownloaded = string.Format("{0} MB / {1} MB", + (e.BytesReceived / 1024d / 1024d).ToString("0.00"), + (e.TotalBytesToReceive / 1024d / 1024d).ToString("0.00")); + + _minerUpdateIndicator.SetProgressValueAndMsg( + (int)(e.BytesReceived / 1024d), + String.Format("{0} {1} {2}", speedString, percString,labelDownloaded)); + + } + + // The event that will trigger when the WebClient is completed + private void DownloadCompleted(object sender, AsyncCompletedEventArgs e) { + _stopwatch.Stop(); + _stopwatch = null; + + if (e.Cancelled == true) { + // TODO handle Cancelled + Helpers.ConsolePrint(TAG, "DownloadCompleted Cancelled"); + } else { + // TODO handle Success + Helpers.ConsolePrint(TAG, "DownloadCompleted Success"); + // wait one second for binary to exist + System.Threading.Thread.Sleep(1000); + // extra check dirty + int try_count = 50; + while (!File.Exists(_downloadSetup.BinsZipLocation) && try_count > 0) { --try_count; } + + UnzipStart(); + } + } + + #endregion Download delegates + + + private void UnzipStart() { + _minerUpdateIndicator.SetTitle(International.GetText("MinersDownloadManager_Title_Settup")); + Thread BenchmarkThread = new Thread(UnzipThreadRoutine); + BenchmarkThread.Start(); + } + + private void UnzipThreadRoutine() { + if (File.Exists(_downloadSetup.BinsZipLocation)) { + Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); + Helpers.ConsolePrint(TAG, "unzipping"); + using (ZipArchive archive = ZipFile.Open(_downloadSetup.BinsZipLocation, ZipArchiveMode.Read)) { + //archive.ExtractToDirectory("bin"); + _minerUpdateIndicator.SetMaxProgressValue(archive.Entries.Count); + int prog = 0; + // first create dirs + foreach (ZipArchiveEntry entry in archive.Entries) { + if (entry.Length == 0) { + Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); + Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); + Directory.CreateDirectory(entry.FullName); + _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); + } + } + // unzip files + foreach (ZipArchiveEntry entry in archive.Entries) { + if (entry.Length > 0) { + Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); + Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); + entry.ExtractToFile(entry.FullName); + _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); + } + } + } + // after unzip stuff + _minerUpdateIndicator.FinishMsg(true); + // remove bins zip + try { + if (File.Exists(_downloadSetup.BinsZipLocation)) { + File.Delete(_downloadSetup.BinsZipLocation); + } + } catch { } + } else { + Helpers.ConsolePrint(TAG, "UnzipThreadRoutine bin.zip file not found"); + } + } + } +} diff --git a/NiceHashMiner/Utils/MinersExistanceChecker.cs b/NiceHashMiner/Utils/MinersExistanceChecker.cs new file mode 100644 index 0000000..d19153a --- /dev/null +++ b/NiceHashMiner/Utils/MinersExistanceChecker.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Utils { + public static class MinersExistanceChecker { + public static bool IsMinersBins_ALL_Init() { + foreach (var filePath in Bins_Data.ALL_FILES_BINS) { + if (!File.Exists(String.Format("bin{0}", filePath))) { + return false; + } + } + return true; + } + + public static bool IsMinersBinsInit() { + //return isOk; + return IsMinersBins_ALL_Init(); + } + } +} From c02730987756a3809924d92211da6b3e9343bf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 23 Nov 2016 15:32:38 +0100 Subject: [PATCH 116/366] added tos 3rdparty miners, bins checker update --- NiceHashMiner/Configs/GeneralConfig.cs | 5 +- NiceHashMiner/Forms/Form_Main.cs | 64 +++-- NiceHashMiner/Miners/MinersManager.cs | 4 +- NiceHashMiner/NiceHashMiner.csproj | 1 + NiceHashMiner/Utils/BINS_CODEGEN.cs | 253 ++++-------------- NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs | 15 ++ NiceHashMiner/Utils/MinersExistanceChecker.cs | 9 + NiceHashMiner/langs/en.lang | 4 +- NiceHashMiner/langs/ru.lang | 4 +- codegen/genBins.py | 10 +- 10 files changed, 126 insertions(+), 243 deletions(-) create mode 100644 NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index 5add22e..b0c09d0 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -114,7 +114,8 @@ public int ApiBindPortPoolStart { public bool DownloadInit { get; set; } - Use3rdPartyMiners Use3rdPartyMiners { get; set; } + public Use3rdPartyMiners Use3rdPartyMiners { get; set; } + public bool DownloadInit3rdParty { get; set; } [JsonIgnore] @@ -176,6 +177,7 @@ public void SetDefaults() { DownloadInit = false; ContinueMiningIfNoInternetAccess = false; Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; + DownloadInit3rdParty = false; } public GeneralConfig(bool initDefaults = false) { @@ -258,6 +260,7 @@ protected override void InitializeObject() { DownloadInit = _file.DownloadInit; } Use3rdPartyMiners = _file.Use3rdPartyMiners; + DownloadInit3rdParty = _file.DownloadInit3rdParty; hwidLoadFromFile = true; hwidOK = this.hwid == _file.hwid; diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 22c2197..3f4f8cd 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -327,35 +327,45 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } // 3rdparty miners check scope { - // + // check if setting set + if (ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.NOT_SET) { + // TODO + var result = MessageBox.Show(International.GetText("Form_Main_3rdParty_Text"), + International.GetText("Form_Main_3rdParty_Title"), + MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (result == System.Windows.Forms.DialogResult.Yes) { + ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; + } else { + ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + } + } // check if download needed - if ( - //!MinersExistanceChecker.IsMinersBinsInit() && !ConfigManager.Instance.GeneralConfig.DownloadInit - true - ) { - Form_Loading download3rdPartyUnzipForm = new Form_Loading(new MinersDownloader(MinersDownloadManager.ThirdPartyDlSetup)); - SetChildFormCenter(download3rdPartyUnzipForm); - download3rdPartyUnzipForm.ShowDialog(); + if (ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { + if (!MinersExistanceChecker.IsMiners3rdPartyBinsInit() && !ConfigManager.Instance.GeneralConfig.DownloadInit3rdParty) { + Form_Loading download3rdPartyUnzipForm = new Form_Loading(new MinersDownloader(MinersDownloadManager.ThirdPartyDlSetup)); + SetChildFormCenter(download3rdPartyUnzipForm); + download3rdPartyUnzipForm.ShowDialog(); + } + // check if files are mising + if (!MinersExistanceChecker.IsMiners3rdPartyBinsInit()) { + var result = MessageBox.Show(International.GetText("Form_Main_bins_folder_files_missing"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (result == DialogResult.Yes) { + ConfigManager.Instance.GeneralConfig.DownloadInit = false; + ConfigManager.Instance.GeneralConfig.Commit(); + Process PHandle = new Process(); + PHandle.StartInfo.FileName = Application.ExecutablePath; + PHandle.Start(); + Close(); + return; + } + } else { + // all good + ConfigManager.Instance.GeneralConfig.DownloadInit3rdParty = true; + ConfigManager.Instance.GeneralConfig.Commit(); + } } - // check if files are mising - //if (!MinersExistanceChecker.IsMinersBinsInit()) { - // var result = MessageBox.Show(International.GetText("Form_Main_bins_folder_files_missing"), - // International.GetText("Warning_with_Exclamation"), - // MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - // if (result == DialogResult.Yes) { - // ConfigManager.Instance.GeneralConfig.DownloadInit = false; - // ConfigManager.Instance.GeneralConfig.Commit(); - // Process PHandle = new Process(); - // PHandle.StartInfo.FileName = Application.ExecutablePath; - // PHandle.Start(); - // Close(); - // return; - // } - //} else { - // // all good - // ConfigManager.Instance.GeneralConfig.DownloadInit = true; - // ConfigManager.Instance.GeneralConfig.Commit(); - //} } // no bots please diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 75cf2ff..e4e5958 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -57,7 +57,9 @@ public static Miner CreateMiner(DeviceType deviceType, string minerPath) { return new eqm(); } else if (minerPath == MinerPaths.nheqminer) { return new nheqminer(); - } else if (minerPath == MinerPaths.ClaymoreZcashMiner && DeviceType.AMD == deviceType) { + } else if ( + ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES + && minerPath == MinerPaths.ClaymoreZcashMiner && DeviceType.AMD == deviceType) { return new ClaymoreZcashMiner(); } else if (minerPath.Contains("ethminer") && DeviceType.CPU != deviceType) { if (DeviceType.AMD == deviceType) { diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index fe9e465..ac8bf97 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -244,6 +244,7 @@ + diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index b1837b8..11c5380 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -3,16 +3,18 @@ namespace NiceHashMiner.Utils { public static class Bins_Data { #region CODE_GEN STUFF // listFiles.py public static string[] ALL_FILES_BINS = { +@"\ccminer.exe", @"\ccminer_cryptonight.exe", @"\ccminer_decred.exe", @"\ccminer_nanashi.exe", @"\ccminer_neoscrypt.exe", @"\ccminer_sp.exe", -@"\ccminer_tpruvot.exe", @"\cpuminer_opt_AVX2_AES.exe", -@"\cpuminer_opt_AVX2.exe", -@"\cpuminer_opt_AVX_AES.exe", -@"\cpuminer_opt_AVX.exe", -@"\cpuminer_opt_AES.exe", +@"\ccminer_tpruvot.exe", +@"\cpuminer_opt_AES.exe", +@"\cpuminer_opt_AVX.exe", +@"\cpuminer_opt_AVX2.exe", +@"\cpuminer_opt_AVX2_AES.exe", +@"\cpuminer_opt_AVX_AES.exe", @"\cpuminer_opt_SSE2.exe", @"\cudart32_80.dll", @"\cudart64_80.dll", @@ -34,6 +36,20 @@ public static class Bins_Data { @"\msvcr120.dll", @"\OpenCL.dll", @"\zlib1.dll", +@"\eqm\cudart64_80.dll", +@"\eqm\eqm.exe", +@"\eqm\msvcp120.dll", +@"\eqm\msvcr120.dll", +@"\nheqminer_v0.4b\cpu_tromp_AVX.dll", +@"\nheqminer_v0.4b\cpu_tromp_SSE2.dll", +@"\nheqminer_v0.4b\cudart64_75.dll", +@"\nheqminer_v0.4b\cudart64_80.dll", +@"\nheqminer_v0.4b\cuda_tromp.dll", +@"\nheqminer_v0.4b\cuda_tromp_75.dll", +@"\nheqminer_v0.4b\equiw200k9.bin", +@"\nheqminer_v0.4b\msvcp120.dll", +@"\nheqminer_v0.4b\msvcr120.dll", +@"\nheqminer_v0.4b\nheqminer.exe", @"\sgminer-5-1-0-optimized\darkcoin-modHawaiigw64l4.bin", @"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4.bin", @"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4ku0.bin", @@ -58,77 +74,9 @@ public static class Bins_Data { @"\sgminer-5-1-0-optimized\quarkcoinTahitigw64l4ku0.bin", @"\sgminer-5-1-0-optimized\quarkcoinTongagw256l4ku0.bin", @"\sgminer-5-1-0-optimized\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\runme.bat", -@"\sgminer-5-1-0-optimized\sgminer-fixed.conf", @"\sgminer-5-1-0-optimized\sgminer.exe", @"\sgminer-5-1-0-optimized\ssleay32.dll", @"\sgminer-5-1-0-optimized\zlib1.dll", -@"\sgminer-5-1-0-optimized\kernel\aes_helper.cl", -@"\sgminer-5-1-0-optimized\kernel\alexkarnew.cl", -@"\sgminer-5-1-0-optimized\kernel\alexkarold.cl", -@"\sgminer-5-1-0-optimized\kernel\animecoin.cl", -@"\sgminer-5-1-0-optimized\kernel\arebyp.cl", -@"\sgminer-5-1-0-optimized\kernel\bitblock.cl", -@"\sgminer-5-1-0-optimized\kernel\bitblockold.cl", -@"\sgminer-5-1-0-optimized\kernel\blake.cl", -@"\sgminer-5-1-0-optimized\kernel\blake256.cl", -@"\sgminer-5-1-0-optimized\kernel\bmw.cl", -@"\sgminer-5-1-0-optimized\kernel\bmw256.cl", -@"\sgminer-5-1-0-optimized\kernel\bufius.cl", -@"\sgminer-5-1-0-optimized\kernel\ckolivas.cl", -@"\sgminer-5-1-0-optimized\kernel\credits.cl", -@"\sgminer-5-1-0-optimized\kernel\cubehash.cl", -@"\sgminer-5-1-0-optimized\kernel\cubehash256.cl", -@"\sgminer-5-1-0-optimized\kernel\darkcoin-mod.cl", -@"\sgminer-5-1-0-optimized\kernel\darkcoin.cl", -@"\sgminer-5-1-0-optimized\kernel\diamond.cl", -@"\sgminer-5-1-0-optimized\kernel\echo.cl", -@"\sgminer-5-1-0-optimized\kernel\fresh.cl", -@"\sgminer-5-1-0-optimized\kernel\fugue.cl", -@"\sgminer-5-1-0-optimized\kernel\fuguecoin.cl", -@"\sgminer-5-1-0-optimized\kernel\groestl.cl", -@"\sgminer-5-1-0-optimized\kernel\groestl256.cl", -@"\sgminer-5-1-0-optimized\kernel\groestlcoin-v1.cl", -@"\sgminer-5-1-0-optimized\kernel\groestlcoin.cl", -@"\sgminer-5-1-0-optimized\kernel\hamsi.cl", -@"\sgminer-5-1-0-optimized\kernel\hamsi_helper.cl", -@"\sgminer-5-1-0-optimized\kernel\hamsi_helper_big.cl", -@"\sgminer-5-1-0-optimized\kernel\inkcoin.cl", -@"\sgminer-5-1-0-optimized\kernel\jh.cl", -@"\sgminer-5-1-0-optimized\kernel\keccak.cl", -@"\sgminer-5-1-0-optimized\kernel\keccak1600.cl", -@"\sgminer-5-1-0-optimized\kernel\luffa.cl", -@"\sgminer-5-1-0-optimized\kernel\Lyra2.cl", -@"\sgminer-5-1-0-optimized\kernel\Lyra2RE.cl", -@"\sgminer-5-1-0-optimized\kernel\Lyra2REv2.cl", -@"\sgminer-5-1-0-optimized\kernel\Lyra2v2.cl", -@"\sgminer-5-1-0-optimized\kernel\marucoin-mod.cl", -@"\sgminer-5-1-0-optimized\kernel\marucoin-modold.cl", -@"\sgminer-5-1-0-optimized\kernel\marucoin.cl", -@"\sgminer-5-1-0-optimized\kernel\maxcoin.cl", -@"\sgminer-5-1-0-optimized\kernel\myriadcoin-groestl.cl", -@"\sgminer-5-1-0-optimized\kernel\neoscrypt.cl", -@"\sgminer-5-1-0-optimized\kernel\panama.cl", -@"\sgminer-5-1-0-optimized\kernel\pluck.cl", -@"\sgminer-5-1-0-optimized\kernel\psw.cl", -@"\sgminer-5-1-0-optimized\kernel\quarkcoin.cl", -@"\sgminer-5-1-0-optimized\kernel\qubitcoin.cl", -@"\sgminer-5-1-0-optimized\kernel\shabal.cl", -@"\sgminer-5-1-0-optimized\kernel\shavite.cl", -@"\sgminer-5-1-0-optimized\kernel\sifcoin.cl", -@"\sgminer-5-1-0-optimized\kernel\simd.cl", -@"\sgminer-5-1-0-optimized\kernel\skein.cl", -@"\sgminer-5-1-0-optimized\kernel\skein256.cl", -@"\sgminer-5-1-0-optimized\kernel\talkcoin-mod.cl", -@"\sgminer-5-1-0-optimized\kernel\twecoin.cl", -@"\sgminer-5-1-0-optimized\kernel\whirlcoin.cl", -@"\sgminer-5-1-0-optimized\kernel\whirlpool.cl", -@"\sgminer-5-1-0-optimized\kernel\x14.cl", -@"\sgminer-5-1-0-optimized\kernel\x14old.cl", -@"\sgminer-5-1-0-optimized\kernel\yescrypt-multi.cl", -@"\sgminer-5-1-0-optimized\kernel\yescrypt.cl", -@"\sgminer-5-1-0-optimized\kernel\yescrypt_essential.cl", -@"\sgminer-5-1-0-optimized\kernel\zuikkis.cl", @"\sgminer-5-1-1-optimized\darkcoin-modHawaiigw64l4ku0.bin", @"\sgminer-5-1-1-optimized\darkcoin-modPitcairngw64l4ku0.bin", @"\sgminer-5-1-1-optimized\darkcoin-modTahitigw64l4ku0.bin", @@ -147,71 +95,9 @@ public static class Bins_Data { @"\sgminer-5-1-1-optimized\qubitcoinPitcairngw64l4ku0.bin", @"\sgminer-5-1-1-optimized\qubitcoinTahitigw64l4ku0.bin", @"\sgminer-5-1-1-optimized\qubitcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\runme.bat", -@"\sgminer-5-1-1-optimized\sgminer-fixed.conf", @"\sgminer-5-1-1-optimized\sgminer.exe", @"\sgminer-5-1-1-optimized\ssleay32.dll", @"\sgminer-5-1-1-optimized\zlib1.dll", -@"\sgminer-5-1-1-optimized\kernel\aes_helper.cl", -@"\sgminer-5-1-1-optimized\kernel\alexkarnew.cl", -@"\sgminer-5-1-1-optimized\kernel\alexkarold.cl", -@"\sgminer-5-1-1-optimized\kernel\animecoin.cl", -@"\sgminer-5-1-1-optimized\kernel\arebyp.cl", -@"\sgminer-5-1-1-optimized\kernel\bitblock.cl", -@"\sgminer-5-1-1-optimized\kernel\bitblockold.cl", -@"\sgminer-5-1-1-optimized\kernel\blake.cl", -@"\sgminer-5-1-1-optimized\kernel\blake256.cl", -@"\sgminer-5-1-1-optimized\kernel\bmw.cl", -@"\sgminer-5-1-1-optimized\kernel\bufius.cl", -@"\sgminer-5-1-1-optimized\kernel\ckolivas.cl", -@"\sgminer-5-1-1-optimized\kernel\cubehash.cl", -@"\sgminer-5-1-1-optimized\kernel\darkcoin-mod.cl", -@"\sgminer-5-1-1-optimized\kernel\darkcoin.cl", -@"\sgminer-5-1-1-optimized\kernel\diamond.cl", -@"\sgminer-5-1-1-optimized\kernel\echo.cl", -@"\sgminer-5-1-1-optimized\kernel\fresh.cl", -@"\sgminer-5-1-1-optimized\kernel\fugue.cl", -@"\sgminer-5-1-1-optimized\kernel\fuguecoin.cl", -@"\sgminer-5-1-1-optimized\kernel\groestl.cl", -@"\sgminer-5-1-1-optimized\kernel\groestl256.cl", -@"\sgminer-5-1-1-optimized\kernel\groestlcoin-v1.cl", -@"\sgminer-5-1-1-optimized\kernel\groestlcoin.cl", -@"\sgminer-5-1-1-optimized\kernel\hamsi.cl", -@"\sgminer-5-1-1-optimized\kernel\hamsi_helper.cl", -@"\sgminer-5-1-1-optimized\kernel\hamsi_helper_big.cl", -@"\sgminer-5-1-1-optimized\kernel\inkcoin.cl", -@"\sgminer-5-1-1-optimized\kernel\jh.cl", -@"\sgminer-5-1-1-optimized\kernel\keccak.cl", -@"\sgminer-5-1-1-optimized\kernel\keccak1600.cl", -@"\sgminer-5-1-1-optimized\kernel\luffa.cl", -@"\sgminer-5-1-1-optimized\kernel\lyra2.cl", -@"\sgminer-5-1-1-optimized\kernel\lyra2re.cl", -@"\sgminer-5-1-1-optimized\kernel\marucoin-mod.cl", -@"\sgminer-5-1-1-optimized\kernel\marucoin-modold.cl", -@"\sgminer-5-1-1-optimized\kernel\marucoin.cl", -@"\sgminer-5-1-1-optimized\kernel\maxcoin.cl", -@"\sgminer-5-1-1-optimized\kernel\myriadcoin-groestl.cl", -@"\sgminer-5-1-1-optimized\kernel\neoscrypt.cl", -@"\sgminer-5-1-1-optimized\kernel\panama.cl", -@"\sgminer-5-1-1-optimized\kernel\pluck.cl", -@"\sgminer-5-1-1-optimized\kernel\psw.cl", -@"\sgminer-5-1-1-optimized\kernel\quarkcoin.cl", -@"\sgminer-5-1-1-optimized\kernel\qubitcoin.cl", -@"\sgminer-5-1-1-optimized\kernel\shabal.cl", -@"\sgminer-5-1-1-optimized\kernel\shavite.cl", -@"\sgminer-5-1-1-optimized\kernel\sifcoin.cl", -@"\sgminer-5-1-1-optimized\kernel\simd.cl", -@"\sgminer-5-1-1-optimized\kernel\skein.cl", -@"\sgminer-5-1-1-optimized\kernel\skein256.cl", -@"\sgminer-5-1-1-optimized\kernel\talkcoin-mod.cl", -@"\sgminer-5-1-1-optimized\kernel\twecoin.cl", -@"\sgminer-5-1-1-optimized\kernel\whirlcoin.cl", -@"\sgminer-5-1-1-optimized\kernel\whirlpool.cl", -@"\sgminer-5-1-1-optimized\kernel\whirlpoolx.cl", -@"\sgminer-5-1-1-optimized\kernel\x14.cl", -@"\sgminer-5-1-1-optimized\kernel\x14old.cl", -@"\sgminer-5-1-1-optimized\kernel\zuikkis.cl", -@"\sgminer-5-5-0-general\sgminer.exe", @"\sgminer-5-4-0-tweaked\darkcoin-modBonairegw64l4ku0.bin", @"\sgminer-5-4-0-tweaked\darkcoin-modFijigw64l4ku0.bin", @"\sgminer-5-4-0-tweaked\darkcoin-modHawaiigw64l4ku0.bin", @@ -237,77 +123,32 @@ public static class Bins_Data { @"\sgminer-5-4-0-tweaked\qubitcoinTahitigw64l4ku0.bin", @"\sgminer-5-4-0-tweaked\qubitcoinTongagw64l4ku0.bin", @"\sgminer-5-4-0-tweaked\sgminer.exe", -@"\sgminer-5-4-0-tweaked\kernel\aes_helper.cl", -@"\sgminer-5-4-0-tweaked\kernel\alexkarnew.cl", -@"\sgminer-5-4-0-tweaked\kernel\alexkarold.cl", -@"\sgminer-5-4-0-tweaked\kernel\animecoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\arebyp.cl", -@"\sgminer-5-4-0-tweaked\kernel\bitblock.cl", -@"\sgminer-5-4-0-tweaked\kernel\bitblockold.cl", -@"\sgminer-5-4-0-tweaked\kernel\blake.cl", -@"\sgminer-5-4-0-tweaked\kernel\blake256.cl", -@"\sgminer-5-4-0-tweaked\kernel\blake256r14.cl", -@"\sgminer-5-4-0-tweaked\kernel\blake256r8.cl", -@"\sgminer-5-4-0-tweaked\kernel\bmw.cl", -@"\sgminer-5-4-0-tweaked\kernel\bmw256.cl", -@"\sgminer-5-4-0-tweaked\kernel\bufius.cl", -@"\sgminer-5-4-0-tweaked\kernel\ckolivas.cl", -@"\sgminer-5-4-0-tweaked\kernel\credits.cl", -@"\sgminer-5-4-0-tweaked\kernel\cubehash.cl", -@"\sgminer-5-4-0-tweaked\kernel\cubehash256.cl", -@"\sgminer-5-4-0-tweaked\kernel\darkcoin-mod.cl", -@"\sgminer-5-4-0-tweaked\kernel\darkcoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\decred.cl", -@"\sgminer-5-4-0-tweaked\kernel\diamond.cl", -@"\sgminer-5-4-0-tweaked\kernel\echo.cl", -@"\sgminer-5-4-0-tweaked\kernel\fresh.cl", -@"\sgminer-5-4-0-tweaked\kernel\fugue.cl", -@"\sgminer-5-4-0-tweaked\kernel\fuguecoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\groestl.cl", -@"\sgminer-5-4-0-tweaked\kernel\groestl256.cl", -@"\sgminer-5-4-0-tweaked\kernel\groestlcoin-v1.cl", -@"\sgminer-5-4-0-tweaked\kernel\groestlcoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\hamsi.cl", -@"\sgminer-5-4-0-tweaked\kernel\hamsi_helper.cl", -@"\sgminer-5-4-0-tweaked\kernel\hamsi_helper_big.cl", -@"\sgminer-5-4-0-tweaked\kernel\inkcoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\jh.cl", -@"\sgminer-5-4-0-tweaked\kernel\keccak.cl", -@"\sgminer-5-4-0-tweaked\kernel\keccak1600.cl", -@"\sgminer-5-4-0-tweaked\kernel\luffa.cl", -@"\sgminer-5-4-0-tweaked\kernel\lyra2.cl", -@"\sgminer-5-4-0-tweaked\kernel\lyra2re.cl", -@"\sgminer-5-4-0-tweaked\kernel\lyra2rev2.cl", -@"\sgminer-5-4-0-tweaked\kernel\lyra2v2.cl", -@"\sgminer-5-4-0-tweaked\kernel\marucoin-mod.cl", -@"\sgminer-5-4-0-tweaked\kernel\marucoin-modold.cl", -@"\sgminer-5-4-0-tweaked\kernel\marucoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\maxcoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\myriadcoin-groestl.cl", -@"\sgminer-5-4-0-tweaked\kernel\neoscrypt.cl", -@"\sgminer-5-4-0-tweaked\kernel\panama.cl", -@"\sgminer-5-4-0-tweaked\kernel\pluck.cl", -@"\sgminer-5-4-0-tweaked\kernel\psw.cl", -@"\sgminer-5-4-0-tweaked\kernel\quarkcoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\qubitcoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\shabal.cl", -@"\sgminer-5-4-0-tweaked\kernel\shavite.cl", -@"\sgminer-5-4-0-tweaked\kernel\sifcoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\simd.cl", -@"\sgminer-5-4-0-tweaked\kernel\skein.cl", -@"\sgminer-5-4-0-tweaked\kernel\skein256.cl", -@"\sgminer-5-4-0-tweaked\kernel\talkcoin-mod.cl", -@"\sgminer-5-4-0-tweaked\kernel\twecoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\vanilla.cl", -@"\sgminer-5-4-0-tweaked\kernel\whirlcoin.cl", -@"\sgminer-5-4-0-tweaked\kernel\whirlpool.cl", -@"\sgminer-5-4-0-tweaked\kernel\whirlpoolx.cl", -@"\sgminer-5-4-0-tweaked\kernel\x14.cl", -@"\sgminer-5-4-0-tweaked\kernel\x14old.cl", -@"\sgminer-5-4-0-tweaked\kernel\yescrypt-multi.cl", -@"\sgminer-5-4-0-tweaked\kernel\yescrypt.cl", -@"\sgminer-5-4-0-tweaked\kernel\yescrypt_essential.cl", -@"\sgminer-5-4-0-tweaked\kernel\zuikkis.cl", +@"\sgminer-5-5-0-general\bitblockFijigw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\bitblockHawaiigw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\bitblockTongagw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\blake256r8Fijigw128l4.bin", +@"\sgminer-5-5-0-general\blake256r8Hawaiigw128l4.bin", +@"\sgminer-5-5-0-general\blake256r8Tongagw128l4.bin", +@"\sgminer-5-5-0-general\decredFijigw64l4tc24512.bin", +@"\sgminer-5-5-0-general\decredHawaiigw64l4tc24512.bin", +@"\sgminer-5-5-0-general\decredTongagw64l4tc24512.bin", +@"\sgminer-5-5-0-general\lbryTongagw128l4.bin", +@"\sgminer-5-5-0-general\marucoin-modFijigw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\marucoin-modHawaiigw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\marucoin-modTongagw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\maxcoinFijigw64l4.bin", +@"\sgminer-5-5-0-general\maxcoinHawaiigw64l4.bin", +@"\sgminer-5-5-0-general\maxcoinTongagw64l4.bin", +@"\sgminer-5-5-0-general\neoscryptFijigw64l4lgtc8192.bin", +@"\sgminer-5-5-0-general\neoscryptHawaiigw64l4lgtc8192.bin", +@"\sgminer-5-5-0-general\neoscryptTongagw64l4lgtc8192.bin", +@"\sgminer-5-5-0-general\sgminer.exe", +@"\sgminer-5-5-0-general\talkcoin-modFijigw64l4ku0.bin", +@"\sgminer-5-5-0-general\talkcoin-modHawaiigw64l4ku0.bin", +@"\sgminer-5-5-0-general\talkcoin-modTongagw64l4ku0.bin", +@"\sgminer-5-5-0-general\vanillaFijigw128l4.bin", +@"\sgminer-5-5-0-general\vanillaHawaiigw128l4.bin", +@"\sgminer-5-5-0-general\vanillaTongagw128l4.bin", }; #endregion //CODE_GEN STUFF // listFiles.py } diff --git a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs new file mode 100644 index 0000000..9bafd51 --- /dev/null +++ b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs @@ -0,0 +1,15 @@ + +namespace NiceHashMiner.Utils { + public static class Bins_Data_3rd { + #region CODE_GEN STUFF // listFiles.py +public static string[] ALL_FILES_BINS = { +@"\claymore_zcash\Data.bin", +@"\claymore_zcash\Data2.bin", +@"\claymore_zcash\msvcr110.dll", +@"\claymore_zcash\ZecMiner64.exe", +@"\claymore_zcash\Remote manager\EthMan.exe", +}; +#endregion //CODE_GEN STUFF // listFiles.py +} +} + diff --git a/NiceHashMiner/Utils/MinersExistanceChecker.cs b/NiceHashMiner/Utils/MinersExistanceChecker.cs index d19153a..b3f6df9 100644 --- a/NiceHashMiner/Utils/MinersExistanceChecker.cs +++ b/NiceHashMiner/Utils/MinersExistanceChecker.cs @@ -16,6 +16,15 @@ public static bool IsMinersBins_ALL_Init() { return true; } + public static bool IsMiners3rdPartyBinsInit() { + foreach (var filePath in Bins_Data_3rd.ALL_FILES_BINS) { + if (!File.Exists(String.Format("bin_3rdparty{0}", filePath))) { + return false; + } + } + return true; + } + public static bool IsMinersBinsInit() { //return isOk; return IsMinersBins_ALL_Init(); diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 92323d3..c9a0828 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -323,6 +323,8 @@ "Form_Settings_Text_DisableDefaultOptimizations": "Disable Default Optimizations", "AlgorithmsListView_ContextMenu_DisableAll": "Disable All Algorithms", "AlgorithmsListView_ContextMenu_EnableAll": "Enable All Algorithms", - "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable at least 1 device to proceed mining.", + "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable at least 1 device to proceed mining.", + "Form_Main_3rdParty_Title": "Disclaimer on usage of 3rd party software", + "Form_Main_3rdParty_Text": "We have integrated 3rd party mining software (developed by Claymore) that should speed up your mining and give you more stable mining experience - this could potentially result in more earnings over a shorter period of time even after developer's fee is deducted. However, since this is 3rd party software that is fully closed-source, we have no chance to inspect it in any way. NiceHash can not vouch for using that software and is refusing to take any responsibility for any damage caused - security breaches, loss of data or funds, system or hardware error, and other issues. By agreeing to this disclaimer you take full responsibility for using these Claymore closed-source miners as they are." } } diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 0cc4719..ed72c2c 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -323,6 +323,8 @@ "Form_Settings_ToolTip_DisableDefaultOptimizations": "Если отмечено, отключает все настройки оптимизации по умолчанию, делая майнинг потенциально более стабильным, но значительно медленнее (особенно для карт AMD).", "Form_Settings_Text_DisableDefaultOptimizations": "Отключить оптимизацию", "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Продолжить майнинг без доступа к интернету", - "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess" : "Если отмечено, NiceHashMiner продолжит майнинг вне зависимости от подключения к интернету.", + "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess": "Если отмечено, NiceHashMiner продолжит майнинг вне зависимости от подключения к интернету.", + "Form_Main_3rdParty_Title": "Дисклеймер от использования стороннего программного обеспечения", + "Form_Main_3rdParty_Text": "Мы интегрировали стороннее программное обеспечение (разработанное Claymore), которое должно поднять скорость вашего майнинга и дать вам более стабильный опыт майнинга — это потенциально может привести к большему заработку за короткий период времени, даже после вычета комиссии разработчика. Однако, поскольку это стороннее программное обеспечение является полностью закрытым, у нас нет никакой возможности исследовать его. NiceHash не может ручаться за использование этого ПО и отказывается брать на себя ответственность за любой причиненный ущерб - нарушение безопасности, потерю данных или средств и другие проблемы. Соглашением с этим дисклеймером, вы берете полную ответственность за использование этих майнеров с закрытым исходным кодом от Claymore." } } \ No newline at end of file diff --git a/codegen/genBins.py b/codegen/genBins.py index 02dea6b..9cc2201 100644 --- a/codegen/genBins.py +++ b/codegen/genBins.py @@ -3,24 +3,22 @@ c_sharp_Class_START = """ namespace NiceHashMiner.Utils { - public partial class MinersDownloadManager : BaseLazySingleton { + public static class Bins_Data { #region CODE_GEN STUFF // listFiles.py """ -containsFilesC_SHARP_Code = "private static string[] ALL_FILES_BINS = {" +containsFilesC_SHARP_Code = "public static string[] ALL_FILES_BINS = {" root = "." outFile = "BINS_CODEGEN.cs" -outFile_shared = "BINS_CODEGEN_SHARED.cs" -outFile_amd = "BINS_CODEGEN_AMD.cs" -outFile_nvidia = "BINS_CODEGEN_NVIDIA.cs" inFile = "genBins.py" for path, subdirs, files in os.walk(root): for name in files: #print os.path.join(path, name) - if (".py" not in name) and (".cs" not in name): + #if (".py" not in name) and (".cs" not in name): + if (".exe" in name) or (".dll" in name) or (".bin" in name): file = '@"%s",' % os.path.join(path, name)[1:] containsFilesC_SHARP_Code = "%s%s%s" % (containsFilesC_SHARP_Code, os.linesep, file) From 4dbb3c9a557987b281790d03b083f496fad97e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 23 Nov 2016 16:14:02 +0100 Subject: [PATCH 117/366] add claymore temperature extra launch params, fix miner path 3rdparty settings check --- NiceHashMiner/Enums/MinerOptionType.cs | 2 ++ NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs | 6 ++++-- NiceHashMiner/Miners/Grouping/GroupingLogic.cs | 2 ++ NiceHashMiner/Miners/Grouping/MinerPaths.cs | 5 +++-- .../Miners/Parsing/ExtraLaunchParametersParser.cs | 7 +++++++ 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index f5d7314..901915b 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -53,5 +53,7 @@ public enum MinerOptionType { // eqm CUDA_Solver_AsyncMode, // -ca CUDA_Solver_ParallelBuckets, // -cp + // ClaymoreZcash + ClaymoreZcash_tt } } diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 85df93e..fb0d98e 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -2,6 +2,7 @@ using NiceHashMiner.Configs; using NiceHashMiner.Enums; using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; using System; using System.Collections.Generic; using System.Diagnostics; @@ -45,7 +46,7 @@ public void KillZecMiner64() { public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); - LastCommandLine = "-wd 1 -colors 0 -logfile cl_log_noappend.txt " + GetDevicesCommandString() + " -mport -" + APIPort + " -zpool " + url + " -zwal " + username; + LastCommandLine = "-logfile cl_log_noappend.txt " + GetDevicesCommandString() + " -mport -" + APIPort + " -zpool " + url + " -zwal " + username; ProcessHandle = _Start(); } @@ -116,6 +117,7 @@ public override APIData GetSummary() { } protected override string GetDevicesCommandString() { + string extraParams = ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); string deviceStringCommand = " -di "; List ids = new List(); foreach (var mPair in MiningSetup.MiningPairs) { @@ -123,7 +125,7 @@ protected override string GetDevicesCommandString() { } deviceStringCommand += string.Join("", ids); - return deviceStringCommand; + return deviceStringCommand + extraParams; } // benchmark stuff diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index ab00e4a..26ef7bd 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -36,6 +36,8 @@ public static bool IsEquihashGroupLogic(string minerPath, MiningPair a, MiningPa // nheqmnier else if (MinerPaths.nheqminer == minerPath) { return Is_nheqminer(a, b); + } else if (MinerPaths.ClaymoreZcashMiner == minerPath) { + return true; } return false; } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index a5541e7..8f9f20b 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -1,4 +1,5 @@ -using NiceHashMiner.Devices; +using NiceHashMiner.Configs; +using NiceHashMiner.Devices; using NiceHashMiner.Enums; using System; using System.Collections.Generic; @@ -88,7 +89,7 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy if (deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; - } else if(deviceType == DeviceType.AMD) { // TODO and 3rdparty enabled + } else if(deviceType == DeviceType.AMD && ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state return MinerPaths.ClaymoreZcashMiner; } else { // supports all DeviceTypes diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index ee66e97..e3e6c24 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -91,6 +91,11 @@ static class ExtraLaunchParametersParser { //new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 //new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 }; + // Zcash claymore + private static List _ClaymoreZcash_Options = new List() { + //// TODO check what is the CUDA_Solver_ParallelBuckets default + new MinerOption(MinerOptionType.ClaymoreZcash_tt, "-tt", "-tt", "0", MinerOptionFlagType.MultiParam, ","), // default 0 + }; private static bool _showLog = true; @@ -302,6 +307,8 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith if (deviceType == DeviceType.NVIDIA) { return Parse(MiningPairs, _eqm_CUDA_Options); } + } else if (minerPath == MinerPaths.ClaymoreZcashMiner) { + return Parse(MiningPairs, _ClaymoreZcash_Options); } } else if (algorithmType == AlgorithmType.DaggerHashimoto) { // ethminer dagger // use if missing compute device for correct mapping From aa028d716c1b60aedb0b6dcf9ba57752de7b2e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 23 Nov 2016 16:59:33 +0100 Subject: [PATCH 118/366] remove legacy config --- NiceHashMiner/Configs/Legacy/Config.cs | 203 ------------------------- 1 file changed, 203 deletions(-) delete mode 100644 NiceHashMiner/Configs/Legacy/Config.cs diff --git a/NiceHashMiner/Configs/Legacy/Config.cs b/NiceHashMiner/Configs/Legacy/Config.cs deleted file mode 100644 index a64c03c..0000000 --- a/NiceHashMiner/Configs/Legacy/Config.cs +++ /dev/null @@ -1,203 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using Newtonsoft.Json; -using NiceHashMiner.Enums; -using NiceHashMiner.Devices; - -namespace NiceHashMiner.Configs -{ - public partial class ConfigManager : BaseLazySingleton { - public class Algo { -#pragma warning disable 649 - public string Name; // only used for easier manual identification in config file - public string ExtraLaunchParameters; - public string UsePassword; - public double BenchmarkSpeed; - public bool Skip; - public bool[] DisabledDevices; -#pragma warning restore 649 - } - - public class Group { -#pragma warning disable 649 - public string Name; // only used for easier manual identification in config file - public int APIBindPort; - public string ExtraLaunchParameters; - public string UsePassword; - public double MinimumProfit; - public int DaggerHashimotoGenerateDevice; - public int[] DisabledDevices; - public Algo[] Algorithms; -#pragma warning restore 649 - - public Group() { - DisabledDevices = new int[0]; - Algorithms = new Algo[0]; - } - } - - public class Config { -#pragma warning disable 649 - public Version ConfigFileVersion; - public int Language; - public string DisplayCurrency; - public bool DebugConsole; - public string BitcoinAddress; - public string WorkerName; - public int ServiceLocation; - public bool AutoStartMining; - public bool HideMiningWindows; - public bool MinimizeToTray; - public int LessThreads; - public int ForceCPUExtension; // 0 - automatic, 1 - SSE2, 2 - AVX, 3 - AVX2 - public int SwitchMinSecondsFixed; - public int SwitchMinSecondsDynamic; - public int SwitchMinSecondsAMD; - public int MinerAPIQueryInterval; - public int MinerRestartDelayMS; - public int MinerAPIGraceSeconds; - public int MinerAPIGraceSecondsAMD; - public int[] BenchmarkTimeLimitsCPU; - public int[] BenchmarkTimeLimitsNVIDIA; - public int[] BenchmarkTimeLimitsAMD; - public bool DisableDetectionNVidia5X; - public bool DisableDetectionNVidia3X; - public bool DisableDetectionNVidia2X; - public bool DisableDetectionAMD; - public bool DisableAMDTempControl; - public bool AutoScaleBTCValues; - public bool StartMiningWhenIdle; - public int MinIdleSeconds; - public bool LogToFile; - public long LogMaxFileSize; // in bytes - public bool ShowDriverVersionWarning; - public bool DisableWindowsErrorReporting; - public bool UseNewSettingsPage; // depriciate this - public bool NVIDIAP0State; - public int ethminerAPIPortNvidia; - public int ethminerAPIPortAMD; - public int ethminerDefaultBlockHeight; - public Group[] Groups; -#pragma warning restore 649 - - public static Config ConfigData; - - public static void InitializeConfig() { - // Set defaults - ConfigData = new Config(); - SetDefaults(); - - try { - if (new FileInfo("config.json").Length > 17000) - ConfigData = JsonConvert.DeserializeObject(File.ReadAllText("config.json"), Globals.JsonSettings); - else { - File.Delete("config.json"); - } - } catch { } - - //if (ConfigData.ConfigFileVersion == null || - // ConfigData.ConfigFileVersion.CompareTo(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) != 0) { - // Helpers.ConsolePrint("CONFIG", "Config file is from an older version of NiceHashMiner.."); - // Helpers.ConsolePrint("CONFIG", "Backing up config.json to config_old.json.."); - // try { - // if (File.Exists("config_old.json")) - // File.Delete("config_old.json"); - // //File.Move("config.json", "config_old.json"); - // } catch { } - - // SetDefaults(); - //} - - if (ConfigData.SwitchMinSecondsFixed <= 0) - ConfigData.SwitchMinSecondsFixed = 90; - if (ConfigData.SwitchMinSecondsDynamic <= 0) - ConfigData.SwitchMinSecondsDynamic = 30; - if (ConfigData.SwitchMinSecondsAMD <= 0) - ConfigData.SwitchMinSecondsAMD = 60; - if (ConfigData.MinerAPIQueryInterval <= 0) - ConfigData.MinerAPIQueryInterval = 5; - if (ConfigData.MinerRestartDelayMS <= 0) - ConfigData.MinerRestartDelayMS = 500; - if (ConfigData.MinerAPIGraceSeconds < 0) - ConfigData.MinerAPIGraceSeconds = 0; - if (ConfigData.MinerAPIGraceSecondsAMD < 0) - ConfigData.MinerAPIGraceSecondsAMD = 0; - if (ConfigData.BenchmarkTimeLimitsCPU == null || ConfigData.BenchmarkTimeLimitsCPU.Length < 3) - ConfigData.BenchmarkTimeLimitsCPU = new int[] { 10, 20, 60 }; - if (ConfigData.BenchmarkTimeLimitsNVIDIA == null || ConfigData.BenchmarkTimeLimitsNVIDIA.Length < 3) - ConfigData.BenchmarkTimeLimitsNVIDIA = new int[] { 10, 20, 60 }; - if (ConfigData.BenchmarkTimeLimitsAMD == null || ConfigData.BenchmarkTimeLimitsAMD.Length < 3) - ConfigData.BenchmarkTimeLimitsAMD = new int[] { 120, 180, 240 }; - if (ConfigData.MinIdleSeconds <= 0) - ConfigData.MinIdleSeconds = 60; - if (ConfigData.LogMaxFileSize <= 0) - ConfigData.LogMaxFileSize = 1048576; - if (ConfigData.DisplayCurrency == null) - ConfigData.DisplayCurrency = "USD"; - } - - public static void SetDefaults() { - ConfigData.ConfigFileVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; - ConfigData.Language = 0; - ConfigData.BitcoinAddress = ""; - ConfigData.WorkerName = "worker1"; - ConfigData.ServiceLocation = 0; - ConfigData.LessThreads = 0; - ConfigData.Groups = new Group[0]; - ConfigData.DebugConsole = false; - ConfigData.HideMiningWindows = false; - ConfigData.MinimizeToTray = false; - ConfigData.AutoStartMining = false; - ConfigData.DisableDetectionNVidia5X = false; - ConfigData.DisableDetectionNVidia3X = false; - ConfigData.DisableDetectionNVidia2X = false; - ConfigData.DisableDetectionAMD = false; - ConfigData.DisableAMDTempControl = false; - ConfigData.AutoScaleBTCValues = true; - ConfigData.StartMiningWhenIdle = false; - ConfigData.LogToFile = true; - ConfigData.LogMaxFileSize = 1048576; - ConfigData.ShowDriverVersionWarning = true; - ConfigData.DisableWindowsErrorReporting = true; - ConfigData.UseNewSettingsPage = true; - ConfigData.NVIDIAP0State = false; - ConfigData.MinerRestartDelayMS = 500; - ConfigData.ethminerAPIPortNvidia = 34561; - ConfigData.ethminerAPIPortAMD = 34562; - ConfigData.ethminerDefaultBlockHeight = 1700000; - ConfigData.MinerAPIGraceSeconds = 30; - ConfigData.MinerAPIGraceSecondsAMD = 60; - ConfigData.SwitchMinSecondsFixed = 90; - ConfigData.SwitchMinSecondsDynamic = 30; - ConfigData.SwitchMinSecondsAMD = 90; - ConfigData.MinIdleSeconds = 60; - ConfigData.DisplayCurrency = "USD"; - - } - - //public static void Commit() { - // try { File.WriteAllText("config.json", JsonConvert.SerializeObject(ConfigData, Formatting.Indented)); } catch { } - //} - - //public static void RebuildGroups() { - // Config.Commit(); - //} - - public static bool ConfigFileExist() { - if (File.Exists("config.json")) - return true; - - return false; - } - - public static void DeleteLegacy() { - try { - if (File.Exists("config.json")) - File.Delete("config.json"); - } catch { } - } - } - } -} From 9b5d819bceb9d20997cac8e15320789786b342f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 23 Nov 2016 18:10:24 +0100 Subject: [PATCH 119/366] remove legacy config, only NVIDIA device detection enable/disable (NVIDIA SM detection removed) --- NiceHashMiner/Configs/ConfigManager.cs | 48 --- .../Configs/DeviceDetectionConfig.cs | 15 +- NiceHashMiner/Configs/GeneralConfig.cs | 2 + NiceHashMiner/Devices/ComputeDeviceManager.cs | 26 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 330 ++++++++---------- NiceHashMiner/Forms/Form_Settings.cs | 30 +- NiceHashMiner/Forms/Form_Settings.resx | 10 +- NiceHashMiner/NiceHashMiner.csproj | 1 - NiceHashMiner/Program.cs | 1 - 9 files changed, 155 insertions(+), 308 deletions(-) diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index 73d28f3..1526505 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -19,54 +19,6 @@ protected ConfigManager() { BenchmarkConfigs = new Dictionary(); } - // TODO remove this eventually, keep for now - public void LegacyConfigMigration() { - // CHECK LEGACY config, migration logic - if (Config.ConfigFileExist()) { - Helpers.ConsolePrint(TAG, "Migrating LEGACY config"); - Config.InitializeConfig(); - - // migrate relevant data - GeneralConfig.Language = (LanguageType)Config.ConfigData.Language; - GeneralConfig.BitcoinAddress = Config.ConfigData.BitcoinAddress; - GeneralConfig.WorkerName = Config.ConfigData.WorkerName; - GeneralConfig.ServiceLocation = Config.ConfigData.ServiceLocation; - //GeneralConfig.LessThreads = Config.ConfigData.LessThreads; - //GeneralConfig.Groups = new Group[0] = Config.ConfigData.Groups = new Group[0]; - GeneralConfig.DebugConsole = Config.ConfigData.DebugConsole; - GeneralConfig.HideMiningWindows = Config.ConfigData.HideMiningWindows; - GeneralConfig.MinimizeToTray = Config.ConfigData.MinimizeToTray; - //GeneralConfig.AutoStartMining = Config.ConfigData.AutoStartMining; - GeneralConfig.DeviceDetection.DisableDetectionNVidia5X = Config.ConfigData.DisableDetectionNVidia5X; - GeneralConfig.DeviceDetection.DisableDetectionNVidia3X = Config.ConfigData.DisableDetectionNVidia3X; - GeneralConfig.DeviceDetection.DisableDetectionNVidia2X = Config.ConfigData.DisableDetectionNVidia2X; - GeneralConfig.DeviceDetection.DisableDetectionAMD = Config.ConfigData.DisableDetectionAMD; - //GeneralConfig.DisableAMDTempControl = Config.ConfigData.DisableAMDTempControl; - GeneralConfig.AutoScaleBTCValues = Config.ConfigData.AutoScaleBTCValues; - GeneralConfig.StartMiningWhenIdle = Config.ConfigData.StartMiningWhenIdle; - GeneralConfig.LogToFile = Config.ConfigData.LogToFile; - GeneralConfig.LogMaxFileSize = Config.ConfigData.LogMaxFileSize; - GeneralConfig.ShowDriverVersionWarning = Config.ConfigData.ShowDriverVersionWarning; - GeneralConfig.DisableWindowsErrorReporting = Config.ConfigData.DisableWindowsErrorReporting; - //GeneralConfig.UseNewSettingsPage = Config.ConfigData.UseNewSettingsPage; - GeneralConfig.NVIDIAP0State = Config.ConfigData.NVIDIAP0State; - GeneralConfig.MinerRestartDelayMS = Config.ConfigData.MinerRestartDelayMS; - GeneralConfig.ethminerDefaultBlockHeight = Config.ConfigData.ethminerDefaultBlockHeight; - //GeneralConfig.MinerAPIGraceSeconds = Config.ConfigData.MinerAPIGraceSeconds; - //GeneralConfig.MinerAPIGraceSecondsAMD = Config.ConfigData.MinerAPIGraceSecondsAMD; - GeneralConfig.SwitchMinSecondsFixed = Config.ConfigData.SwitchMinSecondsFixed; - GeneralConfig.SwitchMinSecondsDynamic = Config.ConfigData.SwitchMinSecondsDynamic; - GeneralConfig.SwitchMinSecondsAMD = Config.ConfigData.SwitchMinSecondsAMD; - GeneralConfig.MinIdleSeconds = Config.ConfigData.MinIdleSeconds; - GeneralConfig.DisplayCurrency = Config.ConfigData.DisplayCurrency; - - // save migration - GeneralConfig.Commit(); - - Config.DeleteLegacy(); - } - } - public void CommitBenchmarks() { foreach (var benchConfig in BenchmarkConfigs) { benchConfig.Value.Commit(); diff --git a/NiceHashMiner/Configs/DeviceDetectionConfig.cs b/NiceHashMiner/Configs/DeviceDetectionConfig.cs index 0474be9..c390aa8 100644 --- a/NiceHashMiner/Configs/DeviceDetectionConfig.cs +++ b/NiceHashMiner/Configs/DeviceDetectionConfig.cs @@ -3,27 +3,20 @@ using System.Text; namespace NiceHashMiner.Configs -{ +{ /// /// DeviceDetectionConfig is used to enable/disable detection of certain GPU type devices /// /// [Serializable] - public class DeviceDetectionConfig - { - public bool DisableDetectionNVidia6X { get; set; } - public bool DisableDetectionNVidia5X { get; set; } - public bool DisableDetectionNVidia3X { get; set; } - public bool DisableDetectionNVidia2X { get; set; } + public class DeviceDetectionConfig { public bool DisableDetectionAMD { get; set; } + public bool DisableDetectionNVIDIA { get; set; } public DeviceDetectionConfig() { - DisableDetectionNVidia6X = false; - DisableDetectionNVidia5X = false; - DisableDetectionNVidia3X = false; - DisableDetectionNVidia2X = false; DisableDetectionAMD = false; + DisableDetectionNVIDIA = false; } } } diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfig.cs index b0c09d0..d21927e 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfig.cs @@ -64,6 +64,8 @@ public int MinerRestartDelayMS { } public BenchmarkTimeLimitsConfig BenchmarkTimeLimits { get; set; } + + // TODO deprecate this public DeviceDetectionConfig DeviceDetection { get; set; } public bool DisableAMDTempControl { get; set; } diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 56884c9..777a335 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -307,26 +307,7 @@ static private void QueryCudaDevicesOutputErrorDataReceived(object sender, DataR } public static bool IsSkipNVIDIA() { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia2X - && ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia3X - && ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia5X - && ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X; - } - - static private bool IsSMGroupSkip(int sm_major) { - if (sm_major == 6) { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X; - } - if (sm_major == 5) { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia5X; - } - if (sm_major == 3) { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia3X; - } - if (sm_major == 2) { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia2X; - } - return false; + return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; } static public void QueryCudaDevices() { @@ -375,10 +356,9 @@ static public void QueryCudaDevices() { isUnderSM21 = isUnderSM2_major && isUnderSM1_minor; } //bool isOverSM6 = cudaDev.SM_major > 6; - bool isDisabledGroup = IsSMGroupSkip(cudaDev.SM_major); - bool skip = isUnderSM21 || isDisabledGroup; + bool skip = isUnderSM21; string skipOrAdd = skip ? "SKIPED" : "ADDED"; - string isDisabledGroupStr = isDisabledGroup ? " (SM group disabled)" : ""; + string isDisabledGroupStr = ""; // TODO remove string etherumCapableStr = cudaDev.IsEtherumCapable() ? "YES" : "NO"; stringBuilder.AppendLine(String.Format("\t{0} device{1}:", skipOrAdd, isDisabledGroupStr)); stringBuilder.AppendLine(String.Format("\t\tID: {0}", cudaDev.DeviceID.ToString())); diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 8b1c8ea..fddae81 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -24,7 +24,6 @@ protected override void Dispose(bool disposing) { /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form_Settings)); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.tabControlGeneral = new System.Windows.Forms.TabControl(); this.tabPageGeneral = new System.Windows.Forms.TabPage(); @@ -34,9 +33,7 @@ private void InitializeComponent() { this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); this.checkBox_HideMiningWindows = new System.Windows.Forms.CheckBox(); this.checkBox_MinimizeToTray = new System.Windows.Forms.CheckBox(); - this.checkBox_DisableDetectionNVidia6X = new System.Windows.Forms.CheckBox(); this.pictureBox_DisableDefaultOptimizations = new System.Windows.Forms.PictureBox(); - this.checkBox_DisableDetectionNVidia5X = new System.Windows.Forms.CheckBox(); this.pictureBox_AMD_DisableAMDTempControl = new System.Windows.Forms.PictureBox(); this.pictureBox_NVIDIAP0State = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableWindowsErrorReporting = new System.Windows.Forms.PictureBox(); @@ -44,15 +41,11 @@ private void InitializeComponent() { this.pictureBox_StartMiningWhenIdle = new System.Windows.Forms.PictureBox(); this.pictureBox_AutoScaleBTCValues = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableDetectionAMD = new System.Windows.Forms.PictureBox(); - this.pictureBox_DisableDetectionNVidia2X = new System.Windows.Forms.PictureBox(); - this.pictureBox_DisableDetectionNVidia3X = new System.Windows.Forms.PictureBox(); - this.pictureBox_DisableDetectionNVidia5X = new System.Windows.Forms.PictureBox(); - this.pictureBox_DisableDetectionNVidia6X = new System.Windows.Forms.PictureBox(); + this.pictureBox_DisableDetectionNVIDIA = new System.Windows.Forms.PictureBox(); this.pictureBox_AutoStartMining = new System.Windows.Forms.PictureBox(); this.pictureBox_MinimizeToTray = new System.Windows.Forms.PictureBox(); this.pictureBox_HideMiningWindows = new System.Windows.Forms.PictureBox(); - this.checkBox_DisableDetectionNVidia3X = new System.Windows.Forms.CheckBox(); - this.checkBox_DisableDetectionNVidia2X = new System.Windows.Forms.CheckBox(); + this.checkBox_DisableDetectionNVIDIA = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDetectionAMD = new System.Windows.Forms.CheckBox(); this.checkBox_NVIDIAP0State = new System.Windows.Forms.CheckBox(); this.checkBox_AutoScaleBTCValues = new System.Windows.Forms.CheckBox(); @@ -123,19 +116,21 @@ private void InitializeComponent() { this.textBox_MinerRestartDelayMS = new System.Windows.Forms.TextBox(); this.textBox_MinerAPIQueryInterval = new System.Windows.Forms.TextBox(); this.groupBoxBenchmarkTimeLimits = new System.Windows.Forms.GroupBox(); - this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.tabPageDevicesAlgos = new System.Windows.Forms.TabPage(); - this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); - this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); this.groupBoxAlgorithmSettings = new System.Windows.Forms.GroupBox(); - this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.buttonAllProfit = new System.Windows.Forms.Button(); this.buttonSelectedProfit = new System.Windows.Forms.Button(); this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); + this.checkBoxEnable3rdPartyMiners = new System.Windows.Forms.CheckBox(); + this.pictureBoxEnable3rdPartyMiners = new System.Windows.Forms.PictureBox(); + this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); + this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); + this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); @@ -147,10 +142,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_StartMiningWhenIdle)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoScaleBTCValues)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionAMD)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia2X)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia3X)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia5X)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia6X)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVIDIA)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinimizeToTray)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_HideMiningWindows)).BeginInit(); @@ -183,6 +175,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxEnable3rdPartyMiners)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -223,9 +216,7 @@ private void InitializeComponent() { this.groupBox_Misc.Controls.Add(this.checkBox_AutoStartMining); this.groupBox_Misc.Controls.Add(this.checkBox_HideMiningWindows); this.groupBox_Misc.Controls.Add(this.checkBox_MinimizeToTray); - this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVidia6X); this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDefaultOptimizations); - this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVidia5X); this.groupBox_Misc.Controls.Add(this.pictureBox_AMD_DisableAMDTempControl); this.groupBox_Misc.Controls.Add(this.pictureBox_NVIDIAP0State); this.groupBox_Misc.Controls.Add(this.pictureBox_DisableWindowsErrorReporting); @@ -233,15 +224,13 @@ private void InitializeComponent() { this.groupBox_Misc.Controls.Add(this.pictureBox_StartMiningWhenIdle); this.groupBox_Misc.Controls.Add(this.pictureBox_AutoScaleBTCValues); this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionAMD); - this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVidia2X); - this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVidia3X); - this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVidia5X); - this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVidia6X); + this.groupBox_Misc.Controls.Add(this.pictureBoxEnable3rdPartyMiners); + this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVIDIA); this.groupBox_Misc.Controls.Add(this.pictureBox_AutoStartMining); this.groupBox_Misc.Controls.Add(this.pictureBox_MinimizeToTray); this.groupBox_Misc.Controls.Add(this.pictureBox_HideMiningWindows); - this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVidia3X); - this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVidia2X); + this.groupBox_Misc.Controls.Add(this.checkBoxEnable3rdPartyMiners); + this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVIDIA); this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionAMD); this.groupBox_Misc.Controls.Add(this.checkBox_NVIDIAP0State); this.groupBox_Misc.Controls.Add(this.checkBox_AutoScaleBTCValues); @@ -258,7 +247,7 @@ private void InitializeComponent() { // checkBox_DisableDefaultOptimizations // this.checkBox_DisableDefaultOptimizations.AutoSize = true; - this.checkBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(6, 313); + this.checkBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(6, 268); this.checkBox_DisableDefaultOptimizations.Name = "checkBox_DisableDefaultOptimizations"; this.checkBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(163, 17); this.checkBox_DisableDefaultOptimizations.TabIndex = 365; @@ -269,7 +258,7 @@ private void InitializeComponent() { // checkBox_AMD_DisableAMDTempControl // this.checkBox_AMD_DisableAMDTempControl.AutoSize = true; - this.checkBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(6, 292); + this.checkBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(6, 247); this.checkBox_AMD_DisableAMDTempControl.Name = "checkBox_AMD_DisableAMDTempControl"; this.checkBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(145, 17); this.checkBox_AMD_DisableAMDTempControl.TabIndex = 365; @@ -307,40 +296,20 @@ private void InitializeComponent() { this.checkBox_MinimizeToTray.Text = "MinimizeToTray"; this.checkBox_MinimizeToTray.UseVisualStyleBackColor = true; // - // checkBox_DisableDetectionNVidia6X - // - this.checkBox_DisableDetectionNVidia6X.AutoSize = true; - this.checkBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(6, 82); - this.checkBox_DisableDetectionNVidia6X.Name = "checkBox_DisableDetectionNVidia6X"; - this.checkBox_DisableDetectionNVidia6X.Size = new System.Drawing.Size(151, 17); - this.checkBox_DisableDetectionNVidia6X.TabIndex = 317; - this.checkBox_DisableDetectionNVidia6X.Text = "DisableDetectionNVidia6X"; - this.checkBox_DisableDetectionNVidia6X.UseVisualStyleBackColor = true; - // // pictureBox_DisableDefaultOptimizations // this.pictureBox_DisableDefaultOptimizations.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(205, 312); + this.pictureBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(205, 267); this.pictureBox_DisableDefaultOptimizations.Name = "pictureBox_DisableDefaultOptimizations"; this.pictureBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDefaultOptimizations.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; this.pictureBox_DisableDefaultOptimizations.TabIndex = 364; this.pictureBox_DisableDefaultOptimizations.TabStop = false; // - // checkBox_DisableDetectionNVidia5X - // - this.checkBox_DisableDetectionNVidia5X.AutoSize = true; - this.checkBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(6, 103); - this.checkBox_DisableDetectionNVidia5X.Name = "checkBox_DisableDetectionNVidia5X"; - this.checkBox_DisableDetectionNVidia5X.Size = new System.Drawing.Size(151, 17); - this.checkBox_DisableDetectionNVidia5X.TabIndex = 317; - this.checkBox_DisableDetectionNVidia5X.Text = "DisableDetectionNVidia5X"; - this.checkBox_DisableDetectionNVidia5X.UseVisualStyleBackColor = true; - // // pictureBox_AMD_DisableAMDTempControl // this.pictureBox_AMD_DisableAMDTempControl.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(205, 291); + this.pictureBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(205, 246); this.pictureBox_AMD_DisableAMDTempControl.Name = "pictureBox_AMD_DisableAMDTempControl"; this.pictureBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(18, 18); this.pictureBox_AMD_DisableAMDTempControl.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -350,7 +319,7 @@ private void InitializeComponent() { // pictureBox_NVIDIAP0State // this.pictureBox_NVIDIAP0State.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_NVIDIAP0State.Location = new System.Drawing.Point(205, 270); + this.pictureBox_NVIDIAP0State.Location = new System.Drawing.Point(205, 225); this.pictureBox_NVIDIAP0State.Name = "pictureBox_NVIDIAP0State"; this.pictureBox_NVIDIAP0State.Size = new System.Drawing.Size(18, 18); this.pictureBox_NVIDIAP0State.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -360,7 +329,7 @@ private void InitializeComponent() { // pictureBox_DisableWindowsErrorReporting // this.pictureBox_DisableWindowsErrorReporting.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(205, 249); + this.pictureBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(205, 204); this.pictureBox_DisableWindowsErrorReporting.Name = "pictureBox_DisableWindowsErrorReporting"; this.pictureBox_DisableWindowsErrorReporting.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableWindowsErrorReporting.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -370,7 +339,7 @@ private void InitializeComponent() { // pictureBox_ShowDriverVersionWarning // this.pictureBox_ShowDriverVersionWarning.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(205, 228); + this.pictureBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(205, 183); this.pictureBox_ShowDriverVersionWarning.Name = "pictureBox_ShowDriverVersionWarning"; this.pictureBox_ShowDriverVersionWarning.Size = new System.Drawing.Size(18, 18); this.pictureBox_ShowDriverVersionWarning.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -380,7 +349,7 @@ private void InitializeComponent() { // pictureBox_StartMiningWhenIdle // this.pictureBox_StartMiningWhenIdle.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_StartMiningWhenIdle.Location = new System.Drawing.Point(205, 207); + this.pictureBox_StartMiningWhenIdle.Location = new System.Drawing.Point(205, 162); this.pictureBox_StartMiningWhenIdle.Name = "pictureBox_StartMiningWhenIdle"; this.pictureBox_StartMiningWhenIdle.Size = new System.Drawing.Size(18, 18); this.pictureBox_StartMiningWhenIdle.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -390,7 +359,7 @@ private void InitializeComponent() { // pictureBox_AutoScaleBTCValues // this.pictureBox_AutoScaleBTCValues.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AutoScaleBTCValues.Location = new System.Drawing.Point(205, 186); + this.pictureBox_AutoScaleBTCValues.Location = new System.Drawing.Point(205, 141); this.pictureBox_AutoScaleBTCValues.Name = "pictureBox_AutoScaleBTCValues"; this.pictureBox_AutoScaleBTCValues.Size = new System.Drawing.Size(18, 18); this.pictureBox_AutoScaleBTCValues.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -400,52 +369,22 @@ private void InitializeComponent() { // pictureBox_DisableDetectionAMD // this.pictureBox_DisableDetectionAMD.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionAMD.Location = new System.Drawing.Point(205, 165); + this.pictureBox_DisableDetectionAMD.Location = new System.Drawing.Point(205, 120); this.pictureBox_DisableDetectionAMD.Name = "pictureBox_DisableDetectionAMD"; this.pictureBox_DisableDetectionAMD.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionAMD.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; this.pictureBox_DisableDetectionAMD.TabIndex = 364; this.pictureBox_DisableDetectionAMD.TabStop = false; // - // pictureBox_DisableDetectionNVidia2X - // - this.pictureBox_DisableDetectionNVidia2X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(205, 144); - this.pictureBox_DisableDetectionNVidia2X.Name = "pictureBox_DisableDetectionNVidia2X"; - this.pictureBox_DisableDetectionNVidia2X.Size = new System.Drawing.Size(18, 18); - this.pictureBox_DisableDetectionNVidia2X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_DisableDetectionNVidia2X.TabIndex = 364; - this.pictureBox_DisableDetectionNVidia2X.TabStop = false; - // - // pictureBox_DisableDetectionNVidia3X - // - this.pictureBox_DisableDetectionNVidia3X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(205, 123); - this.pictureBox_DisableDetectionNVidia3X.Name = "pictureBox_DisableDetectionNVidia3X"; - this.pictureBox_DisableDetectionNVidia3X.Size = new System.Drawing.Size(18, 18); - this.pictureBox_DisableDetectionNVidia3X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_DisableDetectionNVidia3X.TabIndex = 364; - this.pictureBox_DisableDetectionNVidia3X.TabStop = false; - // - // pictureBox_DisableDetectionNVidia5X - // - this.pictureBox_DisableDetectionNVidia5X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia5X.Location = new System.Drawing.Point(205, 102); - this.pictureBox_DisableDetectionNVidia5X.Name = "pictureBox_DisableDetectionNVidia5X"; - this.pictureBox_DisableDetectionNVidia5X.Size = new System.Drawing.Size(18, 18); - this.pictureBox_DisableDetectionNVidia5X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_DisableDetectionNVidia5X.TabIndex = 364; - this.pictureBox_DisableDetectionNVidia5X.TabStop = false; - // - // pictureBox_DisableDetectionNVidia6X - // - this.pictureBox_DisableDetectionNVidia6X.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVidia6X.Location = new System.Drawing.Point(205, 81); - this.pictureBox_DisableDetectionNVidia6X.Name = "pictureBox_DisableDetectionNVidia6X"; - this.pictureBox_DisableDetectionNVidia6X.Size = new System.Drawing.Size(18, 18); - this.pictureBox_DisableDetectionNVidia6X.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_DisableDetectionNVidia6X.TabIndex = 364; - this.pictureBox_DisableDetectionNVidia6X.TabStop = false; + // pictureBox_DisableDetectionNVIDIA + // + this.pictureBox_DisableDetectionNVIDIA.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_DisableDetectionNVIDIA.Location = new System.Drawing.Point(205, 99); + this.pictureBox_DisableDetectionNVIDIA.Name = "pictureBox_DisableDetectionNVIDIA"; + this.pictureBox_DisableDetectionNVIDIA.Size = new System.Drawing.Size(18, 18); + this.pictureBox_DisableDetectionNVIDIA.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_DisableDetectionNVIDIA.TabIndex = 364; + this.pictureBox_DisableDetectionNVIDIA.TabStop = false; // // pictureBox_AutoStartMining // @@ -477,30 +416,20 @@ private void InitializeComponent() { this.pictureBox_HideMiningWindows.TabIndex = 364; this.pictureBox_HideMiningWindows.TabStop = false; // - // checkBox_DisableDetectionNVidia3X - // - this.checkBox_DisableDetectionNVidia3X.AutoSize = true; - this.checkBox_DisableDetectionNVidia3X.Location = new System.Drawing.Point(6, 124); - this.checkBox_DisableDetectionNVidia3X.Name = "checkBox_DisableDetectionNVidia3X"; - this.checkBox_DisableDetectionNVidia3X.Size = new System.Drawing.Size(151, 17); - this.checkBox_DisableDetectionNVidia3X.TabIndex = 318; - this.checkBox_DisableDetectionNVidia3X.Text = "DisableDetectionNVidia3X"; - this.checkBox_DisableDetectionNVidia3X.UseVisualStyleBackColor = true; - // - // checkBox_DisableDetectionNVidia2X + // checkBox_DisableDetectionNVIDIA // - this.checkBox_DisableDetectionNVidia2X.AutoSize = true; - this.checkBox_DisableDetectionNVidia2X.Location = new System.Drawing.Point(6, 145); - this.checkBox_DisableDetectionNVidia2X.Name = "checkBox_DisableDetectionNVidia2X"; - this.checkBox_DisableDetectionNVidia2X.Size = new System.Drawing.Size(151, 17); - this.checkBox_DisableDetectionNVidia2X.TabIndex = 319; - this.checkBox_DisableDetectionNVidia2X.Text = "DisableDetectionNVidia2X"; - this.checkBox_DisableDetectionNVidia2X.UseVisualStyleBackColor = true; + this.checkBox_DisableDetectionNVIDIA.AutoSize = true; + this.checkBox_DisableDetectionNVIDIA.Location = new System.Drawing.Point(6, 100); + this.checkBox_DisableDetectionNVIDIA.Name = "checkBox_DisableDetectionNVIDIA"; + this.checkBox_DisableDetectionNVIDIA.Size = new System.Drawing.Size(143, 17); + this.checkBox_DisableDetectionNVIDIA.TabIndex = 319; + this.checkBox_DisableDetectionNVIDIA.Text = "DisableDetectionNVIDIA"; + this.checkBox_DisableDetectionNVIDIA.UseVisualStyleBackColor = true; // // checkBox_DisableDetectionAMD // this.checkBox_DisableDetectionAMD.AutoSize = true; - this.checkBox_DisableDetectionAMD.Location = new System.Drawing.Point(6, 166); + this.checkBox_DisableDetectionAMD.Location = new System.Drawing.Point(6, 121); this.checkBox_DisableDetectionAMD.Name = "checkBox_DisableDetectionAMD"; this.checkBox_DisableDetectionAMD.Size = new System.Drawing.Size(131, 17); this.checkBox_DisableDetectionAMD.TabIndex = 320; @@ -510,7 +439,7 @@ private void InitializeComponent() { // checkBox_NVIDIAP0State // this.checkBox_NVIDIAP0State.AutoSize = true; - this.checkBox_NVIDIAP0State.Location = new System.Drawing.Point(6, 271); + this.checkBox_NVIDIAP0State.Location = new System.Drawing.Point(6, 226); this.checkBox_NVIDIAP0State.Name = "checkBox_NVIDIAP0State"; this.checkBox_NVIDIAP0State.Size = new System.Drawing.Size(100, 17); this.checkBox_NVIDIAP0State.TabIndex = 326; @@ -520,7 +449,7 @@ private void InitializeComponent() { // checkBox_AutoScaleBTCValues // this.checkBox_AutoScaleBTCValues.AutoSize = true; - this.checkBox_AutoScaleBTCValues.Location = new System.Drawing.Point(6, 187); + this.checkBox_AutoScaleBTCValues.Location = new System.Drawing.Point(6, 142); this.checkBox_AutoScaleBTCValues.Name = "checkBox_AutoScaleBTCValues"; this.checkBox_AutoScaleBTCValues.Size = new System.Drawing.Size(128, 17); this.checkBox_AutoScaleBTCValues.TabIndex = 321; @@ -530,7 +459,7 @@ private void InitializeComponent() { // checkBox_DisableWindowsErrorReporting // this.checkBox_DisableWindowsErrorReporting.AutoSize = true; - this.checkBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(6, 250); + this.checkBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(6, 205); this.checkBox_DisableWindowsErrorReporting.Name = "checkBox_DisableWindowsErrorReporting"; this.checkBox_DisableWindowsErrorReporting.Size = new System.Drawing.Size(173, 17); this.checkBox_DisableWindowsErrorReporting.TabIndex = 324; @@ -540,7 +469,7 @@ private void InitializeComponent() { // checkBox_StartMiningWhenIdle // this.checkBox_StartMiningWhenIdle.AutoSize = true; - this.checkBox_StartMiningWhenIdle.Location = new System.Drawing.Point(6, 208); + this.checkBox_StartMiningWhenIdle.Location = new System.Drawing.Point(6, 163); this.checkBox_StartMiningWhenIdle.Name = "checkBox_StartMiningWhenIdle"; this.checkBox_StartMiningWhenIdle.Size = new System.Drawing.Size(125, 17); this.checkBox_StartMiningWhenIdle.TabIndex = 322; @@ -550,7 +479,7 @@ private void InitializeComponent() { // checkBox_ShowDriverVersionWarning // this.checkBox_ShowDriverVersionWarning.AutoSize = true; - this.checkBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(6, 229); + this.checkBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(6, 184); this.checkBox_ShowDriverVersionWarning.Name = "checkBox_ShowDriverVersionWarning"; this.checkBox_ShowDriverVersionWarning.Size = new System.Drawing.Size(156, 17); this.checkBox_ShowDriverVersionWarning.TabIndex = 323; @@ -1252,36 +1181,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.TabStop = false; this.groupBoxBenchmarkTimeLimits.Text = "Benchmark Time Limits:"; // - // benchmarkLimitControlNVIDIA - // - this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; - this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); - this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; - this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlNVIDIA.TabIndex = 4; - this.benchmarkLimitControlNVIDIA.TimeLimits = null; - // - // benchmarkLimitControlCPU - // - this.benchmarkLimitControlCPU.GroupName = "CPU"; - this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); - this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; - this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlCPU.TabIndex = 3; - this.benchmarkLimitControlCPU.TimeLimits = null; - // - // benchmarkLimitControlAMD - // - this.benchmarkLimitControlAMD.GroupName = "AMD"; - this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); - this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; - this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlAMD.TabIndex = 5; - this.benchmarkLimitControlAMD.TimeLimits = null; - // // tabPageDevicesAlgos // this.tabPageDevicesAlgos.Controls.Add(this.devicesListViewEnableControl1); @@ -1297,27 +1196,6 @@ private void InitializeComponent() { this.tabPageDevicesAlgos.Text = "Devices/Algorithms"; this.tabPageDevicesAlgos.UseVisualStyleBackColor = true; // - // devicesListViewEnableControl1 - // - this.devicesListViewEnableControl1.AutoSaveChange = true; - this.devicesListViewEnableControl1.BenchmarkCalculation = null; - this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; - this.devicesListViewEnableControl1.IsInBenchmark = false; - this.devicesListViewEnableControl1.IsMining = false; - this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); - this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; - this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.SetAllEnabled = false; - this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); - this.devicesListViewEnableControl1.TabIndex = 397; - // - // algorithmSettingsControl1 - // - this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); - this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; - this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); - this.algorithmSettingsControl1.TabIndex = 396; - // // groupBoxAlgorithmSettings // this.groupBoxAlgorithmSettings.Controls.Add(this.algorithmsListView1); @@ -1328,16 +1206,6 @@ private void InitializeComponent() { this.groupBoxAlgorithmSettings.TabStop = false; this.groupBoxAlgorithmSettings.Text = "Algorithm settings for selected device:"; // - // algorithmsListView1 - // - this.algorithmsListView1.BenchmarkCalculation = null; - this.algorithmsListView1.ComunicationInterface = null; - this.algorithmsListView1.IsInBenchmark = false; - this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); - this.algorithmsListView1.Name = "algorithmsListView1"; - this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); - this.algorithmsListView1.TabIndex = 2; - // // buttonAllProfit // this.buttonAllProfit.Location = new System.Drawing.Point(364, 6); @@ -1391,6 +1259,87 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // + // checkBoxEnable3rdPartyMiners + // + this.checkBoxEnable3rdPartyMiners.AutoSize = true; + this.checkBoxEnable3rdPartyMiners.Location = new System.Drawing.Point(6, 80); + this.checkBoxEnable3rdPartyMiners.Name = "checkBoxEnable3rdPartyMiners"; + this.checkBoxEnable3rdPartyMiners.Size = new System.Drawing.Size(129, 17); + this.checkBoxEnable3rdPartyMiners.TabIndex = 319; + this.checkBoxEnable3rdPartyMiners.Text = "Enable3rdPartyMiners"; + this.checkBoxEnable3rdPartyMiners.UseVisualStyleBackColor = true; + // + // pictureBoxEnable3rdPartyMiners + // + this.pictureBoxEnable3rdPartyMiners.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBoxEnable3rdPartyMiners.Location = new System.Drawing.Point(205, 79); + this.pictureBoxEnable3rdPartyMiners.Name = "pictureBoxEnable3rdPartyMiners"; + this.pictureBoxEnable3rdPartyMiners.Size = new System.Drawing.Size(18, 18); + this.pictureBoxEnable3rdPartyMiners.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBoxEnable3rdPartyMiners.TabIndex = 364; + this.pictureBoxEnable3rdPartyMiners.TabStop = false; + // + // benchmarkLimitControlNVIDIA + // + this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; + this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); + this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; + this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlNVIDIA.TabIndex = 4; + this.benchmarkLimitControlNVIDIA.TimeLimits = null; + // + // benchmarkLimitControlCPU + // + this.benchmarkLimitControlCPU.GroupName = "CPU"; + this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); + this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; + this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlCPU.TabIndex = 3; + this.benchmarkLimitControlCPU.TimeLimits = null; + // + // benchmarkLimitControlAMD + // + this.benchmarkLimitControlAMD.GroupName = "AMD"; + this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); + this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; + this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlAMD.TabIndex = 5; + this.benchmarkLimitControlAMD.TimeLimits = null; + // + // devicesListViewEnableControl1 + // + this.devicesListViewEnableControl1.AutoSaveChange = true; + this.devicesListViewEnableControl1.BenchmarkCalculation = null; + this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; + this.devicesListViewEnableControl1.IsInBenchmark = false; + this.devicesListViewEnableControl1.IsMining = false; + this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); + this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; + this.devicesListViewEnableControl1.SaveToGeneralConfig = false; + this.devicesListViewEnableControl1.SetAllEnabled = false; + this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); + this.devicesListViewEnableControl1.TabIndex = 397; + // + // algorithmSettingsControl1 + // + this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); + this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; + this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); + this.algorithmSettingsControl1.TabIndex = 396; + // + // algorithmsListView1 + // + this.algorithmsListView1.BenchmarkCalculation = null; + this.algorithmsListView1.ComunicationInterface = null; + this.algorithmsListView1.IsInBenchmark = false; + this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); + this.algorithmsListView1.Name = "algorithmsListView1"; + this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); + this.algorithmsListView1.TabIndex = 2; + // // Form_Settings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1401,7 +1350,6 @@ private void InitializeComponent() { this.Controls.Add(this.tabControlGeneral); this.Controls.Add(this.buttonCloseNoSave); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form_Settings"; @@ -1419,10 +1367,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_StartMiningWhenIdle)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoScaleBTCValues)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionAMD)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia2X)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia3X)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia5X)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVidia6X)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVIDIA)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinimizeToTray)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_HideMiningWindows)).EndInit(); @@ -1459,6 +1404,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxEnable3rdPartyMiners)).EndInit(); this.ResumeLayout(false); } @@ -1513,10 +1459,7 @@ private void InitializeComponent() { private System.Windows.Forms.GroupBox groupBox_Misc; private System.Windows.Forms.CheckBox checkBox_HideMiningWindows; private System.Windows.Forms.CheckBox checkBox_MinimizeToTray; - private System.Windows.Forms.CheckBox checkBox_DisableDetectionNVidia6X; - private System.Windows.Forms.CheckBox checkBox_DisableDetectionNVidia5X; - private System.Windows.Forms.CheckBox checkBox_DisableDetectionNVidia3X; - private System.Windows.Forms.CheckBox checkBox_DisableDetectionNVidia2X; + private System.Windows.Forms.CheckBox checkBox_DisableDetectionNVIDIA; private System.Windows.Forms.CheckBox checkBox_DisableDetectionAMD; private System.Windows.Forms.CheckBox checkBox_NVIDIAP0State; private System.Windows.Forms.CheckBox checkBox_AutoScaleBTCValues; @@ -1542,10 +1485,7 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_StartMiningWhenIdle; private System.Windows.Forms.PictureBox pictureBox_AutoScaleBTCValues; private System.Windows.Forms.PictureBox pictureBox_DisableDetectionAMD; - private System.Windows.Forms.PictureBox pictureBox_DisableDetectionNVidia2X; - private System.Windows.Forms.PictureBox pictureBox_DisableDetectionNVidia3X; - private System.Windows.Forms.PictureBox pictureBox_DisableDetectionNVidia5X; - private System.Windows.Forms.PictureBox pictureBox_DisableDetectionNVidia6X; + private System.Windows.Forms.PictureBox pictureBox_DisableDetectionNVIDIA; private System.Windows.Forms.PictureBox pictureBox_MinimizeToTray; private System.Windows.Forms.PictureBox pictureBox_HideMiningWindows; private System.Windows.Forms.PictureBox pictureBox_DebugConsole; @@ -1576,6 +1516,8 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_DisableDefaultOptimizations; private System.Windows.Forms.CheckBox checkBox_ContinueMiningIfNoInternetAccess; private System.Windows.Forms.PictureBox pictureBox_ContinueMiningIfNoInternetAccess; + private System.Windows.Forms.PictureBox pictureBoxEnable3rdPartyMiners; + private System.Windows.Forms.CheckBox checkBoxEnable3rdPartyMiners; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index c842ca8..b09771c 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -145,15 +145,9 @@ private void InitializeToolTip() { benchmarkLimitControlNVIDIA.SetToolTip(ref toolTip1, "NVIDIA GPUs"); benchmarkLimitControlAMD.SetToolTip(ref toolTip1, "AMD GPUs"); - toolTip1.SetToolTip(this.checkBox_DisableDetectionNVidia6X, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA6.x")); - toolTip1.SetToolTip(this.checkBox_DisableDetectionNVidia5X, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA5.x")); - toolTip1.SetToolTip(this.checkBox_DisableDetectionNVidia3X, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA3.x")); - toolTip1.SetToolTip(this.checkBox_DisableDetectionNVidia2X, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA2.x")); + toolTip1.SetToolTip(this.checkBox_DisableDetectionNVIDIA, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA")); toolTip1.SetToolTip(this.checkBox_DisableDetectionAMD, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "AMD")); - toolTip1.SetToolTip(this.pictureBox_DisableDetectionNVidia6X, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA6.x")); - toolTip1.SetToolTip(this.pictureBox_DisableDetectionNVidia5X, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA5.x")); - toolTip1.SetToolTip(this.pictureBox_DisableDetectionNVidia3X, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA3.x")); - toolTip1.SetToolTip(this.pictureBox_DisableDetectionNVidia2X, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA2.x")); + toolTip1.SetToolTip(this.pictureBox_DisableDetectionNVIDIA, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "NVIDIA")); toolTip1.SetToolTip(this.pictureBox_DisableDetectionAMD, String.Format(International.GetText("Form_Settings_ToolTip_checkBox_DisableDetection"), "AMD")); toolTip1.SetToolTip(this.checkBox_AutoScaleBTCValues, International.GetText("Form_Settings_ToolTip_checkBox_AutoScaleBTCValues")); @@ -233,10 +227,7 @@ private void InitializeGeneralTabTranslations() { checkBox_AutoStartMining.Text = International.GetText("Form_Settings_General_AutoStartMining"); checkBox_HideMiningWindows.Text = International.GetText("Form_Settings_General_HideMiningWindows"); checkBox_MinimizeToTray.Text = International.GetText("Form_Settings_General_MinimizeToTray"); - checkBox_DisableDetectionNVidia6X.Text = String.Format(International.GetText("Form_Settings_General_DisableDetection"), "NVIDIA6.x"); - checkBox_DisableDetectionNVidia5X.Text = String.Format(International.GetText("Form_Settings_General_DisableDetection"), "NVIDIA5.x"); - checkBox_DisableDetectionNVidia3X.Text = String.Format(International.GetText("Form_Settings_General_DisableDetection"), "NVIDIA3.x"); - checkBox_DisableDetectionNVidia2X.Text = String.Format(International.GetText("Form_Settings_General_DisableDetection"), "NVIDIA2.x"); + checkBox_DisableDetectionNVIDIA.Text = String.Format(International.GetText("Form_Settings_General_DisableDetection"), "NVIDIA"); checkBox_DisableDetectionAMD.Text = String.Format(International.GetText("Form_Settings_General_DisableDetection"), "AMD"); checkBox_AutoScaleBTCValues.Text = International.GetText("Form_Settings_General_AutoScaleBTCValues"); checkBox_StartMiningWhenIdle.Text = International.GetText("Form_Settings_General_StartMiningWhenIdle"); @@ -309,10 +300,7 @@ private void InitializeGeneralTabCallbacks() { { this.checkBox_AutoScaleBTCValues.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_DisableDetectionAMD.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); - this.checkBox_DisableDetectionNVidia2X.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); - this.checkBox_DisableDetectionNVidia3X.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); - this.checkBox_DisableDetectionNVidia5X.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); - this.checkBox_DisableDetectionNVidia6X.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); + this.checkBox_DisableDetectionNVIDIA.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_MinimizeToTray.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_HideMiningWindows.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_DebugConsole.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); @@ -377,10 +365,7 @@ private void InitializeGeneralTabFieldValuesReferences() { checkBox_AutoStartMining.Checked = ConfigManager.Instance.GeneralConfig.AutoStartMining; checkBox_HideMiningWindows.Checked = ConfigManager.Instance.GeneralConfig.HideMiningWindows; checkBox_MinimizeToTray.Checked = ConfigManager.Instance.GeneralConfig.MinimizeToTray; - checkBox_DisableDetectionNVidia6X.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X; - checkBox_DisableDetectionNVidia5X.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia5X; - checkBox_DisableDetectionNVidia3X.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia3X; - checkBox_DisableDetectionNVidia2X.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia2X; + checkBox_DisableDetectionNVIDIA.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; checkBox_DisableDetectionAMD.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; checkBox_AutoScaleBTCValues.Checked = ConfigManager.Instance.GeneralConfig.AutoScaleBTCValues; checkBox_StartMiningWhenIdle.Checked = ConfigManager.Instance.GeneralConfig.StartMiningWhenIdle; @@ -510,10 +495,7 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { ConfigManager.Instance.GeneralConfig.AutoStartMining = checkBox_AutoStartMining.Checked; ConfigManager.Instance.GeneralConfig.HideMiningWindows = checkBox_HideMiningWindows.Checked; ConfigManager.Instance.GeneralConfig.MinimizeToTray = checkBox_MinimizeToTray.Checked; - ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia6X = checkBox_DisableDetectionNVidia6X.Checked; - ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia5X = checkBox_DisableDetectionNVidia5X.Checked; - ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia3X = checkBox_DisableDetectionNVidia3X.Checked; - ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVidia2X = checkBox_DisableDetectionNVidia2X.Checked; + ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA = checkBox_DisableDetectionNVIDIA.Checked; ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD = checkBox_DisableDetectionAMD.Checked; ConfigManager.Instance.GeneralConfig.AutoScaleBTCValues = checkBox_AutoScaleBTCValues.Checked; ConfigManager.Instance.GeneralConfig.StartMiningWhenIdle = checkBox_StartMiningWhenIdle.Checked; diff --git a/NiceHashMiner/Forms/Form_Settings.resx b/NiceHashMiner/Forms/Form_Settings.resx index 6298d83..61b7fb9 100644 --- a/NiceHashMiner/Forms/Form_Settings.resx +++ b/NiceHashMiner/Forms/Form_Settings.resx @@ -117,12 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 17, 17 - - - + + 25 - + \ No newline at end of file diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index ac8bf97..58da674 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -213,7 +213,6 @@ - diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index adebe72..33ef428 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -33,7 +33,6 @@ static void Main(string[] argv) // #1 first initialize config ConfigManager.Instance.GeneralConfig.InitializeConfig(); - ConfigManager.Instance.LegacyConfigMigration(); if (ConfigManager.Instance.GeneralConfig.LogToFile) { Logger.ConfigureWithFile(); From b5a19e70e4c0e925925d7f48e4d5225d77f5374c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 23 Nov 2016 20:27:23 +0100 Subject: [PATCH 120/366] nvidia driver checking fix --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 777a335..fd73f47 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -37,7 +37,7 @@ public bool IsLesserVersionThan(NVIDIA_SMI_DRIVER b) { if(leftPart < b.leftPart) { return true; } - if(rightPart < b.rightPart) { + if (getRightVal(rightPart) < getRightVal(b.rightPart)) { return true; } return false; @@ -49,6 +49,12 @@ public override string ToString() { public int leftPart; public int rightPart; + private int getRightVal(int val) { + if(val >= 10) { + return val; + } + return val * 10; + } } static readonly NVIDIA_SMI_DRIVER NVIDIA_RECOMENDED_DRIVER = new NVIDIA_SMI_DRIVER(372, 54); // 372.54; From 277dc11e58711dee3f521de323ae73916e63552b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 24 Nov 2016 16:01:02 +0100 Subject: [PATCH 121/366] TOS update --- .../Forms/Form_ClaymoreTOS.Designer.cs | 88 +++++++++++++ NiceHashMiner/Forms/Form_ClaymoreTOS.cs | 34 +++++ NiceHashMiner/Forms/Form_ClaymoreTOS.resx | 120 ++++++++++++++++++ NiceHashMiner/Forms/Form_Main.cs | 12 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 57 +++++---- NiceHashMiner/Forms/Form_Settings.cs | 18 ++- NiceHashMiner/Miners/Grouping/MiningDevice.cs | 30 ++--- NiceHashMiner/NiceHashMiner.csproj | 9 ++ NiceHashMiner/langs/en.lang | 6 +- NiceHashMiner/langs/ru.lang | 6 +- 10 files changed, 325 insertions(+), 55 deletions(-) create mode 100644 NiceHashMiner/Forms/Form_ClaymoreTOS.Designer.cs create mode 100644 NiceHashMiner/Forms/Form_ClaymoreTOS.cs create mode 100644 NiceHashMiner/Forms/Form_ClaymoreTOS.resx diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.Designer.cs b/NiceHashMiner/Forms/Form_ClaymoreTOS.Designer.cs new file mode 100644 index 0000000..b9c398b --- /dev/null +++ b/NiceHashMiner/Forms/Form_ClaymoreTOS.Designer.cs @@ -0,0 +1,88 @@ +namespace NiceHashMiner.Forms { + partial class Form_ClaymoreTOS { + /// + /// 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.button_Agree = new System.Windows.Forms.Button(); + this.button_Decline = new System.Windows.Forms.Button(); + this.label_Tos = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // button_Agree + // + this.button_Agree.Location = new System.Drawing.Point(12, 260); + this.button_Agree.Name = "button_Agree"; + this.button_Agree.Size = new System.Drawing.Size(146, 23); + this.button_Agree.TabIndex = 0; + this.button_Agree.Text = "button1"; + this.button_Agree.UseVisualStyleBackColor = true; + this.button_Agree.Click += new System.EventHandler(this.button_Agree_Click); + // + // button_Decline + // + this.button_Decline.Location = new System.Drawing.Point(226, 260); + this.button_Decline.Name = "button_Decline"; + this.button_Decline.Size = new System.Drawing.Size(146, 23); + this.button_Decline.TabIndex = 1; + this.button_Decline.Text = "button2"; + this.button_Decline.UseVisualStyleBackColor = true; + this.button_Decline.Click += new System.EventHandler(this.button_Decline_Click); + // + // label_Tos + // + this.label_Tos.AutoSize = true; + this.label_Tos.Location = new System.Drawing.Point(12, 9); + this.label_Tos.MaximumSize = new System.Drawing.Size(350, 0); + this.label_Tos.Name = "label_Tos"; + this.label_Tos.Size = new System.Drawing.Size(35, 13); + this.label_Tos.TabIndex = 2; + this.label_Tos.Text = "label1"; + this.label_Tos.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // Form_ClaymoreTOS + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(384, 295); + this.Controls.Add(this.label_Tos); + this.Controls.Add(this.button_Decline); + this.Controls.Add(this.button_Agree); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Form_ClaymoreTOS"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Disclaimer on usage of 3rd party software"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button_Agree; + private System.Windows.Forms.Button button_Decline; + private System.Windows.Forms.Label label_Tos; + } +} \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs b/NiceHashMiner/Forms/Form_ClaymoreTOS.cs new file mode 100644 index 0000000..7adf14a --- /dev/null +++ b/NiceHashMiner/Forms/Form_ClaymoreTOS.cs @@ -0,0 +1,34 @@ +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; +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 NiceHashMiner.Forms { + public partial class Form_ClaymoreTOS : Form { + public Form_ClaymoreTOS() { + InitializeComponent(); + + this.Text = International.GetText("Form_Main_3rdParty_Title"); + this.label_Tos.Text = International.GetText("Form_Main_3rdParty_Text"); + this.button_Agree.Text = International.GetText("Form_Main_3rdParty_Button_Agree_Text"); + this.button_Decline.Text = International.GetText("Form_Main_3rdParty_Button_Refuse_Text"); + } + + private void button_Agree_Click(object sender, EventArgs e) { + ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; + this.Close(); + } + + private void button_Decline_Click(object sender, EventArgs e) { + ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + this.Close(); + } + } +} diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.resx b/NiceHashMiner/Forms/Form_ClaymoreTOS.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/NiceHashMiner/Forms/Form_ClaymoreTOS.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/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 3f4f8cd..e514219 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -329,15 +329,9 @@ private void StartupTimer_Tick(object sender, EventArgs e) { { // check if setting set if (ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.NOT_SET) { - // TODO - var result = MessageBox.Show(International.GetText("Form_Main_3rdParty_Text"), - International.GetText("Form_Main_3rdParty_Title"), - MessageBoxButtons.YesNo, MessageBoxIcon.Question); - if (result == System.Windows.Forms.DialogResult.Yes) { - ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; - } else { - ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; - } + // Show TOS + Form tos = new Form_ClaymoreTOS(); + tos.ShowDialog(this); } // check if download needed if (ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index fddae81..1a63cf3 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -41,10 +41,12 @@ private void InitializeComponent() { this.pictureBox_StartMiningWhenIdle = new System.Windows.Forms.PictureBox(); this.pictureBox_AutoScaleBTCValues = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableDetectionAMD = new System.Windows.Forms.PictureBox(); + this.pictureBox_Use3rdPartyMiners = new System.Windows.Forms.PictureBox(); this.pictureBox_DisableDetectionNVIDIA = new System.Windows.Forms.PictureBox(); this.pictureBox_AutoStartMining = new System.Windows.Forms.PictureBox(); this.pictureBox_MinimizeToTray = new System.Windows.Forms.PictureBox(); this.pictureBox_HideMiningWindows = new System.Windows.Forms.PictureBox(); + this.checkBox_Use3rdPartyMiners = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDetectionNVIDIA = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDetectionAMD = new System.Windows.Forms.CheckBox(); this.checkBox_NVIDIAP0State = new System.Windows.Forms.CheckBox(); @@ -123,8 +125,6 @@ private void InitializeComponent() { this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.checkBoxEnable3rdPartyMiners = new System.Windows.Forms.CheckBox(); - this.pictureBoxEnable3rdPartyMiners = new System.Windows.Forms.PictureBox(); this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); @@ -142,6 +142,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_StartMiningWhenIdle)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoScaleBTCValues)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionAMD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Use3rdPartyMiners)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVIDIA)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinimizeToTray)).BeginInit(); @@ -175,7 +176,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxEnable3rdPartyMiners)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -224,12 +224,12 @@ private void InitializeComponent() { this.groupBox_Misc.Controls.Add(this.pictureBox_StartMiningWhenIdle); this.groupBox_Misc.Controls.Add(this.pictureBox_AutoScaleBTCValues); this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionAMD); - this.groupBox_Misc.Controls.Add(this.pictureBoxEnable3rdPartyMiners); + this.groupBox_Misc.Controls.Add(this.pictureBox_Use3rdPartyMiners); this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDetectionNVIDIA); this.groupBox_Misc.Controls.Add(this.pictureBox_AutoStartMining); this.groupBox_Misc.Controls.Add(this.pictureBox_MinimizeToTray); this.groupBox_Misc.Controls.Add(this.pictureBox_HideMiningWindows); - this.groupBox_Misc.Controls.Add(this.checkBoxEnable3rdPartyMiners); + this.groupBox_Misc.Controls.Add(this.checkBox_Use3rdPartyMiners); this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionNVIDIA); this.groupBox_Misc.Controls.Add(this.checkBox_DisableDetectionAMD); this.groupBox_Misc.Controls.Add(this.checkBox_NVIDIAP0State); @@ -376,6 +376,16 @@ private void InitializeComponent() { this.pictureBox_DisableDetectionAMD.TabIndex = 364; this.pictureBox_DisableDetectionAMD.TabStop = false; // + // pictureBox_Use3rdPartyMiners + // + this.pictureBox_Use3rdPartyMiners.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_Use3rdPartyMiners.Location = new System.Drawing.Point(205, 79); + this.pictureBox_Use3rdPartyMiners.Name = "pictureBox_Use3rdPartyMiners"; + this.pictureBox_Use3rdPartyMiners.Size = new System.Drawing.Size(18, 18); + this.pictureBox_Use3rdPartyMiners.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_Use3rdPartyMiners.TabIndex = 364; + this.pictureBox_Use3rdPartyMiners.TabStop = false; + // // pictureBox_DisableDetectionNVIDIA // this.pictureBox_DisableDetectionNVIDIA.Image = global::NiceHashMiner.Properties.Resources.info_black_18; @@ -416,6 +426,17 @@ private void InitializeComponent() { this.pictureBox_HideMiningWindows.TabIndex = 364; this.pictureBox_HideMiningWindows.TabStop = false; // + // checkBox_Use3rdPartyMiners + // + this.checkBox_Use3rdPartyMiners.AutoSize = true; + this.checkBox_Use3rdPartyMiners.Location = new System.Drawing.Point(6, 80); + this.checkBox_Use3rdPartyMiners.Name = "checkBox_Use3rdPartyMiners"; + this.checkBox_Use3rdPartyMiners.Size = new System.Drawing.Size(129, 17); + this.checkBox_Use3rdPartyMiners.TabIndex = 319; + this.checkBox_Use3rdPartyMiners.Text = "Enable3rdPartyMiners"; + this.checkBox_Use3rdPartyMiners.UseVisualStyleBackColor = true; + this.checkBox_Use3rdPartyMiners.CheckedChanged += new System.EventHandler(this.checkBox_Use3rdPartyMiners_CheckedChanged); + // // checkBox_DisableDetectionNVIDIA // this.checkBox_DisableDetectionNVIDIA.AutoSize = true; @@ -1259,26 +1280,6 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // checkBoxEnable3rdPartyMiners - // - this.checkBoxEnable3rdPartyMiners.AutoSize = true; - this.checkBoxEnable3rdPartyMiners.Location = new System.Drawing.Point(6, 80); - this.checkBoxEnable3rdPartyMiners.Name = "checkBoxEnable3rdPartyMiners"; - this.checkBoxEnable3rdPartyMiners.Size = new System.Drawing.Size(129, 17); - this.checkBoxEnable3rdPartyMiners.TabIndex = 319; - this.checkBoxEnable3rdPartyMiners.Text = "Enable3rdPartyMiners"; - this.checkBoxEnable3rdPartyMiners.UseVisualStyleBackColor = true; - // - // pictureBoxEnable3rdPartyMiners - // - this.pictureBoxEnable3rdPartyMiners.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBoxEnable3rdPartyMiners.Location = new System.Drawing.Point(205, 79); - this.pictureBoxEnable3rdPartyMiners.Name = "pictureBoxEnable3rdPartyMiners"; - this.pictureBoxEnable3rdPartyMiners.Size = new System.Drawing.Size(18, 18); - this.pictureBoxEnable3rdPartyMiners.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBoxEnable3rdPartyMiners.TabIndex = 364; - this.pictureBoxEnable3rdPartyMiners.TabStop = false; - // // benchmarkLimitControlNVIDIA // this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; @@ -1367,6 +1368,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_StartMiningWhenIdle)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoScaleBTCValues)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionAMD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Use3rdPartyMiners)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDetectionNVIDIA)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AutoStartMining)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinimizeToTray)).EndInit(); @@ -1404,7 +1406,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxEnable3rdPartyMiners)).EndInit(); this.ResumeLayout(false); } @@ -1516,8 +1517,8 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_DisableDefaultOptimizations; private System.Windows.Forms.CheckBox checkBox_ContinueMiningIfNoInternetAccess; private System.Windows.Forms.PictureBox pictureBox_ContinueMiningIfNoInternetAccess; - private System.Windows.Forms.PictureBox pictureBoxEnable3rdPartyMiners; - private System.Windows.Forms.CheckBox checkBoxEnable3rdPartyMiners; + private System.Windows.Forms.PictureBox pictureBox_Use3rdPartyMiners; + private System.Windows.Forms.CheckBox checkBox_Use3rdPartyMiners; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index b09771c..7533078 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -107,6 +107,9 @@ private void InitializeToolTip() { toolTip1.SetToolTip(this.checkBox_MinimizeToTray, International.GetText("Form_Settings_ToolTip_checkBox_MinimizeToTray")); toolTip1.SetToolTip(this.pictureBox_MinimizeToTray, International.GetText("Form_Settings_ToolTip_checkBox_MinimizeToTray")); + + toolTip1.SetToolTip(this.checkBox_Use3rdPartyMiners, International.GetText("Form_Settings_General_3rdparty_ToolTip")); + toolTip1.SetToolTip(this.pictureBox_Use3rdPartyMiners, International.GetText("Form_Settings_General_3rdparty_ToolTip")); toolTip1.SetToolTip(this.textBox_SwitchMinSecondsFixed, International.GetText("Form_Settings_ToolTip_SwitchMinSecondsFixed")); @@ -233,7 +236,7 @@ private void InitializeGeneralTabTranslations() { checkBox_StartMiningWhenIdle.Text = International.GetText("Form_Settings_General_StartMiningWhenIdle"); checkBox_ShowDriverVersionWarning.Text = International.GetText("Form_Settings_General_ShowDriverVersionWarning"); checkBox_DisableWindowsErrorReporting.Text = International.GetText("Form_Settings_General_DisableWindowsErrorReporting"); - //checkBox_UseNewSettingsPage.Text = International.GetText("Form_Settings_General_UseNewSettingsPage"); + checkBox_Use3rdPartyMiners.Text = International.GetText("Form_Settings_General_3rdparty_Text"); checkBox_NVIDIAP0State.Text = International.GetText("Form_Settings_General_NVIDIAP0State"); checkBox_LogToFile.Text = International.GetText("Form_Settings_General_LogToFile"); checkBox_AMD_DisableAMDTempControl.Text = International.GetText("Form_Settings_General_DisableAMDTempControl"); @@ -376,6 +379,7 @@ private void InitializeGeneralTabFieldValuesReferences() { checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl; checkBox_DisableDefaultOptimizations.Checked = ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations; checkBox_ContinueMiningIfNoInternetAccess.Checked = ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess; + this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; } // Textboxes @@ -767,5 +771,17 @@ private void tabControlGeneral_Selected(object sender, TabControlEventArgs e) { } } + private void checkBox_Use3rdPartyMiners_CheckedChanged(object sender, EventArgs e) { + if (!_isInitFinished) return; + if (this.checkBox_Use3rdPartyMiners.Checked) { + // Show TOS + Form tos = new Form_ClaymoreTOS(); + tos.ShowDialog(this); + this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; + } else { + ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + } + } + } } diff --git a/NiceHashMiner/Miners/Grouping/MiningDevice.cs b/NiceHashMiner/Miners/Grouping/MiningDevice.cs index 3cd845b..ad50d94 100644 --- a/NiceHashMiner/Miners/Grouping/MiningDevice.cs +++ b/NiceHashMiner/Miners/Grouping/MiningDevice.cs @@ -12,24 +12,24 @@ public class MiningDevice { // switch testing quick and dirty, runtime versions #if (SWITCH_TESTING) static List testingAlgos = new List() { - ////AlgorithmType.X13, - ////AlgorithmType.Keccak, - ////AlgorithmType.X15, - AlgorithmType.Nist5, - AlgorithmType.NeoScrypt, + //AlgorithmType.X13, + //AlgorithmType.Keccak, + //AlgorithmType.X15, + //AlgorithmType.Nist5, + //AlgorithmType.NeoScrypt, AlgorithmType.Lyra2RE, - AlgorithmType.WhirlpoolX, - AlgorithmType.Qubit, - AlgorithmType.Quark, - AlgorithmType.Lyra2REv2, - ////AlgorithmType.Blake256r8, - ////AlgorithmType.Blake256r14, - ////AlgorithmType.Blake256r8vnl, + //AlgorithmType.WhirlpoolX, + //AlgorithmType.Qubit, + //AlgorithmType.Quark, + //AlgorithmType.Lyra2REv2, + //AlgorithmType.Blake256r8, + //AlgorithmType.Blake256r14, + //AlgorithmType.Blake256r8vnl, AlgorithmType.Hodl, - AlgorithmType.DaggerHashimoto, - AlgorithmType.Decred, + //AlgorithmType.DaggerHashimoto, + //AlgorithmType.Decred, AlgorithmType.CryptoNight, - AlgorithmType.Lbry, + //AlgorithmType.Lbry, AlgorithmType.Equihash }; static int next = -1; diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 58da674..dc9053a 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -164,6 +164,12 @@ Form_ChooseLanguage_r.cs + + Form + + + Form_ClaymoreTOS.cs + Form @@ -278,6 +284,9 @@ Form_ChooseLanguage_r.cs + + Form_ClaymoreTOS.cs + Form_Settings.cs diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index c9a0828..ccbcc96 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -325,6 +325,10 @@ "AlgorithmsListView_ContextMenu_EnableAll": "Enable All Algorithms", "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable at least 1 device to proceed mining.", "Form_Main_3rdParty_Title": "Disclaimer on usage of 3rd party software", - "Form_Main_3rdParty_Text": "We have integrated 3rd party mining software (developed by Claymore) that should speed up your mining and give you more stable mining experience - this could potentially result in more earnings over a shorter period of time even after developer's fee is deducted. However, since this is 3rd party software that is fully closed-source, we have no chance to inspect it in any way. NiceHash can not vouch for using that software and is refusing to take any responsibility for any damage caused - security breaches, loss of data or funds, system or hardware error, and other issues. By agreeing to this disclaimer you take full responsibility for using these Claymore closed-source miners as they are." + "Form_Main_3rdParty_Text": "We have integrated 3rd party mining software (developed by Claymore) that should speed up your mining and give you more stable mining experience - this could potentially result in more earnings over a shorter period of time even after developer's fee is deducted. However, since this is 3rd party software that is fully closed-source, we have no chance to inspect it in any way. NiceHash can not vouch for using that software and is refusing to take any responsibility for any damage caused - security breaches, loss of data or funds, system or hardware error, and other issues. By agreeing to this disclaimer you take full responsibility for using these Claymore closed-source miners as they are.", + "Form_Main_3rdParty_Button_Agree_Text": "I agree", + "Form_Main_3rdParty_Button_Refuse_Text": "I refuse", + "Form_Settings_General_3rdparty_Text": "Enable3rdPartyMiners", + "Form_Settings_General_3rdparty_ToolTip": "Use 3rd party closed-source mining software for higher profitability. Usage is on your own responsibility." } } diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index ed72c2c..af75209 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -325,6 +325,10 @@ "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Продолжить майнинг без доступа к интернету", "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess": "Если отмечено, NiceHashMiner продолжит майнинг вне зависимости от подключения к интернету.", "Form_Main_3rdParty_Title": "Дисклеймер от использования стороннего программного обеспечения", - "Form_Main_3rdParty_Text": "Мы интегрировали стороннее программное обеспечение (разработанное Claymore), которое должно поднять скорость вашего майнинга и дать вам более стабильный опыт майнинга — это потенциально может привести к большему заработку за короткий период времени, даже после вычета комиссии разработчика. Однако, поскольку это стороннее программное обеспечение является полностью закрытым, у нас нет никакой возможности исследовать его. NiceHash не может ручаться за использование этого ПО и отказывается брать на себя ответственность за любой причиненный ущерб - нарушение безопасности, потерю данных или средств и другие проблемы. Соглашением с этим дисклеймером, вы берете полную ответственность за использование этих майнеров с закрытым исходным кодом от Claymore." + "Form_Main_3rdParty_Text": "Мы интегрировали стороннее программное обеспечение (разработанное Claymore), которое должно поднять скорость вашего майнинга и дать вам более стабильный опыт майнинга — это потенциально может привести к большему заработку за короткий период времени, даже после вычета комиссии разработчика. Однако, поскольку это стороннее программное обеспечение является полностью закрытым, у нас нет никакой возможности исследовать его. NiceHash не может ручаться за использование этого ПО и отказывается брать на себя ответственность за любой причиненный ущерб - нарушение безопасности, потерю данных или средств и другие проблемы. Соглашением с этим дисклеймером, вы берете полную ответственность за использование этих майнеров с закрытым исходным кодом от Claymore.", + "Form_Main_3rdParty_Button_Agree_Text": "Я соглашаюсь", + "Form_Main_3rdParty_Button_Refuse_Text": "Я отказываюсь", + "Form_Settings_General_3rdparty_Text": "Включить сторонние майнеры", + "Form_Settings_General_3rdparty_ToolTip": "Используйте закрытое стороннее программное обеспечение для майнинга для высшей прибыльности. Использование на вашей собственной ответственности." } } \ No newline at end of file From 0ca7049eab9915c199e00c1ddcb56a1fc450642f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 24 Nov 2016 16:19:30 +0100 Subject: [PATCH 122/366] 3rd pary dl check fix --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index e514219..9590529 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -346,7 +346,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { International.GetText("Warning_with_Exclamation"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { - ConfigManager.Instance.GeneralConfig.DownloadInit = false; + ConfigManager.Instance.GeneralConfig.DownloadInit3rdParty = false; ConfigManager.Instance.GeneralConfig.Commit(); Process PHandle = new Process(); PHandle.StartInfo.FileName = Application.ExecutablePath; diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index fb0d98e..0a05c56 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -131,7 +131,7 @@ protected override string GetDevicesCommandString() { // benchmark stuff protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - string ret = "-wd 0 -colors 0 -logfile " + LOG_FILE_NAME + " -benchmark 1 " + GetDevicesCommandString(); + string ret = "-logfile " + LOG_FILE_NAME + " -benchmark 1 " + GetDevicesCommandString(); return ret; } protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { From 6976d112d51df3b2934b316d45796af2b8bdf642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 24 Nov 2016 16:27:17 +0100 Subject: [PATCH 123/366] remove pending --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 9590529..fa125a3 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "_PENDING"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; From 507fe55f559d6cc1a4bf587b1a9046d55a6a9179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 25 Nov 2016 10:23:21 +0100 Subject: [PATCH 124/366] Dictionary use update instead of Add --- NiceHashMiner/Forms/Form_Benchmark.cs | 2 +- NiceHashMiner/Miners/MinersManager.cs | 3 --- NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index f695d4b..64c18eb 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -346,7 +346,7 @@ public void CalcBenchmarkDevicesAlgorithmQueue() { } else { status = algorithmQueue.Count == 0 ? BenchmarkSettingsStatus.DISABLED_NONE : BenchmarkSettingsStatus.DISABLED_TODO; } - _benchmarkDevicesAlgorithmStatus.Add(option.CDevice.UUID, status); + _benchmarkDevicesAlgorithmStatus[option.CDevice.UUID] = status; } // GUI stuff progressBarBenchmarkSteps.Maximum = _benchmarkAlgorithmsCount; diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index e4e5958..06fe495 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -12,9 +12,6 @@ namespace NiceHashMiner.Miners { // typedefs - using DeviceSubsetList = List>; - using PerDeviceSpeedDictionary = Dictionary>; - using GroupedDevices = SortedSet; using NiceHashMiner.Miners.Grouping; public class MinersManager : BaseLazySingleton { diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index e3e6c24..1b0dcfd 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -123,7 +123,6 @@ public static int GetEqmCudaThreadCount(MiningPair pair) { private static string Parse(List MiningPairs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); - //Dictionary paramsFlags = new Dictionary(); Dictionary> cdevOptions = new Dictionary>(); Dictionary isOptionDefaults = new Dictionary(); Dictionary isOptionExist = new Dictionary(); From 3e4bb5edc4a9ec78197339ede3092c792a6b90f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 25 Nov 2016 11:47:44 +0100 Subject: [PATCH 125/366] claymore and eqm extra params added --- NiceHashMiner/Enums/MinerOptionType.cs | 19 +++++++++++--- NiceHashMiner/Forms/Form_Main.cs | 2 -- .../Parsing/ExtraLaunchParametersParser.cs | 26 ++++++++++++++----- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 901915b..8556e79 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -51,9 +51,22 @@ public enum MinerOptionType { OpenCL_Solver_Version, //-ov OpenCL_Solver_Dev_Thread, // -ot // eqm - CUDA_Solver_AsyncMode, // -ca - CUDA_Solver_ParallelBuckets, // -cp + CUDA_Solver_Mode, // -cm // ClaymoreZcash - ClaymoreZcash_tt + ClaymoreZcash_i, // -i + ClaymoreZcash_wd, // -wd + ClaymoreZcash_r, + ClaymoreZcash_nofee, + ClaymoreZcash_li, + ClaymoreZcash_tt, // -tt + ClaymoreZcash_ttli, + ClaymoreZcash_tstop, + ClaymoreZcash_fanmax, + ClaymoreZcash_fanmin, + ClaymoreZcash_cclock, + ClaymoreZcash_mclock, + ClaymoreZcash_powlim, + ClaymoreZcash_cvddc, + ClaymoreZcash_mvddc } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index fa125a3..4a16ae6 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -43,8 +43,6 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, private Random R; - //private Form_Loading _downloadUnzipForm; - //private Form_Loading _download3rdPartyUnzipForm; private Form_Loading LoadingScreen; private Form BenchmarkForm; diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 1b0dcfd..b4ed079 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -84,17 +84,29 @@ static class ExtraLaunchParametersParser { private static List _eqm_CPU_Options = new List() { new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none }; - // EQM v1.0.1a has no optimization flags remove them + // eqm CUDA private static List _eqm_CUDA_Options = new List() { - //// TODO check what is the CUDA_Solver_ParallelBuckets default - //new MinerOption(MinerOptionType.CUDA_Solver_ParallelBuckets, "-cp", "-cp", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - //new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - //new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + new MinerOption(MinerOptionType.CUDA_Solver_Mode, "-cm", "-cm", "0", MinerOptionFlagType.MultiParam, " "), // default 0 }; // Zcash claymore private static List _ClaymoreZcash_Options = new List() { - //// TODO check what is the CUDA_Solver_ParallelBuckets default - new MinerOption(MinerOptionType.ClaymoreZcash_tt, "-tt", "-tt", "0", MinerOptionFlagType.MultiParam, ","), // default 0 + new MinerOption(MinerOptionType.ClaymoreZcash_i , "-i", "-i", "4", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_wd , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), + //new MinerOption(MinerOptionType.ClaymoreZcash_r , , , , MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_nofee , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_li , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), + // temperature stuff + //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all + new MinerOption(MinerOptionType.ClaymoreZcash_tt , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_ttli , "-ttli", "-ttli", "70", MinerOptionFlagType.SingleParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_tstop , "-tstop", "-tstop", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_fanmax , "-fanmax", "-fanmax", "100", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_fanmin , "-fanmin", "-fanmin", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_cclock , "-cclock", "-cclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_mclock , "-mclock", "-mclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_powlim , "-powlim", "-powlim", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_cvddc , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_mvddc , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), }; private static bool _showLog = true; From a7e7285f7da275f8aece8982bae5a0f8e41ef78d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 25 Nov 2016 12:13:55 +0100 Subject: [PATCH 126/366] shorter TOS title RU --- NiceHashMiner/langs/ru.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index af75209..762349e 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -324,7 +324,7 @@ "Form_Settings_Text_DisableDefaultOptimizations": "Отключить оптимизацию", "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Продолжить майнинг без доступа к интернету", "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess": "Если отмечено, NiceHashMiner продолжит майнинг вне зависимости от подключения к интернету.", - "Form_Main_3rdParty_Title": "Дисклеймер от использования стороннего программного обеспечения", + "Form_Main_3rdParty_Title": "Дисклеймер от использования стороннего ПО", "Form_Main_3rdParty_Text": "Мы интегрировали стороннее программное обеспечение (разработанное Claymore), которое должно поднять скорость вашего майнинга и дать вам более стабильный опыт майнинга — это потенциально может привести к большему заработку за короткий период времени, даже после вычета комиссии разработчика. Однако, поскольку это стороннее программное обеспечение является полностью закрытым, у нас нет никакой возможности исследовать его. NiceHash не может ручаться за использование этого ПО и отказывается брать на себя ответственность за любой причиненный ущерб - нарушение безопасности, потерю данных или средств и другие проблемы. Соглашением с этим дисклеймером, вы берете полную ответственность за использование этих майнеров с закрытым исходным кодом от Claymore.", "Form_Main_3rdParty_Button_Agree_Text": "Я соглашаюсь", "Form_Main_3rdParty_Button_Refuse_Text": "Я отказываюсь", From 8c43557fd76ae4898ccc06f2206ff243ee92cc5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 25 Nov 2016 16:11:19 +0100 Subject: [PATCH 127/366] work in progress --- NiceHashMiner/Configs/ConfigManager.cs | 77 +------ NiceHashMiner/Configs/ConfigManager_rem.cs | 79 +++++++ .../{ => Data}/BenchmarkTimeLimitsConfig.cs | 0 .../Configs/Data/ComputeDeviceConfig.cs | 14 ++ .../Configs/Data/DeviceBenchmarkConfig.cs | 16 ++ .../{ => Data}/DeviceDetectionConfig.cs | 0 .../Configs/Data/GeneralConfigData.cs | 139 ++++++++++++ .../Configs/DeviceBenchmarkConfigManager.cs | 16 +- ...Config.cs => DeviceBenchmarkConfig_rem.cs} | 10 +- .../Configs/{ => File}/BaseConfigFile.cs | 0 NiceHashMiner/Configs/File/ConfigFile.cs | 73 +++++++ .../Configs/File/DeviceBenchmarkConfigFile.cs | 29 +++ .../Configs/File/GeneralConfigFile.cs | 14 ++ ...neralConfig.cs => GeneralConfigHandler.cs} | 4 +- NiceHashMiner/CurrencyConverter.cs | 10 +- NiceHashMiner/Devices/CPUUtils.cs | 6 +- NiceHashMiner/Devices/ComputeDevice.cs | 4 +- NiceHashMiner/Devices/ComputeDeviceManager.cs | 12 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 - NiceHashMiner/Ethereum.cs | 2 +- .../DevicesListViewEnableControl.cs | 2 +- .../Forms/DriverVersionConfirmationDialog.cs | 2 +- NiceHashMiner/Forms/Form_Benchmark.cs | 4 +- NiceHashMiner/Forms/Form_ChooseLanguage_r.cs | 2 +- NiceHashMiner/Forms/Form_ClaymoreTOS.cs | 4 +- NiceHashMiner/Forms/Form_Main.cs | 94 ++++---- NiceHashMiner/Forms/Form_Settings.cs | 200 +++++++++--------- NiceHashMiner/Helpers.cs | 2 +- NiceHashMiner/Interfaces/IPathsProperties.cs | 1 + NiceHashMiner/Logger.cs | 4 +- .../Miners/Equihash/ClaymoreZcashMiner.cs | 2 +- NiceHashMiner/Miners/Grouping/GroupMiner.cs | 4 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 2 +- NiceHashMiner/Miners/Miner.cs | 10 +- NiceHashMiner/Miners/MinersApiPortsManager.cs | 2 +- NiceHashMiner/Miners/MinersManager.cs | 2 +- NiceHashMiner/Miners/MiningSession.cs | 10 +- .../Parsing/ExtraLaunchParametersParser.cs | 2 +- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 4 +- NiceHashMiner/Miners/sgminer.cs | 8 +- NiceHashMiner/NiceHashMiner.csproj | 19 +- NiceHashMiner/Program.cs | 12 +- 42 files changed, 597 insertions(+), 302 deletions(-) create mode 100644 NiceHashMiner/Configs/ConfigManager_rem.cs rename NiceHashMiner/Configs/{ => Data}/BenchmarkTimeLimitsConfig.cs (100%) create mode 100644 NiceHashMiner/Configs/Data/ComputeDeviceConfig.cs create mode 100644 NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs rename NiceHashMiner/Configs/{ => Data}/DeviceDetectionConfig.cs (100%) create mode 100644 NiceHashMiner/Configs/Data/GeneralConfigData.cs rename NiceHashMiner/Configs/{DeviceBenchmarkConfig.cs => DeviceBenchmarkConfig_rem.cs} (90%) rename NiceHashMiner/Configs/{ => File}/BaseConfigFile.cs (100%) create mode 100644 NiceHashMiner/Configs/File/ConfigFile.cs create mode 100644 NiceHashMiner/Configs/File/DeviceBenchmarkConfigFile.cs create mode 100644 NiceHashMiner/Configs/File/GeneralConfigFile.cs rename NiceHashMiner/Configs/{GeneralConfig.cs => GeneralConfigHandler.cs} (98%) diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index 1526505..238ca8f 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -1,81 +1,10 @@ using System; using System.Collections.Generic; -using System.IO; +using System.Linq; using System.Text; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; +using System.Threading.Tasks; namespace NiceHashMiner.Configs { - public partial class ConfigManager : BaseLazySingleton { - public GeneralConfig GeneralConfig { get; set; } - public Dictionary BenchmarkConfigs { get; set; } - - private readonly string TAG; - - // constructor has references don't delete it - protected ConfigManager() { - TAG = this.GetType().Name; - GeneralConfig = new GeneralConfig(true); - BenchmarkConfigs = new Dictionary(); - } - - public void CommitBenchmarks() { - foreach (var benchConfig in BenchmarkConfigs) { - benchConfig.Value.Commit(); - } - } - - private void LoadBenchmarks() { - foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // doubly check if not added - if (BenchmarkConfigs.ContainsKey(CDev.UUID)) { - Helpers.ConsolePrint(TAG, "BUG - LoadBenchmarks() already added for {0}", CDev.UUID); - } else { - var benchConfig = DeviceBenchmarkConfigManager.Instance.GetConfig(CDev.DeviceGroupType, CDev.UUID, CDev.Name); - benchConfig.InitializeConfig(); - BenchmarkConfigs.Add(CDev.UUID, benchConfig); - } - } - } - - public void AfterDeviceQueryInitialization() { - GeneralConfig.AfterDeviceQueryInitialization(); - LoadBenchmarks(); - - SetDeviceBenchmarkReferences(); - - - - // check ethminers and remove from settings if no device supports it in config - foreach (var config in BenchmarkConfigs) { - bool removeDagger = true; - var cDev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(config.Value.DeviceUUID); - if (cDev != null) { - // if only one dev ing roup supports terminate - if (cDev.IsEtherumCapale) { - removeDagger = false; - break; - } - } - if (removeDagger) { - config.Value.AlgorithmSettings.Remove(AlgorithmType.DaggerHashimoto); - } - } - - CommitBenchmarks(); - } - - public void SetDeviceBenchmarkReferences() { - // new stuff - // set references - // C# can handle cyclic refs - DeviceBenchmarkConfigManager.Instance.BenchmarkConfigs = BenchmarkConfigs; - BenchmarkConfigs = DeviceBenchmarkConfigManager.Instance.BenchmarkConfigs; - // set Benchmarks for devices - foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - cdev.SetDeviceBenchmarkConfig(DeviceBenchmarkConfigManager.Instance.GetConfig(cdev.DeviceGroupType, cdev.UUID, cdev.Name)); - } - } - + class ConfigManager { } } diff --git a/NiceHashMiner/Configs/ConfigManager_rem.cs b/NiceHashMiner/Configs/ConfigManager_rem.cs new file mode 100644 index 0000000..d34af30 --- /dev/null +++ b/NiceHashMiner/Configs/ConfigManager_rem.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; + +namespace NiceHashMiner.Configs { + public partial class ConfigManager_rem : BaseLazySingleton { + public GeneralConfigHandler GeneralConfig { get; set; } + public Dictionary BenchmarkConfigs { get; set; } + + private readonly string TAG; + + // constructor has references don't delete it + protected ConfigManager_rem() { + TAG = this.GetType().Name; + GeneralConfig = new GeneralConfigHandler(true); + BenchmarkConfigs = new Dictionary(); + } + + public void CommitBenchmarks() { + foreach (var benchConfig in BenchmarkConfigs) { + benchConfig.Value.Commit(); + } + } + + private void LoadBenchmarks() { + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // doubly check if not added + if (BenchmarkConfigs.ContainsKey(CDev.UUID)) { + Helpers.ConsolePrint(TAG, "BUG - LoadBenchmarks() already added for {0}", CDev.UUID); + } else { + var benchConfig = DeviceBenchmarkConfigManager.Instance.GetConfig(CDev.DeviceGroupType, CDev.UUID, CDev.Name); + benchConfig.InitializeConfig(); + BenchmarkConfigs.Add(CDev.UUID, benchConfig); + } + } + } + + public void AfterDeviceQueryInitialization() { + GeneralConfig.AfterDeviceQueryInitialization(); + LoadBenchmarks(); + + SetDeviceBenchmarkReferences(); + + // check ethminers and remove from settings if no device supports it in config + foreach (var config in BenchmarkConfigs) { + bool removeDagger = true; + var cDev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(config.Value.DeviceUUID); + if (cDev != null) { + // if only one dev ing roup supports terminate + if (cDev.IsEtherumCapale) { + removeDagger = false; + break; + } + } + if (removeDagger) { + config.Value.AlgorithmSettings.Remove(AlgorithmType.DaggerHashimoto); + } + } + + CommitBenchmarks(); + } + + public void SetDeviceBenchmarkReferences() { + // new stuff + // set references + // C# can handle cyclic refs + DeviceBenchmarkConfigManager.Instance.BenchmarkConfigs = BenchmarkConfigs; + BenchmarkConfigs = DeviceBenchmarkConfigManager.Instance.BenchmarkConfigs; + // set Benchmarks for devices + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + cdev.SetDeviceBenchmarkConfig(DeviceBenchmarkConfigManager.Instance.GetConfig(cdev.DeviceGroupType, cdev.UUID, cdev.Name)); + } + } + + } +} diff --git a/NiceHashMiner/Configs/BenchmarkTimeLimitsConfig.cs b/NiceHashMiner/Configs/Data/BenchmarkTimeLimitsConfig.cs similarity index 100% rename from NiceHashMiner/Configs/BenchmarkTimeLimitsConfig.cs rename to NiceHashMiner/Configs/Data/BenchmarkTimeLimitsConfig.cs diff --git a/NiceHashMiner/Configs/Data/ComputeDeviceConfig.cs b/NiceHashMiner/Configs/Data/ComputeDeviceConfig.cs new file mode 100644 index 0000000..c61dc1b --- /dev/null +++ b/NiceHashMiner/Configs/Data/ComputeDeviceConfig.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Configs.Data { + [Serializable] + public class ComputeDeviceConfig { + public string Name = ""; + public bool Enabled = true; + public string UUID = ""; + } +} diff --git a/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs b/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs new file mode 100644 index 0000000..d9235af --- /dev/null +++ b/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs @@ -0,0 +1,16 @@ +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Configs.Data { + [Serializable] + public class DeviceBenchmarkConfig { + public string DeviceUUID = ""; + public string DeviceName = ""; + //public int TimeLimit { get; set; } + public Dictionary AlgorithmSettings = new Dictionary(); + } +} diff --git a/NiceHashMiner/Configs/DeviceDetectionConfig.cs b/NiceHashMiner/Configs/Data/DeviceDetectionConfig.cs similarity index 100% rename from NiceHashMiner/Configs/DeviceDetectionConfig.cs rename to NiceHashMiner/Configs/Data/DeviceDetectionConfig.cs diff --git a/NiceHashMiner/Configs/Data/GeneralConfigData.cs b/NiceHashMiner/Configs/Data/GeneralConfigData.cs new file mode 100644 index 0000000..98c10c3 --- /dev/null +++ b/NiceHashMiner/Configs/Data/GeneralConfigData.cs @@ -0,0 +1,139 @@ +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Configs.Data { + [Serializable] + public class GeneralConfigData { + + public Version ConfigFileVersion; + public LanguageType Language = LanguageType.En; + public string DisplayCurrency = "USD"; + + public bool DebugConsole = false; + public string BitcoinAddress = ""; + public string WorkerName = "worker1"; + public int ServiceLocation = 0; + public bool AutoStartMining = false; + public bool HideMiningWindows = false; + public bool MinimizeToTray = false; + //public int LessThreads; + public CPUExtensionType ForceCPUExtension = CPUExtensionType.Automatic; + + public int SwitchMinSecondsFixed = 90; + public int SwitchMinSecondsDynamic = 30; + public int SwitchMinSecondsAMD = 60; + public int MinerAPIQueryInterval = 5; + public int MinerRestartDelayMS = 500; + + public BenchmarkTimeLimitsConfig BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); + // TODO deprecate this + public DeviceDetectionConfig DeviceDetection = new DeviceDetectionConfig(); + + public bool DisableAMDTempControl = false; + public bool DisableDefaultOptimizations = false; + + public bool AutoScaleBTCValues = true; + public bool StartMiningWhenIdle = false; + + public int MinIdleSeconds = 60; + public bool LogToFile = true; + + // in bytes + public long LogMaxFileSize = 1048576; + + public bool ShowDriverVersionWarning = true; + public bool DisableWindowsErrorReporting = true; + public bool NVIDIAP0State = false; + + public int ethminerDefaultBlockHeight = 2000000; + public DagGenerationType EthminerDagGenerationType = DagGenerationType.SingleKeep; + public int ApiBindPortPoolStart = 5100; + public double MinimumProfit = 0; + public bool ContinueMiningIfNoInternetAccess = false; + public bool DownloadInit = false; + // 3rd party miners + public Use3rdPartyMiners Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; + public bool DownloadInit3rdParty = false; + // device enabled disabled stuff + public List LastDevicesSettup = new List(); + // + public string hwid = ""; + + // methods + public void SetDefaults() { + ConfigFileVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + Language = LanguageType.En; + ForceCPUExtension = CPUExtensionType.Automatic; + BitcoinAddress = ""; + WorkerName = "worker1"; + ServiceLocation = 0; + AutoStartMining = false; + //LessThreads = 0; + DebugConsole = false; + HideMiningWindows = false; + MinimizeToTray = false; + BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); + DeviceDetection = new DeviceDetectionConfig(); + DisableAMDTempControl = false; + DisableDefaultOptimizations = false; + AutoScaleBTCValues = true; + StartMiningWhenIdle = false; + LogToFile = true; + LogMaxFileSize = 1048576; + ShowDriverVersionWarning = true; + DisableWindowsErrorReporting = true; + NVIDIAP0State = false; + MinerRestartDelayMS = 500; + ethminerDefaultBlockHeight = 2000000; + SwitchMinSecondsFixed = 90; + SwitchMinSecondsDynamic = 30; + SwitchMinSecondsAMD = 90; + MinIdleSeconds = 60; + DisplayCurrency = "USD"; + ApiBindPortPoolStart = 4000; + MinimumProfit = 0; + EthminerDagGenerationType = DagGenerationType.SingleKeep; + DownloadInit = false; + ContinueMiningIfNoInternetAccess = false; + Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; + DownloadInit3rdParty = false; + } + + public void FixSettingBounds() { + if (string.IsNullOrEmpty(this.DisplayCurrency) + || string.IsNullOrWhiteSpace(this.DisplayCurrency)) { + this.DisplayCurrency = "USD"; + } + if (this.SwitchMinSecondsFixed <= 0) { + this.SwitchMinSecondsFixed = 90; + } + if (this.SwitchMinSecondsDynamic <= 0) { + this.SwitchMinSecondsDynamic = 30; + } + if (this.SwitchMinSecondsAMD <= 0) { + this.SwitchMinSecondsAMD = 60; + } + if (this.MinerAPIQueryInterval <= 0) { + this.MinerAPIQueryInterval = 5; + } + if (this.MinerRestartDelayMS <= 0) { + this.MinerRestartDelayMS = 500; + } + if (this.MinIdleSeconds <= 0) { + this.MinIdleSeconds = 60; + } + if (this.LogMaxFileSize <= 0) { + this.LogMaxFileSize = 1048576; + } + // check port start number, leave about 2000 ports pool size, huge yea! + if (this.ApiBindPortPoolStart > (65535 - 2000)) { + this.ApiBindPortPoolStart = 5100; + } + } + + } +} diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs index b1325e8..875cf05 100644 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs +++ b/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs @@ -8,8 +8,8 @@ namespace NiceHashMiner.Configs { public class DeviceBenchmarkConfigManager : BaseLazySingleton { - private Dictionary _benchmarkConfigs; - public Dictionary BenchmarkConfigs { + private Dictionary _benchmarkConfigs; + public Dictionary BenchmarkConfigs { get { return _benchmarkConfigs; } set { if (value != null) { @@ -20,22 +20,22 @@ public Dictionary BenchmarkConfigs { // constructor has references don't delete it protected DeviceBenchmarkConfigManager() { - _benchmarkConfigs = new Dictionary(); + _benchmarkConfigs = new Dictionary(); } - private DeviceBenchmarkConfig GetConfig(string deviceUUID) { - DeviceBenchmarkConfig retConfig = null; + private DeviceBenchmarkConfig_rem GetConfig(string deviceUUID) { + DeviceBenchmarkConfig_rem retConfig = null; if (_benchmarkConfigs.TryGetValue(deviceUUID, out retConfig) == false) { retConfig = null; } return retConfig; } - public DeviceBenchmarkConfig GetConfig(DeviceGroupType deviceGroupType, + public DeviceBenchmarkConfig_rem GetConfig(DeviceGroupType deviceGroupType, string deviceUUID, string deviceName) { - DeviceBenchmarkConfig retConfig = GetConfig(deviceUUID); + DeviceBenchmarkConfig_rem retConfig = GetConfig(deviceUUID); if (retConfig == null) { - retConfig = new DeviceBenchmarkConfig(deviceGroupType, deviceUUID, deviceName); + retConfig = new DeviceBenchmarkConfig_rem(deviceGroupType, deviceUUID, deviceName); _benchmarkConfigs.Add(deviceUUID, retConfig); } diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs similarity index 90% rename from NiceHashMiner/Configs/DeviceBenchmarkConfig.cs rename to NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs index 12eca8e..f305121 100644 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfig.cs +++ b/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs @@ -10,12 +10,9 @@ namespace NiceHashMiner.Configs { [Serializable] - public class DeviceBenchmarkConfig : BaseConfigFile { + public class DeviceBenchmarkConfig_rem : BaseConfigFile { public string DeviceUUID { get; private set; } - [JsonIgnore] - public DeviceGroupType DeviceGroupType { get; private set; } - public string DeviceName { get; private set; } //public int TimeLimit { get; set; } public Dictionary AlgorithmSettings { get; set; } @@ -28,12 +25,11 @@ public class DeviceBenchmarkConfig : BaseConfigFile { [JsonIgnore] public bool IsAlgorithmSettingsInit { get; set; } - public DeviceBenchmarkConfig(DeviceGroupType deviceGroupType, + public DeviceBenchmarkConfig_rem(DeviceGroupType deviceGroupType, string deviceUUID, string deviceName, Dictionary benchmarkSpeeds = null) { - DeviceGroupType = deviceGroupType; DeviceUUID = deviceUUID; DeviceName = deviceName; if (benchmarkSpeeds != null) { @@ -60,7 +56,7 @@ protected override void InitializePaths() { // TODO make generic initializations protected override void InitializeObject() { // if new backup benchmarks - if (ConfigManager.Instance.GeneralConfig.IsNewVersion) { + if (ConfigManager_rem.Instance.GeneralConfig.IsNewVersion) { Helpers.ConsolePrint("DeviceBenchmarkConfig", String.Format("Backing up {0} to {1}..", FilePath, FilePathOld)); try { if (File.Exists(FilePathOld)) diff --git a/NiceHashMiner/Configs/BaseConfigFile.cs b/NiceHashMiner/Configs/File/BaseConfigFile.cs similarity index 100% rename from NiceHashMiner/Configs/BaseConfigFile.cs rename to NiceHashMiner/Configs/File/BaseConfigFile.cs diff --git a/NiceHashMiner/Configs/File/ConfigFile.cs b/NiceHashMiner/Configs/File/ConfigFile.cs new file mode 100644 index 0000000..cf32983 --- /dev/null +++ b/NiceHashMiner/Configs/File/ConfigFile.cs @@ -0,0 +1,73 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Configs { + public abstract class ConfigFile where T : class { + #region statics/consts + // statics/consts + const string TAG = "ConfigFile"; + const string CONF_FOLDER = @"configs\"; + + private static void CheckAndCreateConfigsFolder() { + try { + if (Directory.Exists(CONF_FOLDER) == false) { + Directory.CreateDirectory(CONF_FOLDER); + } + } catch { } + } + #endregion statics/consts + + protected string _filePath = ""; + protected string _filePathOld = ""; + + protected T _file = null; + + public ConfigFile(string fileName, string fileNameOld) { + if(fileName.Contains(CONF_FOLDER)) { + this._filePath = fileName; + } else { + this._filePath = CONF_FOLDER + fileName; + } + if (fileNameOld.Contains(CONF_FOLDER)) { + this._filePathOld = fileNameOld; + } else { + this._filePathOld = CONF_FOLDER + fileNameOld; + } + } + + protected void ReadFile() { + CheckAndCreateConfigsFolder(); + try { + if (new FileInfo(_filePath).Exists) { + _file = JsonConvert.DeserializeObject(File.ReadAllText(_filePath), Globals.JsonSettings); + } else { + Commit(); + } + } catch (Exception ex) { + Helpers.ConsolePrint(TAG, String.Format("ReadFile {0}: exception {1}", _filePath, ex.ToString())); + } + } + + public void Commit() { + try { + File.WriteAllText(_filePath, JsonConvert.SerializeObject(_file, Formatting.Indented)); + } catch (Exception ex) { + Helpers.ConsolePrint(TAG, String.Format("Commit {0}: exception {1}", _filePath, ex.ToString())); + } + } + + public void CreateBackup() { + Helpers.ConsolePrint(TAG, String.Format("Backing up {0} to {1}..", _filePath, _filePathOld)); + try { + if (File.Exists(_filePathOld)) + File.Delete(_filePathOld); + File.Move(_filePath, _filePathOld); + } catch { } + } + } +} diff --git a/NiceHashMiner/Configs/File/DeviceBenchmarkConfigFile.cs b/NiceHashMiner/Configs/File/DeviceBenchmarkConfigFile.cs new file mode 100644 index 0000000..10d9b45 --- /dev/null +++ b/NiceHashMiner/Configs/File/DeviceBenchmarkConfigFile.cs @@ -0,0 +1,29 @@ +using NiceHashMiner.Configs.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Configs.File { + public class DeviceBenchmarkConfigFile : ConfigFile { + const string BENCHMARK_PREFIX = "benchmark_"; + + private static string InitializePaths(string DeviceUUID) { + // make device name + char[] invalid = new char[] { '<', '>', ':', '"', '/', '\\', '|', '?', '*' }; + string fileName = BENCHMARK_PREFIX + DeviceUUID.Replace(' ', '_'); + foreach (var c in invalid) { + fileName = fileName.Replace(c.ToString(), String.Empty); + } + const string extension = ".json"; + FilePath = fileName + extension; + FilePathOld = fileName + "_OLD" + extension; + } + + public DeviceBenchmarkConfigFile(string DeviceUUID) { + + } + + } +} diff --git a/NiceHashMiner/Configs/File/GeneralConfigFile.cs b/NiceHashMiner/Configs/File/GeneralConfigFile.cs new file mode 100644 index 0000000..b15a049 --- /dev/null +++ b/NiceHashMiner/Configs/File/GeneralConfigFile.cs @@ -0,0 +1,14 @@ +using NiceHashMiner.Configs.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Configs { + public class GeneralConfigFile : ConfigFile { + public GeneralConfigFile() + : base("General.json", "General_old.json") { + } + } +} diff --git a/NiceHashMiner/Configs/GeneralConfig.cs b/NiceHashMiner/Configs/GeneralConfigHandler.cs similarity index 98% rename from NiceHashMiner/Configs/GeneralConfig.cs rename to NiceHashMiner/Configs/GeneralConfigHandler.cs index d21927e..1c471bf 100644 --- a/NiceHashMiner/Configs/GeneralConfig.cs +++ b/NiceHashMiner/Configs/GeneralConfigHandler.cs @@ -8,7 +8,7 @@ namespace NiceHashMiner.Configs { [Serializable] - public class GeneralConfig : BaseConfigFile { + public class GeneralConfigHandler : BaseConfigFile { #region Members public Version ConfigFileVersion { get; set; } @@ -182,7 +182,7 @@ public void SetDefaults() { DownloadInit3rdParty = false; } - public GeneralConfig(bool initDefaults = false) { + public GeneralConfigHandler(bool initDefaults = false) { ConfigFileVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); DeviceDetection = new DeviceDetectionConfig(); diff --git a/NiceHashMiner/CurrencyConverter.cs b/NiceHashMiner/CurrencyConverter.cs index 9ae7c39..3b2ad44 100644 --- a/NiceHashMiner/CurrencyConverter.cs +++ b/NiceHashMiner/CurrencyConverter.cs @@ -12,7 +12,7 @@ public static class CurrencyConverter private static CurrencyAPIResponse LastResponse; private static bool ConverterActive { - get { return ConfigManager.Instance.GeneralConfig.DisplayCurrency != "USD"; } + get { return ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency != "USD"; } } @@ -35,12 +35,12 @@ public static double ConvertToActiveCurrency(double amount) //Helpers.ConsolePrint("CurrencyConverter", "Current Currency: " + ConfigManager.Instance.GeneralConfig.DisplayCurrency); double usdExchangeRate = 1.0; - if (LastResponse.rates.TryGetValue(ConfigManager.Instance.GeneralConfig.DisplayCurrency, out usdExchangeRate)) + if (LastResponse.rates.TryGetValue(ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency, out usdExchangeRate)) return amount * usdExchangeRate; else { - Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + ConfigManager.Instance.GeneralConfig.DisplayCurrency + " falling back to USD rates"); - ConfigManager.Instance.GeneralConfig.DisplayCurrency = "USD"; + Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency + " falling back to USD rates"); + ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency = "USD"; return amount; } } @@ -57,7 +57,7 @@ private static void UpdateAPI() { Helpers.ConsolePrint("CurrencyConverter", E.Message); Helpers.ConsolePrint("CurrencyConverter", "Unable to update API: reverting to usd"); - ConfigManager.Instance.GeneralConfig.DisplayCurrency = "USD"; + ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency = "USD"; } } } diff --git a/NiceHashMiner/Devices/CPUUtils.cs b/NiceHashMiner/Devices/CPUUtils.cs index fcfd2b5..3d97358 100644 --- a/NiceHashMiner/Devices/CPUUtils.cs +++ b/NiceHashMiner/Devices/CPUUtils.cs @@ -44,14 +44,14 @@ private static bool HasExtensionSupport(CPUExtensionType type) { /// /// public static CPUExtensionType GetMostOptimized() { - if (ConfigManager.Instance.GeneralConfig.ForceCPUExtension == CPUExtensionType.Automatic) { + if (ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension == CPUExtensionType.Automatic) { for (int i = 0; i < _detectOrder.Length; ++i) { if (HasExtensionSupport(_detectOrder[i])) { return _detectOrder[i]; } } - } else if (HasExtensionSupport(ConfigManager.Instance.GeneralConfig.ForceCPUExtension)) { - return ConfigManager.Instance.GeneralConfig.ForceCPUExtension; + } else if (HasExtensionSupport(ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension)) { + return ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension; } return CPUExtensionType.Automatic; } diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 6916371..8928c3c 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -57,7 +57,7 @@ public class ComputeDevice public string Codename { get; private set; } [JsonIgnore] - public DeviceBenchmarkConfig DeviceBenchmarkConfig { get; private set; } + public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } [JsonIgnore] [field: NonSerialized] @@ -124,7 +124,7 @@ public string GetFullName() { } // TODO add file check and stuff like that - public void SetDeviceBenchmarkConfig(DeviceBenchmarkConfig deviceBenchmarkConfig, bool forceSet = false) { + public void SetDeviceBenchmarkConfig(DeviceBenchmarkConfig_rem deviceBenchmarkConfig, bool forceSet = false) { DeviceBenchmarkConfig = deviceBenchmarkConfig; // check initialization diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index fd73f47..e6136e2 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -134,7 +134,7 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { NVIDIA.QueryCudaDevices(); } // OpenCL and AMD - if (ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD) { + if (ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD) { Helpers.ConsolePrint(TAG, "Skipping AMD device detection, settings set to disabled"); showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query_Skip")); } else { @@ -171,7 +171,7 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { _currentNvidiaSMIDriver = GetNvidiaSMIDriver(); // if we have nvidia cards but no CUDA devices tell the user to upgrade driver bool isNvidiaErrorShown = false; // to prevent showing twice - bool showWarning = ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController(); + bool showWarning = ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController(); if (showWarning && CudaDevices.Count == 0 && _currentNvidiaSMIDriver.IsLesserVersionThan(NVIDIA_MIN_DETECTION_DRIVER)) { isNvidiaErrorShown = true; var minDriver = NVIDIA_MIN_DETECTION_DRIVER.ToString(); @@ -235,7 +235,7 @@ public static void QueryVideoControllers() { AvaliableVideoControllers.Add(vidController); } Helpers.ConsolePrint(TAG, stringBuilder.ToString()); - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && !allVideoContollersOK) { + if (ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning && !allVideoContollersOK) { string msg = International.GetText("QueryVideoControllers_NOT_ALL_OK_Msg"); foreach (var vc in AvaliableVideoControllers) { if (!vc.Status.ToLower().Equals("ok")) { @@ -313,7 +313,7 @@ static private void QueryCudaDevicesOutputErrorDataReceived(object sender, DataR } public static bool IsSkipNVIDIA() { - return ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; + return ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; } static public void QueryCudaDevices() { @@ -518,7 +518,7 @@ static public void QueryAMD() { } } } - if (ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning && ShowWarningDialog == true) { + if (ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning && ShowWarningDialog == true) { Form WarningDialog = new DriverVersionConfirmationDialog(); WarningDialog.ShowDialog(); WarningDialog = null; @@ -677,7 +677,7 @@ static public void QueryAMD() { var newAmdDev = new AmdGpuDevice(amdGpus[i_id], deviceDriverOld[deviceName]); newAmdDev.DeviceName = deviceName; newAmdDev.UUID = _busIdsInfo[busID].Item2; - bool isDisabledGroup = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; + bool isDisabledGroup = ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; string skipOrAdd = isDisabledGroup ? "SKIPED" : "ADDED"; string isDisabledGroupStr = isDisabledGroup ? " (AMD group disabled)" : ""; string etherumCapableStr = newAmdDev.IsEtherumCapable() ? "YES" : "NO"; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 03ee2ef..159f8a6 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -86,7 +86,6 @@ public static Dictionary CreateDefaultsForGroup(Device ret.Remove(AlgorithmType.Lyra2RE); ret.Remove(AlgorithmType.Lyra2REv2); - //ret.Remove(AlgorithmType.CryptoNight); } if (DeviceGroupType.NVIDIA_3_x == deviceGroupType) { // minerName change => "whirlpoolx" => "whirlpool" @@ -95,7 +94,6 @@ public static Dictionary CreateDefaultsForGroup(Device ret.Remove(AlgorithmType.NeoScrypt); ret.Remove(AlgorithmType.Lyra2RE); ret.Remove(AlgorithmType.Lyra2REv2); - //ret.Remove(AlgorithmType.CryptoNight); } return ret; } diff --git a/NiceHashMiner/Ethereum.cs b/NiceHashMiner/Ethereum.cs index 9e2cae6..af81cf0 100644 --- a/NiceHashMiner/Ethereum.cs +++ b/NiceHashMiner/Ethereum.cs @@ -152,7 +152,7 @@ public static void GetCurrentBlock(string worker) if (ret == null) { Helpers.ConsolePrint(worker, "Failed to obtain current block, using default 1700000."); - CurrentBlockNum = ConfigManager.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); + CurrentBlockNum = ConfigManager_rem.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); } else { diff --git a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs index e5c4a7a..92710fb 100644 --- a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs +++ b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs @@ -167,7 +167,7 @@ private void listViewDevicesItemChecked(object sender, ItemCheckedEventArgs e) { G.SaveOption(); } if (SaveToGeneralConfig) { - ConfigManager.Instance.GeneralConfig.Commit(); + ConfigManager_rem.Instance.GeneralConfig.Commit(); } var lvi = e.Item as ListViewItem; if (lvi != null) _listItemCheckColorSetter.LviSetColor(lvi); diff --git a/NiceHashMiner/Forms/DriverVersionConfirmationDialog.cs b/NiceHashMiner/Forms/DriverVersionConfirmationDialog.cs index c1ea7f7..fbbb2b8 100644 --- a/NiceHashMiner/Forms/DriverVersionConfirmationDialog.cs +++ b/NiceHashMiner/Forms/DriverVersionConfirmationDialog.cs @@ -27,7 +27,7 @@ private void buttonOK_Click(object sender, EventArgs e) if (chkBoxDontShowAgain.Checked) { Helpers.ConsolePrint("NICEHASH", "Setting ShowDriverVersionWarning to false"); - ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning = false; + ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning = false; } this.Close(); diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 64c18eb..3a3df56 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -418,7 +418,7 @@ void NextBenchmark() { CurrentAlgoName = AlgorithmNiceHashNames.GetName(_currentAlgorithm.NiceHashID); _currentMiner.InitBenchmarkSetup(new MiningPair(_currentDevice, _currentAlgorithm)); - var time = ConfigManager.Instance.GeneralConfig.BenchmarkTimeLimits + var time = ConfigManager_rem.Instance.GeneralConfig.BenchmarkTimeLimits .GetBenchamrktime(benchmarkOptions1.PerformanceType, _currentDevice.DeviceGroupType); //currentConfig.TimeLimit = time; if (__CPUBenchmarkStatus != null) { @@ -569,7 +569,7 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e } // save already benchmarked algorithms - ConfigManager.Instance.CommitBenchmarks(); + ConfigManager_rem.Instance.CommitBenchmarks(); // check devices without benchmarks foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cdev.ComputeDeviceEnabledOption.IsEnabled) { diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs b/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs index e72830f..bd380b0 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs +++ b/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs @@ -31,7 +31,7 @@ public Form_ChooseLanguage_r() { } private void button_OK_Click(object sender, EventArgs e) { - ConfigManager.Instance.GeneralConfig.Language = (LanguageType)comboBox_Languages.SelectedIndex; + ConfigManager_rem.Instance.GeneralConfig.Language = (LanguageType)comboBox_Languages.SelectedIndex; this.Close(); } } diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs b/NiceHashMiner/Forms/Form_ClaymoreTOS.cs index 7adf14a..c3e2db6 100644 --- a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs +++ b/NiceHashMiner/Forms/Form_ClaymoreTOS.cs @@ -22,12 +22,12 @@ public Form_ClaymoreTOS() { } private void button_Agree_Click(object sender, EventArgs e) { - ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; + ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; this.Close(); } private void button_Decline_Click(object sender, EventArgs e) { - ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; this.Close(); } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 4a16ae6..bac106e 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -101,11 +101,11 @@ private void InitLocalization() { // these strings are no longer used, check and use them as base string rateString = International.GetText("Rate") + ":"; string ratesBTCInitialString = "0.00000000 BTC/" + International.GetText("Day"); - string ratesDollarInitialString = String.Format("0.00 {0}/", ConfigManager.Instance.GeneralConfig.DisplayCurrency) + International.GetText("Day"); + string ratesDollarInitialString = String.Format("0.00 {0}/", ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency) + International.GetText("Day"); toolStripStatusLabelGlobalRateText.Text = International.GetText("Form_Main_global_rate") + ":"; toolStripStatusLabelBTCDayText.Text = "BTC/" + International.GetText("Day"); - toolStripStatusLabelBalanceText.Text = (ConfigManager.Instance.GeneralConfig.DisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; + toolStripStatusLabelBalanceText.Text = (ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; devicesListViewEnableControl1.InitLocale(); @@ -119,17 +119,17 @@ private void InitLocalization() { } private void InitMainConfigGUIData() { - if (ConfigManager.Instance.GeneralConfig.ServiceLocation >= 0 && ConfigManager.Instance.GeneralConfig.ServiceLocation < Globals.MiningLocation.Length) - comboBoxLocation.SelectedIndex = ConfigManager.Instance.GeneralConfig.ServiceLocation; + if (ConfigManager_rem.Instance.GeneralConfig.ServiceLocation >= 0 && ConfigManager_rem.Instance.GeneralConfig.ServiceLocation < Globals.MiningLocation.Length) + comboBoxLocation.SelectedIndex = ConfigManager_rem.Instance.GeneralConfig.ServiceLocation; else comboBoxLocation.SelectedIndex = 0; - textBoxBTCAddress.Text = ConfigManager.Instance.GeneralConfig.BitcoinAddress; - textBoxWorkerName.Text = ConfigManager.Instance.GeneralConfig.WorkerName; + textBoxBTCAddress.Text = ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress; + textBoxWorkerName.Text = ConfigManager_rem.Instance.GeneralConfig.WorkerName; ShowWarningNiceHashData = true; DemoMode = false; - toolStripStatusLabelBalanceDollarValue.Text = "(" + ConfigManager.Instance.GeneralConfig.DisplayCurrency + ")"; + toolStripStatusLabelBalanceDollarValue.Text = "(" + ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency + ")"; if (_isDeviceDetectionInitialized) { devicesListViewEnableControl1.ResetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); @@ -150,13 +150,13 @@ public void AfterLoadComplete() private void IdleCheck_Tick(object sender, EventArgs e) { - if (!ConfigManager.Instance.GeneralConfig.StartMiningWhenIdle) return; + if (!ConfigManager_rem.Instance.GeneralConfig.StartMiningWhenIdle) return; uint MSIdle = Helpers.GetIdleTime(); if (MinerStatsCheck.Enabled) { - if (MSIdle < (ConfigManager.Instance.GeneralConfig.MinIdleSeconds * 1000)) + if (MSIdle < (ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds * 1000)) { buttonStopMining_Click(null, null); Helpers.ConsolePrint("NICEHASH", "Resumed from idling"); @@ -164,7 +164,7 @@ private void IdleCheck_Tick(object sender, EventArgs e) } else { - if (BenchmarkForm == null && (MSIdle > (ConfigManager.Instance.GeneralConfig.MinIdleSeconds * 1000))) + if (BenchmarkForm == null && (MSIdle > (ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds * 1000))) { Helpers.ConsolePrint("NICEHASH", "Entering idling state"); buttonStartMining_Click(null, null); @@ -205,7 +205,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { ///////////////////////////////////////////// /////// from here on we have our devices and Miners initialized - ConfigManager.Instance.AfterDeviceQueryInitialization(); + ConfigManager_rem.Instance.AfterDeviceQueryInitialization(); LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SaveConfig")); // All devices settup should be initialized in AllDevices @@ -218,13 +218,13 @@ private void StartupTimer_Tick(object sender, EventArgs e) { MinerStatsCheck = new Timer(); MinerStatsCheck.Tick += MinerStatsCheck_Tick; - MinerStatsCheck.Interval = ConfigManager.Instance.GeneralConfig.MinerAPIQueryInterval * 1000; + MinerStatsCheck.Interval = ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval * 1000; SMAMinerCheck = new Timer(); SMAMinerCheck.Tick += SMAMinerCheck_Tick; - SMAMinerCheck.Interval = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); + SMAMinerCheck.Interval = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); if (ComputeDeviceManager.Group.ContainsAMD_GPUs) { - SMAMinerCheck.Interval = (ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); + SMAMinerCheck.Interval = (ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); } UpdateCheck = new Timer(); @@ -271,10 +271,10 @@ private void StartupTimer_Tick(object sender, EventArgs e) { LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetWindowsErrorReporting")); - Helpers.DisableWindowsErrorReporting(ConfigManager.Instance.GeneralConfig.DisableWindowsErrorReporting); + Helpers.DisableWindowsErrorReporting(ConfigManager_rem.Instance.GeneralConfig.DisableWindowsErrorReporting); LoadingScreen.IncreaseLoadCounter(); - if (ConfigManager.Instance.GeneralConfig.NVIDIAP0State) { + if (ConfigManager_rem.Instance.GeneralConfig.NVIDIAP0State) { LoadingScreen.SetInfoMsg(International.GetText("Form_Main_loadtext_NVIDIAP0State")); try { ProcessStartInfo psi = new ProcessStartInfo(); @@ -298,7 +298,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { // standard miners check scope { // check if download needed - if (!MinersExistanceChecker.IsMinersBinsInit() && !ConfigManager.Instance.GeneralConfig.DownloadInit) { + if (!MinersExistanceChecker.IsMinersBinsInit() && !ConfigManager_rem.Instance.GeneralConfig.DownloadInit) { Form_Loading downloadUnzipForm = new Form_Loading(new MinersDownloader(MinersDownloadManager.StandardDlSetup)); SetChildFormCenter(downloadUnzipForm); downloadUnzipForm.ShowDialog(); @@ -309,8 +309,8 @@ private void StartupTimer_Tick(object sender, EventArgs e) { International.GetText("Warning_with_Exclamation"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { - ConfigManager.Instance.GeneralConfig.DownloadInit = false; - ConfigManager.Instance.GeneralConfig.Commit(); + ConfigManager_rem.Instance.GeneralConfig.DownloadInit = false; + ConfigManager_rem.Instance.GeneralConfig.Commit(); Process PHandle = new Process(); PHandle.StartInfo.FileName = Application.ExecutablePath; PHandle.Start(); @@ -319,21 +319,21 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } } else { // all good - ConfigManager.Instance.GeneralConfig.DownloadInit = true; - ConfigManager.Instance.GeneralConfig.Commit(); + ConfigManager_rem.Instance.GeneralConfig.DownloadInit = true; + ConfigManager_rem.Instance.GeneralConfig.Commit(); } } // 3rdparty miners check scope { // check if setting set - if (ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.NOT_SET) { + if (ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.NOT_SET) { // Show TOS Form tos = new Form_ClaymoreTOS(); tos.ShowDialog(this); } // check if download needed - if (ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { - if (!MinersExistanceChecker.IsMiners3rdPartyBinsInit() && !ConfigManager.Instance.GeneralConfig.DownloadInit3rdParty) { + if (ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { + if (!MinersExistanceChecker.IsMiners3rdPartyBinsInit() && !ConfigManager_rem.Instance.GeneralConfig.DownloadInit3rdParty) { Form_Loading download3rdPartyUnzipForm = new Form_Loading(new MinersDownloader(MinersDownloadManager.ThirdPartyDlSetup)); SetChildFormCenter(download3rdPartyUnzipForm); download3rdPartyUnzipForm.ShowDialog(); @@ -344,8 +344,8 @@ private void StartupTimer_Tick(object sender, EventArgs e) { International.GetText("Warning_with_Exclamation"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { - ConfigManager.Instance.GeneralConfig.DownloadInit3rdParty = false; - ConfigManager.Instance.GeneralConfig.Commit(); + ConfigManager_rem.Instance.GeneralConfig.DownloadInit3rdParty = false; + ConfigManager_rem.Instance.GeneralConfig.Commit(); Process PHandle = new Process(); PHandle.StartInfo.FileName = Application.ExecutablePath; PHandle.Start(); @@ -354,14 +354,14 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } } else { // all good - ConfigManager.Instance.GeneralConfig.DownloadInit3rdParty = true; - ConfigManager.Instance.GeneralConfig.Commit(); + ConfigManager_rem.Instance.GeneralConfig.DownloadInit3rdParty = true; + ConfigManager_rem.Instance.GeneralConfig.Commit(); } } } // no bots please - if (ConfigManager.Instance.GeneralConfig.hwidLoadFromFile && !ConfigManager.Instance.GeneralConfig.hwidOK) { + if (ConfigManager_rem.Instance.GeneralConfig.hwidLoadFromFile && !ConfigManager_rem.Instance.GeneralConfig.hwidOK) { var result = MessageBox.Show("NiceHash Miner has detected change of hardware ID. If you did not download and install NiceHash Miner, your computer may be compromised. In that case, we suggest you to install an antivirus program or reinstall your Windows.\r\n\r\nContinue with NiceHash Miner?", //International.GetText("Form_Main_msgbox_anti_botnet_msgbox"), International.GetText("Warning_with_Exclamation"), @@ -371,10 +371,10 @@ private void StartupTimer_Tick(object sender, EventArgs e) { return; } else { // users agrees he installed it so commit changes - ConfigManager.Instance.GeneralConfig.Commit(); + ConfigManager_rem.Instance.GeneralConfig.Commit(); } } else { - if (ConfigManager.Instance.GeneralConfig.AutoStartMining) { + if (ConfigManager_rem.Instance.GeneralConfig.AutoStartMining) { buttonStartMining_Click(null, null); } } @@ -403,9 +403,9 @@ private void Form_Main_Shown(object sender, EventArgs e) private void SMAMinerCheck_Tick(object sender, EventArgs e) { - SMAMinerCheck.Interval = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); + SMAMinerCheck.Interval = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); if (ComputeDeviceManager.Group.ContainsAMD_GPUs) { - SMAMinerCheck.Interval = (ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); + SMAMinerCheck.Interval = (ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); } #if (SWITCH_TESTING) @@ -475,7 +475,7 @@ public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPID string rateBTCString = FormatPayingOutput(paying); string rateCurrencyString = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying * Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", ConfigManager.Instance.GeneralConfig.DisplayCurrency) + International.GetText("Day"); + + String.Format(" {0}/", ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency) + International.GetText("Day"); ((GroupProfitControl)flowLayoutPanelRates.Controls[flowLayoutPanelRatesIndex++]) .UpdateProfitStats(groupName, deviceStringInfo, speedString, rateBTCString, rateCurrencyString); @@ -497,7 +497,7 @@ private void UpdateGlobalRate() { double TotalRate = MinersManager.Instance.GetTotalRate(); - if (ConfigManager.Instance.GeneralConfig.AutoScaleBTCValues && TotalRate < 0.1) + if (ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues && TotalRate < 0.1) { toolStripStatusLabelBTCDayText.Text = "mBTC/" + International.GetText("Day"); toolStripStatusLabelGlobalRateValue.Text = (TotalRate * 1000).ToString("F7", CultureInfo.InvariantCulture); @@ -520,7 +520,7 @@ void BalanceCheck_Tick(object sender, EventArgs e) double Balance = NiceHashStats.GetBalance(textBoxBTCAddress.Text.Trim(), textBoxBTCAddress.Text.Trim() + "." + textBoxWorkerName.Text.Trim()); if (Balance > 0) { - if (ConfigManager.Instance.GeneralConfig.AutoScaleBTCValues && Balance < 0.1) + if (ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues && Balance < 0.1) { toolStripStatusLabelBalanceBTCCode.Text = "mBTC"; toolStripStatusLabelBalanceBTCValue.Text = (Balance * 1000).ToString("F7", CultureInfo.InvariantCulture); @@ -686,7 +686,7 @@ private void Form1_FormClosing(object sender, FormClosingEventArgs e) private void buttonBenchmark_Click(object sender, EventArgs e) { - ConfigManager.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; + ConfigManager_rem.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; BenchmarkForm = new Form_Benchmark(); SetChildFormCenter(BenchmarkForm); @@ -816,9 +816,9 @@ private void buttonStartMining_Click(object sender, EventArgs e) devicesListViewEnableControl1.IsMining = true; buttonStopMining.Enabled = true; - ConfigManager.Instance.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); - ConfigManager.Instance.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); - ConfigManager.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; + ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); + ConfigManager_rem.Instance.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); + ConfigManager_rem.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; InitFlowPanelStart(); ClearRatesALL(); @@ -826,7 +826,7 @@ private void buttonStartMining_Click(object sender, EventArgs e) var btcAdress = DemoMode ? Globals.DemoUser : textBoxBTCAddress.Text.Trim(); var isMining = MinersManager.Instance.StartInitialize(this, Globals.MiningLocation[comboBoxLocation.SelectedIndex], textBoxWorkerName.Text.Trim(), btcAdress); - if (!DemoMode) ConfigManager.Instance.GeneralConfig.Commit(); + if (!DemoMode) ConfigManager_rem.Instance.GeneralConfig.Commit(); SMAMinerCheck.Interval = 100; SMAMinerCheck.Start(); @@ -867,7 +867,7 @@ private string FormatPayingOutput(double paying) { string ret = ""; - if (ConfigManager.Instance.GeneralConfig.AutoScaleBTCValues && paying < 0.1) + if (ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues && paying < 0.1) ret = (paying * 1000).ToString("F7", CultureInfo.InvariantCulture) + " mBTC/" + International.GetText("Day"); else ret = paying.ToString("F8", CultureInfo.InvariantCulture) + " BTC/" + International.GetText("Day"); @@ -901,10 +901,10 @@ private void textBoxCheckBoxMain_Leave(object sender, EventArgs e) if (VerifyMiningAddress(false)) { // Commit to config.json - ConfigManager.Instance.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); - ConfigManager.Instance.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); - ConfigManager.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; - ConfigManager.Instance.GeneralConfig.Commit(); + ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); + ConfigManager_rem.Instance.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); + ConfigManager_rem.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; + ConfigManager_rem.Instance.GeneralConfig.Commit(); } } @@ -914,7 +914,7 @@ private void Form1_Resize(object sender, EventArgs e) notifyIcon1.Icon = Properties.Resources.logo; notifyIcon1.Text = Application.ProductName + " v" + Application.ProductVersion + "\nDouble-click to restore.."; - if (ConfigManager.Instance.GeneralConfig.MinimizeToTray && FormWindowState.Minimized == this.WindowState) + if (ConfigManager_rem.Instance.GeneralConfig.MinimizeToTray && FormWindowState.Minimized == this.WindowState) { notifyIcon1.Visible = true; this.Hide(); diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 7533078..ce8fadb 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -37,8 +37,8 @@ private set { ComputeDevice _selectedComputeDevice; // deep copy initial state if we want to discard changes - private GeneralConfig _generalConfigBackup; - private Dictionary _benchmarkConfigsBackup; + private GeneralConfigHandler _generalConfigBackup; + private Dictionary _benchmarkConfigsBackup; public Form_Settings() { InitializeComponent(); @@ -48,8 +48,8 @@ public Form_Settings() { IsChange = false; IsChangeSaved = false; - _benchmarkConfigsBackup = MemoryHelper.DeepClone(ConfigManager.Instance.BenchmarkConfigs); - _generalConfigBackup = MemoryHelper.DeepClone(ConfigManager.Instance.GeneralConfig); + _benchmarkConfigsBackup = MemoryHelper.DeepClone(ConfigManager_rem.Instance.BenchmarkConfigs); + _generalConfigBackup = MemoryHelper.DeepClone(ConfigManager_rem.Instance.GeneralConfig); // initialize form InitializeFormTranslations(); @@ -350,7 +350,7 @@ private void InitializeGeneralTabCallbacks() { } // CPU exceptions - comboBox_CPU0_ForceCPUExtension.SelectedIndex = (int)ConfigManager.Instance.GeneralConfig.ForceCPUExtension; + comboBox_CPU0_ForceCPUExtension.SelectedIndex = (int)ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension; comboBox_CPU0_ForceCPUExtension.SelectedIndexChanged += comboBox_CPU0_ForceCPUExtension_SelectedIndexChanged; // fill dag dropdown comboBox_DagLoadMode.Items.Clear(); @@ -358,51 +358,51 @@ private void InitializeGeneralTabCallbacks() { comboBox_DagLoadMode.Items.Add(MinerEtherum.GetDagGenerationString((DagGenerationType)i)); } // set selected - comboBox_DagLoadMode.SelectedIndex = (int)ConfigManager.Instance.GeneralConfig.EthminerDagGenerationType; + comboBox_DagLoadMode.SelectedIndex = (int)ConfigManager_rem.Instance.GeneralConfig.EthminerDagGenerationType; } private void InitializeGeneralTabFieldValuesReferences() { // Checkboxes set checked value { - checkBox_DebugConsole.Checked = ConfigManager.Instance.GeneralConfig.DebugConsole; - checkBox_AutoStartMining.Checked = ConfigManager.Instance.GeneralConfig.AutoStartMining; - checkBox_HideMiningWindows.Checked = ConfigManager.Instance.GeneralConfig.HideMiningWindows; - checkBox_MinimizeToTray.Checked = ConfigManager.Instance.GeneralConfig.MinimizeToTray; - checkBox_DisableDetectionNVIDIA.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; - checkBox_DisableDetectionAMD.Checked = ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; - checkBox_AutoScaleBTCValues.Checked = ConfigManager.Instance.GeneralConfig.AutoScaleBTCValues; - checkBox_StartMiningWhenIdle.Checked = ConfigManager.Instance.GeneralConfig.StartMiningWhenIdle; - checkBox_ShowDriverVersionWarning.Checked = ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning; - checkBox_DisableWindowsErrorReporting.Checked = ConfigManager.Instance.GeneralConfig.DisableWindowsErrorReporting; - checkBox_NVIDIAP0State.Checked = ConfigManager.Instance.GeneralConfig.NVIDIAP0State; - checkBox_LogToFile.Checked = ConfigManager.Instance.GeneralConfig.LogToFile; - checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager.Instance.GeneralConfig.DisableAMDTempControl; - checkBox_DisableDefaultOptimizations.Checked = ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations; - checkBox_ContinueMiningIfNoInternetAccess.Checked = ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess; - this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; + checkBox_DebugConsole.Checked = ConfigManager_rem.Instance.GeneralConfig.DebugConsole; + checkBox_AutoStartMining.Checked = ConfigManager_rem.Instance.GeneralConfig.AutoStartMining; + checkBox_HideMiningWindows.Checked = ConfigManager_rem.Instance.GeneralConfig.HideMiningWindows; + checkBox_MinimizeToTray.Checked = ConfigManager_rem.Instance.GeneralConfig.MinimizeToTray; + checkBox_DisableDetectionNVIDIA.Checked = ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; + checkBox_DisableDetectionAMD.Checked = ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; + checkBox_AutoScaleBTCValues.Checked = ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues; + checkBox_StartMiningWhenIdle.Checked = ConfigManager_rem.Instance.GeneralConfig.StartMiningWhenIdle; + checkBox_ShowDriverVersionWarning.Checked = ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning; + checkBox_DisableWindowsErrorReporting.Checked = ConfigManager_rem.Instance.GeneralConfig.DisableWindowsErrorReporting; + checkBox_NVIDIAP0State.Checked = ConfigManager_rem.Instance.GeneralConfig.NVIDIAP0State; + checkBox_LogToFile.Checked = ConfigManager_rem.Instance.GeneralConfig.LogToFile; + checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager_rem.Instance.GeneralConfig.DisableAMDTempControl; + checkBox_DisableDefaultOptimizations.Checked = ConfigManager_rem.Instance.GeneralConfig.DisableDefaultOptimizations; + checkBox_ContinueMiningIfNoInternetAccess.Checked = ConfigManager_rem.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess; + this.checkBox_Use3rdPartyMiners.Checked = ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; } // Textboxes { - textBox_BitcoinAddress.Text = ConfigManager.Instance.GeneralConfig.BitcoinAddress; - textBox_WorkerName.Text = ConfigManager.Instance.GeneralConfig.WorkerName; - textBox_SwitchMinSecondsFixed.Text = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed.ToString(); - textBox_SwitchMinSecondsDynamic.Text = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic.ToString(); - textBox_SwitchMinSecondsAMD.Text = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD.ToString(); - textBox_MinerAPIQueryInterval.Text = ConfigManager.Instance.GeneralConfig.MinerAPIQueryInterval.ToString(); - textBox_MinerRestartDelayMS.Text = ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS.ToString(); - textBox_MinIdleSeconds.Text = ConfigManager.Instance.GeneralConfig.MinIdleSeconds.ToString(); - textBox_LogMaxFileSize.Text = ConfigManager.Instance.GeneralConfig.LogMaxFileSize.ToString(); - textBox_ethminerDefaultBlockHeight.Text = ConfigManager.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); - textBox_APIBindPortStart.Text = ConfigManager.Instance.GeneralConfig.ApiBindPortPoolStart.ToString(); - textBox_MinProfit.Text = ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma; + textBox_BitcoinAddress.Text = ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress; + textBox_WorkerName.Text = ConfigManager_rem.Instance.GeneralConfig.WorkerName; + textBox_SwitchMinSecondsFixed.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed.ToString(); + textBox_SwitchMinSecondsDynamic.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic.ToString(); + textBox_SwitchMinSecondsAMD.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD.ToString(); + textBox_MinerAPIQueryInterval.Text = ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval.ToString(); + textBox_MinerRestartDelayMS.Text = ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS.ToString(); + textBox_MinIdleSeconds.Text = ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds.ToString(); + textBox_LogMaxFileSize.Text = ConfigManager_rem.Instance.GeneralConfig.LogMaxFileSize.ToString(); + textBox_ethminerDefaultBlockHeight.Text = ConfigManager_rem.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); + textBox_APIBindPortStart.Text = ConfigManager_rem.Instance.GeneralConfig.ApiBindPortPoolStart.ToString(); + textBox_MinProfit.Text = ConfigManager_rem.Instance.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma; } // set custom control referances { - benchmarkLimitControlCPU.TimeLimits = ConfigManager.Instance.GeneralConfig.BenchmarkTimeLimits.CPU; - benchmarkLimitControlNVIDIA.TimeLimits = ConfigManager.Instance.GeneralConfig.BenchmarkTimeLimits.NVIDIA; - benchmarkLimitControlAMD.TimeLimits = ConfigManager.Instance.GeneralConfig.BenchmarkTimeLimits.AMD; + benchmarkLimitControlCPU.TimeLimits = ConfigManager_rem.Instance.GeneralConfig.BenchmarkTimeLimits.CPU; + benchmarkLimitControlNVIDIA.TimeLimits = ConfigManager_rem.Instance.GeneralConfig.BenchmarkTimeLimits.NVIDIA; + benchmarkLimitControlAMD.TimeLimits = ConfigManager_rem.Instance.GeneralConfig.BenchmarkTimeLimits.AMD; // here we want all devices devicesListViewEnableControl1.SetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); @@ -423,10 +423,10 @@ private void InitializeGeneralTabFieldValuesReferences() { // ComboBox { - comboBox_Language.SelectedIndex = (int)ConfigManager.Instance.GeneralConfig.Language; - comboBox_ServiceLocation.SelectedIndex = ConfigManager.Instance.GeneralConfig.ServiceLocation; + comboBox_Language.SelectedIndex = (int)ConfigManager_rem.Instance.GeneralConfig.Language; + comboBox_ServiceLocation.SelectedIndex = ConfigManager_rem.Instance.GeneralConfig.ServiceLocation; - currencyConverterCombobox.SelectedItem = ConfigManager.Instance.GeneralConfig.DisplayCurrency; + currencyConverterCombobox.SelectedItem = ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency; } } @@ -495,19 +495,19 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { if (!_isInitFinished) return; // indicate there has been a change IsChange = true; - ConfigManager.Instance.GeneralConfig.DebugConsole = checkBox_DebugConsole.Checked; - ConfigManager.Instance.GeneralConfig.AutoStartMining = checkBox_AutoStartMining.Checked; - ConfigManager.Instance.GeneralConfig.HideMiningWindows = checkBox_HideMiningWindows.Checked; - ConfigManager.Instance.GeneralConfig.MinimizeToTray = checkBox_MinimizeToTray.Checked; - ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA = checkBox_DisableDetectionNVIDIA.Checked; - ConfigManager.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD = checkBox_DisableDetectionAMD.Checked; - ConfigManager.Instance.GeneralConfig.AutoScaleBTCValues = checkBox_AutoScaleBTCValues.Checked; - ConfigManager.Instance.GeneralConfig.StartMiningWhenIdle = checkBox_StartMiningWhenIdle.Checked; - ConfigManager.Instance.GeneralConfig.ShowDriverVersionWarning = checkBox_ShowDriverVersionWarning.Checked; - ConfigManager.Instance.GeneralConfig.DisableWindowsErrorReporting = checkBox_DisableWindowsErrorReporting.Checked; - ConfigManager.Instance.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; - ConfigManager.Instance.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; - ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess = checkBox_ContinueMiningIfNoInternetAccess.Checked; + ConfigManager_rem.Instance.GeneralConfig.DebugConsole = checkBox_DebugConsole.Checked; + ConfigManager_rem.Instance.GeneralConfig.AutoStartMining = checkBox_AutoStartMining.Checked; + ConfigManager_rem.Instance.GeneralConfig.HideMiningWindows = checkBox_HideMiningWindows.Checked; + ConfigManager_rem.Instance.GeneralConfig.MinimizeToTray = checkBox_MinimizeToTray.Checked; + ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA = checkBox_DisableDetectionNVIDIA.Checked; + ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD = checkBox_DisableDetectionAMD.Checked; + ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues = checkBox_AutoScaleBTCValues.Checked; + ConfigManager_rem.Instance.GeneralConfig.StartMiningWhenIdle = checkBox_StartMiningWhenIdle.Checked; + ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning = checkBox_ShowDriverVersionWarning.Checked; + ConfigManager_rem.Instance.GeneralConfig.DisableWindowsErrorReporting = checkBox_DisableWindowsErrorReporting.Checked; + ConfigManager_rem.Instance.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; + ConfigManager_rem.Instance.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; + ConfigManager_rem.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess = checkBox_ContinueMiningIfNoInternetAccess.Checked; } private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, EventArgs e) { @@ -515,7 +515,7 @@ private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, Ev // indicate there has been a change IsChange = true; - ConfigManager.Instance.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; + ConfigManager_rem.Instance.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cDev.DeviceType == DeviceType.AMD) { foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { @@ -534,8 +534,8 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, // indicate there has been a change IsChange = true; - ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; - if (ConfigManager.Instance.GeneralConfig.DisableDefaultOptimizations) { + ConfigManager_rem.Instance.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; + if (ConfigManager_rem.Instance.GeneralConfig.DisableDefaultOptimizations) { foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { algorithm.Value.ExtraLaunchParameters = ""; @@ -568,63 +568,63 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, private void GeneralTextBoxes_Leave(object sender, EventArgs e) { if (!_isInitFinished) return; IsChange = true; - ConfigManager.Instance.GeneralConfig.BitcoinAddress = textBox_BitcoinAddress.Text.Trim(); - ConfigManager.Instance.GeneralConfig.WorkerName = textBox_WorkerName.Text.Trim(); + ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress = textBox_BitcoinAddress.Text.Trim(); + ConfigManager_rem.Instance.GeneralConfig.WorkerName = textBox_WorkerName.Text.Trim(); // TODO IMPORTANT fix this // int's only settings - keypress handles only ints should be safe. If string empty or null focus and alert // after number init set new value text back because it can be out of bounds // try to refactor this mess if (!ParseStringToInt32(ref textBox_SwitchMinSecondsFixed)) return; - ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed = Int32.Parse(textBox_SwitchMinSecondsFixed.Text); - textBox_SwitchMinSecondsFixed.Text = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed.ToString(); + ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed = Int32.Parse(textBox_SwitchMinSecondsFixed.Text); + textBox_SwitchMinSecondsFixed.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed.ToString(); if (!ParseStringToInt32(ref textBox_SwitchMinSecondsDynamic)) return; - ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic = Int32.Parse(textBox_SwitchMinSecondsDynamic.Text); - textBox_SwitchMinSecondsDynamic.Text = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic.ToString(); + ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic = Int32.Parse(textBox_SwitchMinSecondsDynamic.Text); + textBox_SwitchMinSecondsDynamic.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic.ToString(); if (!ParseStringToInt32(ref textBox_SwitchMinSecondsAMD)) return; - ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD = Int32.Parse(textBox_SwitchMinSecondsAMD.Text); - textBox_SwitchMinSecondsAMD.Text = ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD.ToString(); + ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD = Int32.Parse(textBox_SwitchMinSecondsAMD.Text); + textBox_SwitchMinSecondsAMD.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD.ToString(); if (!ParseStringToInt32(ref textBox_MinerAPIQueryInterval)) return; - ConfigManager.Instance.GeneralConfig.MinerAPIQueryInterval = Int32.Parse(textBox_MinerAPIQueryInterval.Text); - textBox_MinerAPIQueryInterval.Text = ConfigManager.Instance.GeneralConfig.MinerAPIQueryInterval.ToString(); + ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval = Int32.Parse(textBox_MinerAPIQueryInterval.Text); + textBox_MinerAPIQueryInterval.Text = ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval.ToString(); if (!ParseStringToInt32(ref textBox_MinerRestartDelayMS)) return; - ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS = Int32.Parse(textBox_MinerRestartDelayMS.Text); - textBox_MinerRestartDelayMS.Text = ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS.ToString(); + ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS = Int32.Parse(textBox_MinerRestartDelayMS.Text); + textBox_MinerRestartDelayMS.Text = ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS.ToString(); if (!ParseStringToInt32(ref textBox_MinIdleSeconds)) return; - ConfigManager.Instance.GeneralConfig.MinIdleSeconds = Int32.Parse(textBox_MinIdleSeconds.Text); - textBox_MinIdleSeconds.Text = ConfigManager.Instance.GeneralConfig.MinIdleSeconds.ToString(); + ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds = Int32.Parse(textBox_MinIdleSeconds.Text); + textBox_MinIdleSeconds.Text = ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds.ToString(); if (!ParseStringToInt64(ref textBox_LogMaxFileSize)) return; - ConfigManager.Instance.GeneralConfig.LogMaxFileSize = Int64.Parse(textBox_LogMaxFileSize.Text); - textBox_LogMaxFileSize.Text = ConfigManager.Instance.GeneralConfig.LogMaxFileSize.ToString(); + ConfigManager_rem.Instance.GeneralConfig.LogMaxFileSize = Int64.Parse(textBox_LogMaxFileSize.Text); + textBox_LogMaxFileSize.Text = ConfigManager_rem.Instance.GeneralConfig.LogMaxFileSize.ToString(); if (!ParseStringToInt32(ref textBox_ethminerDefaultBlockHeight)) return; - ConfigManager.Instance.GeneralConfig.ethminerDefaultBlockHeight = Int32.Parse(textBox_ethminerDefaultBlockHeight.Text); - textBox_ethminerDefaultBlockHeight.Text = ConfigManager.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); + ConfigManager_rem.Instance.GeneralConfig.ethminerDefaultBlockHeight = Int32.Parse(textBox_ethminerDefaultBlockHeight.Text); + textBox_ethminerDefaultBlockHeight.Text = ConfigManager_rem.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); if (!ParseStringToInt32(ref textBox_APIBindPortStart)) return; - ConfigManager.Instance.GeneralConfig.ApiBindPortPoolStart = Int32.Parse(textBox_APIBindPortStart.Text); - textBox_APIBindPortStart.Text = ConfigManager.Instance.GeneralConfig.ApiBindPortPoolStart.ToString(); + ConfigManager_rem.Instance.GeneralConfig.ApiBindPortPoolStart = Int32.Parse(textBox_APIBindPortStart.Text); + textBox_APIBindPortStart.Text = ConfigManager_rem.Instance.GeneralConfig.ApiBindPortPoolStart.ToString(); - ConfigManager.Instance.GeneralConfig.MinimumProfit = Double.Parse(textBox_MinProfit.Text, CultureInfo.InvariantCulture); - textBox_MinProfit.Text = ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma + ConfigManager_rem.Instance.GeneralConfig.MinimumProfit = Double.Parse(textBox_MinProfit.Text, CultureInfo.InvariantCulture); + textBox_MinProfit.Text = ConfigManager_rem.Instance.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma } private void GeneralComboBoxes_Leave(object sender, EventArgs e) { if (!_isInitFinished) return; IsChange = true; - ConfigManager.Instance.GeneralConfig.Language = (LanguageType)comboBox_Language.SelectedIndex; - ConfigManager.Instance.GeneralConfig.ServiceLocation = comboBox_ServiceLocation.SelectedIndex; - ConfigManager.Instance.GeneralConfig.EthminerDagGenerationType = (DagGenerationType)comboBox_DagLoadMode.SelectedIndex; + ConfigManager_rem.Instance.GeneralConfig.Language = (LanguageType)comboBox_Language.SelectedIndex; + ConfigManager_rem.Instance.GeneralConfig.ServiceLocation = comboBox_ServiceLocation.SelectedIndex; + ConfigManager_rem.Instance.GeneralConfig.EthminerDagGenerationType = (DagGenerationType)comboBox_DagLoadMode.SelectedIndex; } private void comboBox_CPU0_ForceCPUExtension_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cmbbox = (ComboBox)sender; - ConfigManager.Instance.GeneralConfig.ForceCPUExtension = (CPUExtensionType)cmbbox.SelectedIndex; + ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension = (CPUExtensionType)cmbbox.SelectedIndex; } #endregion //Tab General @@ -695,9 +695,9 @@ private void buttonDefaults_Click(object sender, EventArgs e) { if (result == System.Windows.Forms.DialogResult.Yes) { IsChange = true; IsChangeSaved = true; - ConfigManager.Instance.GeneralConfig.SetDefaults(); + ConfigManager_rem.Instance.GeneralConfig.SetDefaults(); - International.Initialize(ConfigManager.Instance.GeneralConfig.Language); + International.Initialize(ConfigManager_rem.Instance.GeneralConfig.Language); InitializeGeneralTabFieldValuesReferences(); InitializeGeneralTabTranslations(); } @@ -732,30 +732,30 @@ private void FormSettings_FormClosing(object sender, FormClosingEventArgs e) { } // check restart parameters change - IsRestartNeeded = ConfigManager.Instance.GeneralConfig.DebugConsole != _generalConfigBackup.DebugConsole - || ConfigManager.Instance.GeneralConfig.NVIDIAP0State != _generalConfigBackup.NVIDIAP0State - || ConfigManager.Instance.GeneralConfig.LogToFile != _generalConfigBackup.LogToFile - || ConfigManager.Instance.GeneralConfig.SwitchMinSecondsFixed != _generalConfigBackup.SwitchMinSecondsFixed - || ConfigManager.Instance.GeneralConfig.SwitchMinSecondsAMD != _generalConfigBackup.SwitchMinSecondsAMD - || ConfigManager.Instance.GeneralConfig.SwitchMinSecondsDynamic != _generalConfigBackup.SwitchMinSecondsDynamic - || ConfigManager.Instance.GeneralConfig.MinerAPIQueryInterval != _generalConfigBackup.MinerAPIQueryInterval; + IsRestartNeeded = ConfigManager_rem.Instance.GeneralConfig.DebugConsole != _generalConfigBackup.DebugConsole + || ConfigManager_rem.Instance.GeneralConfig.NVIDIAP0State != _generalConfigBackup.NVIDIAP0State + || ConfigManager_rem.Instance.GeneralConfig.LogToFile != _generalConfigBackup.LogToFile + || ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed != _generalConfigBackup.SwitchMinSecondsFixed + || ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD != _generalConfigBackup.SwitchMinSecondsAMD + || ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic != _generalConfigBackup.SwitchMinSecondsDynamic + || ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval != _generalConfigBackup.MinerAPIQueryInterval; if (IsChangeSaved) { devicesListViewEnableControl1.SaveOptions(); - ConfigManager.Instance.GeneralConfig.Commit(); - ConfigManager.Instance.CommitBenchmarks(); - International.Initialize(ConfigManager.Instance.GeneralConfig.Language); + ConfigManager_rem.Instance.GeneralConfig.Commit(); + ConfigManager_rem.Instance.CommitBenchmarks(); + International.Initialize(ConfigManager_rem.Instance.GeneralConfig.Language); } else if (IsChange) { - ConfigManager.Instance.GeneralConfig = _generalConfigBackup; - ConfigManager.Instance.BenchmarkConfigs = _benchmarkConfigsBackup; - ConfigManager.Instance.SetDeviceBenchmarkReferences(); + ConfigManager_rem.Instance.GeneralConfig = _generalConfigBackup; + ConfigManager_rem.Instance.BenchmarkConfigs = _benchmarkConfigsBackup; + ConfigManager_rem.Instance.SetDeviceBenchmarkReferences(); } } private void currencyConverterCombobox_SelectedIndexChanged(object sender, EventArgs e) { //Helpers.ConsolePrint("CurrencyConverter", "Currency Set to: " + currencyConverterCombobox.SelectedItem); var Selected = currencyConverterCombobox.SelectedItem.ToString(); - ConfigManager.Instance.GeneralConfig.DisplayCurrency = Selected; + ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency = Selected; } #endregion Form Callbacks @@ -777,9 +777,9 @@ private void checkBox_Use3rdPartyMiners_CheckedChanged(object sender, EventArgs // Show TOS Form tos = new Form_ClaymoreTOS(); tos.ShowDialog(this); - this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; + this.checkBox_Use3rdPartyMiners.Checked = ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; } else { - ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; } } diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index a89ce7f..5aa3d0d 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -43,7 +43,7 @@ public static void ConsolePrint(string grp, string text) { Console.WriteLine("[" +DateTime.Now.ToLongTimeString() + "] [" + grp + "] " + text); - if (ConfigManager.Instance.GeneralConfig.LogToFile) + if (ConfigManager_rem.Instance.GeneralConfig.LogToFile) Logger.log.Info("[" + grp + "] " + text); } diff --git a/NiceHashMiner/Interfaces/IPathsProperties.cs b/NiceHashMiner/Interfaces/IPathsProperties.cs index ec2f9d6..3e689f0 100644 --- a/NiceHashMiner/Interfaces/IPathsProperties.cs +++ b/NiceHashMiner/Interfaces/IPathsProperties.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; namespace NiceHashMiner.Interfaces { + // TODO remove public interface IPathsProperties { string FilePath { get; set; } string FilePathOld { get; set; } diff --git a/NiceHashMiner/Logger.cs b/NiceHashMiner/Logger.cs index e18c42e..844a93b 100644 --- a/NiceHashMiner/Logger.cs +++ b/NiceHashMiner/Logger.cs @@ -27,7 +27,7 @@ public static void ConfigureWithFile() Hierarchy h = (Hierarchy)LogManager.GetRepository(); - if (ConfigManager.Instance.GeneralConfig.LogToFile) + if (ConfigManager_rem.Instance.GeneralConfig.LogToFile) h.Root.Level = Level.Info; //else if (ConfigManager.Instance.GeneralConfig.LogLevel == 2) // h.Root.Level = Level.Warn; @@ -46,7 +46,7 @@ public static IAppender CreateFileAppender() appender.AppendToFile = true; appender.RollingStyle = RollingFileAppender.RollingMode.Size; appender.MaxSizeRollBackups = 1; - appender.MaxFileSize = ConfigManager.Instance.GeneralConfig.LogMaxFileSize; + appender.MaxFileSize = ConfigManager_rem.Instance.GeneralConfig.LogMaxFileSize; appender.PreserveLogFileNameExtension = true; appender.Encoding = System.Text.Encoding.Unicode; diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 0a05c56..db09769 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -139,7 +139,7 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { } protected override void BenchmarkThreadRoutine(object CommandLine) { - Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); BenchmarkSignalQuit = false; BenchmarkSignalHanged = false; diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index 30bb77f..602b258 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -56,7 +56,7 @@ public void Stop() { if (Miner != null && Miner.IsRunning) { Miner.Stop(MinerStopType.SWITCH); // wait before going on - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + System.Threading.Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); } CurrentRate = 0; } @@ -73,7 +73,7 @@ public void Start(string miningLocation, string btcAdress, string worker) { return; } // Wait before new start - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + System.Threading.Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); string name = Globals.NiceHashData[AlgorithmType].name; int port = Globals.NiceHashData[AlgorithmType].port; diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 8f9f20b..aa214d1 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -89,7 +89,7 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy if (deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; - } else if(deviceType == DeviceType.AMD && ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state + } else if(deviceType == DeviceType.AMD && ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state return MinerPaths.ClaymoreZcashMiner; } else { // supports all DeviceTypes diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index e636bea..3cd1a84 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -425,7 +425,7 @@ virtual protected void BenchmarkThreadRoutineStartSettup() { } virtual protected void BenchmarkThreadRoutine(object CommandLine) { - Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); BenchmarkSignalQuit = false; BenchmarkSignalHanged = false; @@ -498,7 +498,7 @@ virtual protected NiceHashProcess _Start() P.StartInfo.Arguments = LastCommandLine; if (Path != MinerPaths.eqm) { - P.StartInfo.CreateNoWindow = ConfigManager.Instance.GeneralConfig.HideMiningWindows; + P.StartInfo.CreateNoWindow = ConfigManager_rem.Instance.GeneralConfig.HideMiningWindows; } else { P.StartInfo.CreateNoWindow = false; } @@ -550,8 +550,8 @@ protected void StartCoolDownTimerChecker() { virtual protected void Miner_Exited() { // TODO make miner restart in 5 seconds //Stop(MinerStopType.END, true); - var RestartInMS = ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS > 5000 ? - ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS : 5000; + var RestartInMS = ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS > 5000 ? + ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS : 5000; Helpers.ConsolePrint(MinerTAG(), ProcessTag() + String.Format(" Miner_Exited Will restart in {0} ms", RestartInMS)); _currentMinerReadStatus = MinerAPIReadStatus.RESTART; NeedsRestart = true; @@ -577,7 +577,7 @@ private void Restart() { if (!isEnded) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Restarting miner.."); Stop(MinerStopType.END); // stop miner first - System.Threading.Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + System.Threading.Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); ProcessHandle = _Start(); // start with old command line } } diff --git a/NiceHashMiner/Miners/MinersApiPortsManager.cs b/NiceHashMiner/Miners/MinersApiPortsManager.cs index f1412f5..a1643f6 100644 --- a/NiceHashMiner/Miners/MinersApiPortsManager.cs +++ b/NiceHashMiner/Miners/MinersApiPortsManager.cs @@ -43,7 +43,7 @@ private bool IsPortAvaliable(int port) { } public int GetAvaliablePort() { - int port = ConfigManager.Instance.GeneralConfig.ApiBindPortPoolStart; + int port = ConfigManager_rem.Instance.GeneralConfig.ApiBindPortPoolStart; int newPortEnd = port + 3000; for (; port < newPortEnd; ++port) { if (IsPortAvaliable(port) && _usedPorts.Add(port)) { diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 06fe495..c0e16a4 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -55,7 +55,7 @@ public static Miner CreateMiner(DeviceType deviceType, string minerPath) { } else if (minerPath == MinerPaths.nheqminer) { return new nheqminer(); } else if ( - ConfigManager.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES + ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES && minerPath == MinerPaths.ClaymoreZcashMiner && DeviceType.AMD == deviceType) { return new ClaymoreZcashMiner(); } else if (minerPath.Contains("ethminer") && DeviceType.CPU != deviceType) { diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 2cabc40..9d34630 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -103,12 +103,12 @@ public MiningSession(List devices, _miningStatusCheckTimer.Start(); } - IsMiningRegardlesOfProfit = ConfigManager.Instance.GeneralConfig.MinimumProfit == 0; + IsMiningRegardlesOfProfit = ConfigManager_rem.Instance.GeneralConfig.MinimumProfit == 0; } #region Timers stuff private void InternetCheckTimer_Tick(object sender, EventArgs e) { - if (ConfigManager.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { + if (ConfigManager_rem.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { IsConnectedToInternet = Helpers.IsConnectedToInternet(); } } @@ -225,13 +225,13 @@ private bool CheckIfProfitable(double CurrentProfit, bool log = true) { var currentProfitUSD = (CurrentProfit * Globals.BitcoinRate); IsProfitable = IsMiningRegardlesOfProfit - || !IsMiningRegardlesOfProfit && currentProfitUSD >= ConfigManager.Instance.GeneralConfig.MinimumProfit; + || !IsMiningRegardlesOfProfit && currentProfitUSD >= ConfigManager_rem.Instance.GeneralConfig.MinimumProfit; if (log) { Helpers.ConsolePrint(TAG, "Current Global profit: " + currentProfitUSD.ToString("F8") + " USD/Day"); if (!IsProfitable) { - Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); + Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager_rem.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); } else { - string profitabilityInfo = IsMiningRegardlesOfProfit ? "mine always regardless of profit" : ConfigManager.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"; + string profitabilityInfo = IsMiningRegardlesOfProfit ? "mine always regardless of profit" : ConfigManager_rem.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"; Helpers.ConsolePrint(TAG, "Current Global profit: IS PROFITABLE MinProfit " + profitabilityInfo); } } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index b4ed079..8015e39 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -400,7 +400,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith List sgminerOptionsNew = new List(); string temperatureControl = ""; // temp control and parse - if (ConfigManager.Instance.GeneralConfig.DisableAMDTempControl) { + if (ConfigManager_rem.Instance.GeneralConfig.DisableAMDTempControl) { LogParser("DisableAMDTempControl is TRUE, temp control parameters will be ignored"); } else { LogParser("Sgminer parsing temperature control parameters"); diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index 8c9f871..c27d81d 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -30,7 +30,7 @@ public MinerEtherum(string minerDeviceName, string blockString) Path = Ethereum.EtherMinerPath; _isEthMinerExit = true; CurrentBlockString = blockString; - DagGenerationType = ConfigManager.Instance.GeneralConfig.EthminerDagGenerationType; + DagGenerationType = ConfigManager_rem.Instance.GeneralConfig.EthminerDagGenerationType; } protected override int GET_MAX_CooldownTimeInMilliseconds() { @@ -81,7 +81,7 @@ public void Start(string url, string btcAdress, string worker, List 0) - username += "." + ConfigManager.Instance.GeneralConfig.WorkerName.Trim(); + if (ConfigManager_rem.Instance.GeneralConfig.WorkerName.Length > 0) + username += "." + ConfigManager_rem.Instance.GeneralConfig.WorkerName.Trim(); // cd to the cgminer for the process bins CommandLine = " /C \"cd /d " + MinerPath.Replace("sgminer.exe", "") + " && sgminer.exe " + @@ -206,7 +206,7 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { } protected override void BenchmarkThreadRoutine(object CommandLine) { - Thread.Sleep(ConfigManager.Instance.GeneralConfig.MinerRestartDelayMS); + Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); BenchmarkSignalQuit = false; BenchmarkSignalHanged = false; diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index dc9053a..5bb4aa4 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -78,13 +78,20 @@ - - - - - - + + + + + + + + + + + + + diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index 33ef428..13e4c29 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -32,13 +32,13 @@ static void Main(string[] argv) }; // #1 first initialize config - ConfigManager.Instance.GeneralConfig.InitializeConfig(); + ConfigManager_rem.Instance.GeneralConfig.InitializeConfig(); - if (ConfigManager.Instance.GeneralConfig.LogToFile) { + if (ConfigManager_rem.Instance.GeneralConfig.LogToFile) { Logger.ConfigureWithFile(); } - if (ConfigManager.Instance.GeneralConfig.DebugConsole) { + if (ConfigManager_rem.Instance.GeneralConfig.DebugConsole) { Helpers.AllocConsole(); } @@ -47,7 +47,7 @@ static void Main(string[] argv) Helpers.ConsolePrint("NICEHASH", "Starting up NiceHashMiner v" + Application.ProductVersion); - if (!ConfigManager.Instance.GeneralConfig.IsFileExist() && !commandLineArgs.IsLang) + if (!ConfigManager_rem.Instance.GeneralConfig.IsFileExist() && !commandLineArgs.IsLang) { Helpers.ConsolePrint("NICEHASH", "No config file found. Running NiceHash Miner for the first time. Choosing a default language."); //Application.Run(new Form_ChooseLanguage()); @@ -55,12 +55,12 @@ static void Main(string[] argv) } // Init languages - International.Initialize(ConfigManager.Instance.GeneralConfig.Language); + International.Initialize(ConfigManager_rem.Instance.GeneralConfig.Language); if (commandLineArgs.IsLang) { Helpers.ConsolePrint("NICEHASH", "Language is overwritten by command line parameter (-lang)."); International.Initialize(commandLineArgs.LangValue); - ConfigManager.Instance.GeneralConfig.Language = commandLineArgs.LangValue; + ConfigManager_rem.Instance.GeneralConfig.Language = commandLineArgs.LangValue; } Application.Run(new Form_Main()); From e67826aa09435dd57e8758c2d0c8dae0aae9f529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 25 Nov 2016 17:02:09 +0100 Subject: [PATCH 128/366] WIP --- .../BaseConfigFile.cs | 2 +- .../{File => ConfigJsonFile}/ConfigFile.cs | 17 +++-- .../DeviceBenchmarkConfigFile.cs | 13 ++-- .../GeneralConfigFile.cs | 4 +- NiceHashMiner/Configs/ConfigManager.cs | 66 ++++++++++++++++++- NiceHashMiner/Configs/Data/AlgorithmConfig.cs | 18 +++++ .../Configs/Data/BenchmarkTimeLimitsConfig.cs | 2 +- .../Configs/Data/DeviceBenchmarkConfig.cs | 2 +- .../Configs/Data/DeviceDetectionConfig.cs | 2 +- ...{GeneralConfigData.cs => GeneralConfig.cs} | 2 +- .../Configs/DeviceBenchmarkConfig_rem.cs | 1 + NiceHashMiner/Configs/GeneralConfigHandler.cs | 2 + NiceHashMiner/NiceHashMiner.csproj | 11 ++-- 13 files changed, 115 insertions(+), 27 deletions(-) rename NiceHashMiner/Configs/{File => ConfigJsonFile}/BaseConfigFile.cs (98%) rename NiceHashMiner/Configs/{File => ConfigJsonFile}/ConfigFile.cs (83%) rename NiceHashMiner/Configs/{File => ConfigJsonFile}/DeviceBenchmarkConfigFile.cs (62%) rename NiceHashMiner/Configs/{File => ConfigJsonFile}/GeneralConfigFile.cs (69%) create mode 100644 NiceHashMiner/Configs/Data/AlgorithmConfig.cs rename NiceHashMiner/Configs/Data/{GeneralConfigData.cs => GeneralConfig.cs} (99%) diff --git a/NiceHashMiner/Configs/File/BaseConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/BaseConfigFile.cs similarity index 98% rename from NiceHashMiner/Configs/File/BaseConfigFile.cs rename to NiceHashMiner/Configs/ConfigJsonFile/BaseConfigFile.cs index 682dae6..8c5938a 100644 --- a/NiceHashMiner/Configs/File/BaseConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/BaseConfigFile.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; using NiceHashMiner.Interfaces; -namespace NiceHashMiner.Configs { +namespace NiceHashMiner.Configs.ConfigJsonFile { [Serializable] public abstract class BaseConfigFile : IPathsProperties where T : class, IPathsProperties { #region Members diff --git a/NiceHashMiner/Configs/File/ConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs similarity index 83% rename from NiceHashMiner/Configs/File/ConfigFile.cs rename to NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs index cf32983..337c41d 100644 --- a/NiceHashMiner/Configs/File/ConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading.Tasks; -namespace NiceHashMiner.Configs { +namespace NiceHashMiner.Configs.ConfigJsonFile { public abstract class ConfigFile where T : class { #region statics/consts // statics/consts @@ -25,7 +25,7 @@ private static void CheckAndCreateConfigsFolder() { protected string _filePath = ""; protected string _filePathOld = ""; - protected T _file = null; + //protected T _file = null; public ConfigFile(string fileName, string fileNameOld) { if(fileName.Contains(CONF_FOLDER)) { @@ -40,22 +40,25 @@ public ConfigFile(string fileName, string fileNameOld) { } } - protected void ReadFile() { + protected T ReadFile() { CheckAndCreateConfigsFolder(); + T file = null; try { if (new FileInfo(_filePath).Exists) { - _file = JsonConvert.DeserializeObject(File.ReadAllText(_filePath), Globals.JsonSettings); + file = JsonConvert.DeserializeObject(File.ReadAllText(_filePath), Globals.JsonSettings); } else { - Commit(); + Commit(file); } } catch (Exception ex) { Helpers.ConsolePrint(TAG, String.Format("ReadFile {0}: exception {1}", _filePath, ex.ToString())); + file = null; } + return file; } - public void Commit() { + public void Commit(T file) { try { - File.WriteAllText(_filePath, JsonConvert.SerializeObject(_file, Formatting.Indented)); + File.WriteAllText(_filePath, JsonConvert.SerializeObject(file, Formatting.Indented)); } catch (Exception ex) { Helpers.ConsolePrint(TAG, String.Format("Commit {0}: exception {1}", _filePath, ex.ToString())); } diff --git a/NiceHashMiner/Configs/File/DeviceBenchmarkConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs similarity index 62% rename from NiceHashMiner/Configs/File/DeviceBenchmarkConfigFile.cs rename to NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs index 10d9b45..eadf8a5 100644 --- a/NiceHashMiner/Configs/File/DeviceBenchmarkConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs @@ -5,11 +5,11 @@ using System.Text; using System.Threading.Tasks; -namespace NiceHashMiner.Configs.File { +namespace NiceHashMiner.Configs.ConfigJsonFile { public class DeviceBenchmarkConfigFile : ConfigFile { const string BENCHMARK_PREFIX = "benchmark_"; - private static string InitializePaths(string DeviceUUID) { + private static string GetName(string DeviceUUID, string old = "") { // make device name char[] invalid = new char[] { '<', '>', ':', '"', '/', '\\', '|', '?', '*' }; string fileName = BENCHMARK_PREFIX + DeviceUUID.Replace(' ', '_'); @@ -17,12 +17,13 @@ private static string InitializePaths(string DeviceUUID) { fileName = fileName.Replace(c.ToString(), String.Empty); } const string extension = ".json"; - FilePath = fileName + extension; - FilePathOld = fileName + "_OLD" + extension; + return fileName + old + extension; + //FilePath = fileName + extension; + //FilePathOld = fileName + "_OLD" + extension; } - public DeviceBenchmarkConfigFile(string DeviceUUID) { - + public DeviceBenchmarkConfigFile(string DeviceUUID) + : base(GetName(DeviceUUID), GetName(DeviceUUID, "_OLD")) { } } diff --git a/NiceHashMiner/Configs/File/GeneralConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs similarity index 69% rename from NiceHashMiner/Configs/File/GeneralConfigFile.cs rename to NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs index b15a049..74ef5a2 100644 --- a/NiceHashMiner/Configs/File/GeneralConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs @@ -5,8 +5,8 @@ using System.Text; using System.Threading.Tasks; -namespace NiceHashMiner.Configs { - public class GeneralConfigFile : ConfigFile { +namespace NiceHashMiner.Configs.ConfigJsonFile { + public class GeneralConfigFile : ConfigFile { public GeneralConfigFile() : base("General.json", "General_old.json") { } diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index 238ca8f..b75ee90 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -1,10 +1,72 @@ -using System; +using NiceHashMiner.Configs.ConfigJsonFile; +using NiceHashMiner.Configs.Data; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NiceHashMiner.Configs { - class ConfigManager { + public static class ConfigManager { + private static readonly string TAG = "ConfigManager"; + public static GeneralConfig GeneralConfig = new GeneralConfig(); + public static Dictionary BenchmarkConfigs = new Dictionary(); + + public static GeneralConfigFile GeneralConfigFile = new GeneralConfigFile(); + + public static void Initialize() { + // init defaults + ConfigManager.GeneralConfig.SetDefaults(); + ConfigManager.GeneralConfig.hwid = Helpers.GetCpuID(); + // load file + + } + + + public static void CommitBenchmarks() { + foreach (var benchConfig in BenchmarkConfigs) { + benchConfig.Value.Commit(); + } + } + + private static void LoadBenchmarks() { + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // doubly check if not added + if (BenchmarkConfigs.ContainsKey(CDev.UUID)) { + Helpers.ConsolePrint(TAG, "BUG - LoadBenchmarks() already added for {0}", CDev.UUID); + } else { + var benchConfig = DeviceBenchmarkConfigManager.Instance.GetConfig(CDev.DeviceGroupType, CDev.UUID, CDev.Name); + benchConfig.InitializeConfig(); + BenchmarkConfigs.Add(CDev.UUID, benchConfig); + } + } + } + + public static void AfterDeviceQueryInitialization() { + //GeneralConfig.AfterDeviceQueryInitialization(); + LoadBenchmarks(); + + //SetDeviceBenchmarkReferences(); + + // check ethminers and remove from settings if no device supports it in config + foreach (var config in BenchmarkConfigs) { + bool removeDagger = true; + var cDev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(config.Value.DeviceUUID); + if (cDev != null) { + // if only one dev ing roup supports terminate + if (cDev.IsEtherumCapale) { + removeDagger = false; + break; + } + } + if (removeDagger) { + config.Value.AlgorithmSettings.Remove(AlgorithmType.DaggerHashimoto); + } + } + + CommitBenchmarks(); + } } } diff --git a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs new file mode 100644 index 0000000..91ce2de --- /dev/null +++ b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs @@ -0,0 +1,18 @@ +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Configs.Data { + [Serializable] + public class AlgorithmConfig { + public AlgorithmType NiceHashID = AlgorithmType.NONE; + public string MinerName = ""; + public double BenchmarkSpeed = 0; + public string ExtraLaunchParameters= ""; + public bool Skip = true; + public int LessThreads = 0; + } +} diff --git a/NiceHashMiner/Configs/Data/BenchmarkTimeLimitsConfig.cs b/NiceHashMiner/Configs/Data/BenchmarkTimeLimitsConfig.cs index 1141e75..ee823a3 100644 --- a/NiceHashMiner/Configs/Data/BenchmarkTimeLimitsConfig.cs +++ b/NiceHashMiner/Configs/Data/BenchmarkTimeLimitsConfig.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text; -namespace NiceHashMiner.Configs +namespace NiceHashMiner.Configs.Data { /// /// BenchmarkTimeLimitsConfig is used to set the time limits for benchmarking. diff --git a/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs b/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs index d9235af..6091e2b 100644 --- a/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs +++ b/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs @@ -11,6 +11,6 @@ public class DeviceBenchmarkConfig { public string DeviceUUID = ""; public string DeviceName = ""; //public int TimeLimit { get; set; } - public Dictionary AlgorithmSettings = new Dictionary(); + public Dictionary AlgorithmSettings = new Dictionary(); } } diff --git a/NiceHashMiner/Configs/Data/DeviceDetectionConfig.cs b/NiceHashMiner/Configs/Data/DeviceDetectionConfig.cs index c390aa8..d4cfd7e 100644 --- a/NiceHashMiner/Configs/Data/DeviceDetectionConfig.cs +++ b/NiceHashMiner/Configs/Data/DeviceDetectionConfig.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace NiceHashMiner.Configs +namespace NiceHashMiner.Configs.Data { /// /// DeviceDetectionConfig is used to enable/disable detection of certain GPU type devices diff --git a/NiceHashMiner/Configs/Data/GeneralConfigData.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs similarity index 99% rename from NiceHashMiner/Configs/Data/GeneralConfigData.cs rename to NiceHashMiner/Configs/Data/GeneralConfig.cs index 98c10c3..bba91ac 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfigData.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -7,7 +7,7 @@ namespace NiceHashMiner.Configs.Data { [Serializable] - public class GeneralConfigData { + public class GeneralConfig { public Version ConfigFileVersion; public LanguageType Language = LanguageType.En; diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs index f305121..06a34be 100644 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs +++ b/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs @@ -6,6 +6,7 @@ using NiceHashMiner.Devices; using Newtonsoft.Json; using System.IO; +using NiceHashMiner.Configs.ConfigJsonFile; namespace NiceHashMiner.Configs { diff --git a/NiceHashMiner/Configs/GeneralConfigHandler.cs b/NiceHashMiner/Configs/GeneralConfigHandler.cs index 1c471bf..b9bbe0a 100644 --- a/NiceHashMiner/Configs/GeneralConfigHandler.cs +++ b/NiceHashMiner/Configs/GeneralConfigHandler.cs @@ -5,6 +5,8 @@ using NiceHashMiner.Enums; using Newtonsoft.Json; using System.IO; +using NiceHashMiner.Configs.ConfigJsonFile; +using NiceHashMiner.Configs.Data; namespace NiceHashMiner.Configs { [Serializable] diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 5bb4aa4..abed2ae 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -79,18 +79,19 @@ + - + - + - + - - + + From 58222db72599a1ad8cdcc690a6ed33c2d2d5bbfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 25 Nov 2016 17:06:03 +0100 Subject: [PATCH 129/366] version bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 5175df9..9792819 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.6")] -[assembly: AssemblyFileVersion("1.7.3.6")] +[assembly: AssemblyVersion("1.7.3.7")] +[assembly: AssemblyFileVersion("1.7.3.7")] From 1ef193efcb05eb68b8ba69397b916e09fe00539b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 27 Nov 2016 14:55:52 +0100 Subject: [PATCH 130/366] big config redo --- NiceHashMiner/Algorithm.cs | 32 +- .../Configs/ConfigJsonFile/BaseConfigFile.cs | 91 ------ .../Configs/ConfigJsonFile/ConfigFile.cs | 19 +- .../DeviceBenchmarkConfigFile.cs | 2 - NiceHashMiner/Configs/ConfigManager.cs | 164 ++++++++-- NiceHashMiner/Configs/ConfigManager_rem.cs | 79 ----- NiceHashMiner/Configs/Data/AlgorithmConfig.cs | 4 +- NiceHashMiner/Configs/Data/GeneralConfig.cs | 9 + .../Configs/DeviceBenchmarkConfigManager.cs | 86 ------ .../Configs/DeviceBenchmarkConfig_rem.cs | 96 ------ NiceHashMiner/Configs/GeneralConfigHandler.cs | 289 ------------------ NiceHashMiner/CurrencyConverter.cs | 10 +- NiceHashMiner/Devices/CPUUtils.cs | 6 +- NiceHashMiner/Devices/ComputeDevice.cs | 133 ++++---- NiceHashMiner/Devices/ComputeDeviceManager.cs | 12 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 67 +++- NiceHashMiner/Enums/AlgorithmType.cs | 2 +- NiceHashMiner/Ethereum.cs | 4 +- .../Components/AlgorithmSettingsControl.cs | 2 +- .../Forms/Components/AlgorithmsListView.cs | 7 +- .../DevicesListViewEnableControl.cs | 2 +- .../Forms/DriverVersionConfirmationDialog.cs | 2 +- NiceHashMiner/Forms/Form_Benchmark.cs | 16 +- ...ner.cs => Form_ChooseLanguage.Designer.cs} | 2 +- ...seLanguage_r.cs => Form_ChooseLanguage.cs} | 6 +- ...nguage_r.resx => Form_ChooseLanguage.resx} | 0 NiceHashMiner/Forms/Form_ClaymoreTOS.cs | 4 +- NiceHashMiner/Forms/Form_Main.cs | 177 +++++------ NiceHashMiner/Forms/Form_Settings.cs | 254 ++++++++------- NiceHashMiner/Helpers.cs | 2 +- NiceHashMiner/Interfaces/IPathsProperties.cs | 13 - NiceHashMiner/Logger.cs | 4 +- .../Miners/Equihash/ClaymoreZcashMiner.cs | 2 +- NiceHashMiner/Miners/Grouping/GroupMiner.cs | 8 +- .../Miners/Grouping/GroupSetupUtils.cs | 4 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 2 +- .../Miners/Grouping/MiningAlgorithm.cs | 4 +- NiceHashMiner/Miners/Grouping/MiningDevice.cs | 7 +- NiceHashMiner/Miners/Miner.cs | 14 +- NiceHashMiner/Miners/MinersApiPortsManager.cs | 2 +- NiceHashMiner/Miners/MinersManager.cs | 8 +- NiceHashMiner/Miners/MiningSession.cs | 15 +- .../Parsing/ExtraLaunchParametersParser.cs | 6 +- NiceHashMiner/Miners/ccminer.cs | 2 +- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 6 +- NiceHashMiner/Miners/sgminer.cs | 14 +- NiceHashMiner/NiceHashMiner.csproj | 16 +- NiceHashMiner/Program.cs | 15 +- 48 files changed, 595 insertions(+), 1126 deletions(-) delete mode 100644 NiceHashMiner/Configs/ConfigJsonFile/BaseConfigFile.cs delete mode 100644 NiceHashMiner/Configs/ConfigManager_rem.cs delete mode 100644 NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs delete mode 100644 NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs delete mode 100644 NiceHashMiner/Configs/GeneralConfigHandler.cs rename NiceHashMiner/Forms/{Form_ChooseLanguage_r.Designer.cs => Form_ChooseLanguage.Designer.cs} (98%) rename NiceHashMiner/Forms/{Form_ChooseLanguage_r.cs => Form_ChooseLanguage.cs} (85%) rename NiceHashMiner/Forms/{Form_ChooseLanguage_r.resx => Form_ChooseLanguage.resx} (100%) delete mode 100644 NiceHashMiner/Interfaces/IPathsProperties.cs diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index 7b4befb..d6c8928 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -5,12 +5,8 @@ using System.Text; namespace NiceHashMiner { - [Serializable] public class Algorithm { readonly public AlgorithmType NiceHashID; - // ignore the dictionary atribute shows the name - [JsonIgnore] - readonly public string NiceHashName; // Miner name is used for miner ALGO flag parameter readonly public string MinerName; public double BenchmarkSpeed { get; set; } @@ -20,6 +16,22 @@ public class Algorithm { // CPU miners only setting public int LessThreads { get; set; } + + public Algorithm(AlgorithmType niceHashID, string minerName) { + NiceHashID = niceHashID; + MinerName = minerName; + + BenchmarkSpeed = 0.0d; + ExtraLaunchParameters = ""; + LessThreads = 0; + Skip = false; + BenchmarkStatus = ""; + } + + public string GetName() { + return AlgorithmNiceHashNames.GetName(this.NiceHashID); + } + // benchmark info [JsonIgnore] public string BenchmarkStatus { get; set; } @@ -46,18 +58,6 @@ public string CurPayingRate { } } - public Algorithm(AlgorithmType niceHashID, string minerName) { - NiceHashID = niceHashID; - NiceHashName = AlgorithmNiceHashNames.GetName(niceHashID); - MinerName = minerName; - - BenchmarkSpeed = 0.0d; - ExtraLaunchParameters = ""; - LessThreads = 0; - Skip = false; - BenchmarkStatus = ""; - } - public void SetBenchmarkPending() { IsBenchmarkPending = true; BenchmarkStatus = International.GetText("Algorithm_Waiting_Benchmark"); diff --git a/NiceHashMiner/Configs/ConfigJsonFile/BaseConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/BaseConfigFile.cs deleted file mode 100644 index 8c5938a..0000000 --- a/NiceHashMiner/Configs/ConfigJsonFile/BaseConfigFile.cs +++ /dev/null @@ -1,91 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NiceHashMiner.Interfaces; - -namespace NiceHashMiner.Configs.ConfigJsonFile { - [Serializable] - public abstract class BaseConfigFile : IPathsProperties where T : class, IPathsProperties { - #region Members - [field: NonSerialized] - readonly public static string CONF_FOLDER = @"configs\"; - - private string _filePath = ""; - private string _filePathOld = ""; - - [JsonIgnore] - public string FilePath { - get { return _filePath.Contains(CONF_FOLDER) ? _filePath : CONF_FOLDER + _filePath; } - set { _filePath = value; } - } - [JsonIgnore] - public string FilePathOld { - get { return _filePathOld.Contains(CONF_FOLDER) ? _filePathOld : CONF_FOLDER + _filePathOld; } - set { _filePathOld = value; } - } - - [JsonIgnore] - protected bool FileLoaded { get { return _file != null; } } - - [field: NonSerialized] - protected T _file; - - #endregion //Members - - public void InitializeConfig() { - InitializePaths(); - ReadFile(); - if (FileLoaded) { - _file.FilePath = this.FilePath; - _file.FilePathOld = this.FilePathOld; - InitializeObject(); - } - } - - /// - /// InitializePaths should be overrided in the subclass to specify filepath(old) paths. - /// - abstract protected void InitializePaths(); - /// - /// InitializeObject must be overrided in the subclass to reinitialize values and references from the configuration files. - /// Use the _self member and reinitialize all non null references (use DeepCopy or plain reference it is up to the implementor). - /// IMPORTANT!!! Take extra care with arrays, lists and dictionaries, initialize them manually and not by DeepCopy or reference, the - /// reason for this is to be future proof if new keys/values are added so reinitialize them one by one if they exist. - /// - abstract protected void InitializeObject(); - - private static void CheckAndCreateConfigsFolder () { - try { - if (Directory.Exists(CONF_FOLDER) == false) { - Directory.CreateDirectory(CONF_FOLDER); - } - } catch { } - } - - protected void ReadFile() { - CheckAndCreateConfigsFolder(); - try { - if (new FileInfo(FilePath).Exists) { - _file = JsonConvert.DeserializeObject(File.ReadAllText(FilePath), Globals.JsonSettings); - } else { - Commit(); - } - } catch(Exception ex) { - Helpers.ConsolePrint("BaseConfigFile", String.Format("ReadFile {0}: exception {1}", FilePath, ex.ToString())); - } - } - - public void Commit() { - try { - File.WriteAllText(FilePath, JsonConvert.SerializeObject(this, Formatting.Indented)); - } - catch (Exception ex) { - Helpers.ConsolePrint("BaseConfigFile", String.Format("Commit {0}: exception {1}", FilePath, ex.ToString())); - } - } - } -} diff --git a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs index 337c41d..90b72f0 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs @@ -8,7 +8,6 @@ namespace NiceHashMiner.Configs.ConfigJsonFile { public abstract class ConfigFile where T : class { - #region statics/consts // statics/consts const string TAG = "ConfigFile"; const string CONF_FOLDER = @"configs\"; @@ -20,13 +19,11 @@ private static void CheckAndCreateConfigsFolder() { } } catch { } } - #endregion statics/consts + // member stuff protected string _filePath = ""; protected string _filePathOld = ""; - //protected T _file = null; - public ConfigFile(string fileName, string fileNameOld) { if(fileName.Contains(CONF_FOLDER)) { this._filePath = fileName; @@ -40,14 +37,16 @@ public ConfigFile(string fileName, string fileNameOld) { } } - protected T ReadFile() { + public bool IsFileExists() { + return File.Exists(_filePath); + } + + public T ReadFile() { CheckAndCreateConfigsFolder(); T file = null; try { - if (new FileInfo(_filePath).Exists) { + if (File.Exists(_filePath)) { file = JsonConvert.DeserializeObject(File.ReadAllText(_filePath), Globals.JsonSettings); - } else { - Commit(file); } } catch (Exception ex) { Helpers.ConsolePrint(TAG, String.Format("ReadFile {0}: exception {1}", _filePath, ex.ToString())); @@ -57,6 +56,10 @@ protected T ReadFile() { } public void Commit(T file) { + if (file == null) { + Helpers.ConsolePrint(TAG, String.Format("Commit for FILE {0} IGNORED. Passed null object", _filePath)); + return; + } try { File.WriteAllText(_filePath, JsonConvert.SerializeObject(file, Formatting.Indented)); } catch (Exception ex) { diff --git a/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs index eadf8a5..bb29f8f 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs @@ -18,8 +18,6 @@ private static string GetName(string DeviceUUID, string old = "") { } const string extension = ".json"; return fileName + old + extension; - //FilePath = fileName + extension; - //FilePathOld = fileName + "_OLD" + extension; } public DeviceBenchmarkConfigFile(string DeviceUUID) diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index b75ee90..8811f66 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -12,61 +12,159 @@ namespace NiceHashMiner.Configs { public static class ConfigManager { private static readonly string TAG = "ConfigManager"; public static GeneralConfig GeneralConfig = new GeneralConfig(); - public static Dictionary BenchmarkConfigs = new Dictionary(); - public static GeneralConfigFile GeneralConfigFile = new GeneralConfigFile(); + // helper variables + private static bool IsGeneralConfigFileInit = false; + private static bool hwidLoadFromFile = false; + private static bool hwidOK = false; + private static bool IsNewVersion = false; - public static void Initialize() { + // for loading and saving + private static GeneralConfigFile GeneralConfigFile = new GeneralConfigFile(); + private static Dictionary BenchmarkConfigFiles = new Dictionary(); + + // backups + private static GeneralConfig GeneralConfigBackup = new GeneralConfig(); + private static Dictionary BenchmarkConfigsBackup = new Dictionary(); + + public static void InitializeConfig() { // init defaults ConfigManager.GeneralConfig.SetDefaults(); ConfigManager.GeneralConfig.hwid = Helpers.GetCpuID(); - // load file - + // if exists load file + GeneralConfig fromFile = null; + if(GeneralConfigFile.IsFileExists()) { + fromFile = GeneralConfigFile.ReadFile(); + } + // just in case + if (fromFile != null) { + // set config loaded from file + IsGeneralConfigFileInit = true; + ConfigManager.GeneralConfig = fromFile; + if (ConfigManager.GeneralConfig.ConfigFileVersion == null + || ConfigManager.GeneralConfig.ConfigFileVersion.CompareTo(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) != 0) { + Helpers.ConsolePrint(TAG, "Config file is from an older version of NiceHashMiner.."); + IsNewVersion = true; + GeneralConfigFile.CreateBackup(); + } else { + Helpers.ConsolePrint(TAG, "Loaded Config file no version detected falling back to defaults."); + ConfigManager.GeneralConfig.SetDefaults(); + } + ConfigManager.GeneralConfig.FixSettingBounds(); + // check vars + hwidLoadFromFile = true; + hwidOK = Helpers.GetCpuID() == ConfigManager.GeneralConfig.hwid; + } else { + GeneralConfigFileCommit(); + } } + public static bool GeneralConfigIsFileExist() { + return IsGeneralConfigFileInit; + } - public static void CommitBenchmarks() { - foreach (var benchConfig in BenchmarkConfigs) { - benchConfig.Value.Commit(); + public static bool GeneralConfigHwidLoadFromFile() { + return hwidLoadFromFile; + } + + public static bool GeneralConfigHwidOK() { + return hwidOK; + } + + public static void CreateBackup() { + GeneralConfigBackup = MemoryHelper.DeepClone(ConfigManager.GeneralConfig); + BenchmarkConfigsBackup = new Dictionary(); + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + BenchmarkConfigsBackup[CDev.UUID] = CDev.GetAlgorithmDeviceConfig(); + } + } + + public static void RestoreBackup() { + GeneralConfig = GeneralConfigBackup; + BenchmarkConfigsBackup = new Dictionary(); + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + if (BenchmarkConfigsBackup.ContainsKey(CDev.UUID)) { + CDev.SetAlgorithmDeviceConfig(BenchmarkConfigsBackup[CDev.UUID]); + } } } - private static void LoadBenchmarks() { + public static bool IsRestartNeeded() { + return ConfigManager.GeneralConfig.DebugConsole != GeneralConfigBackup.DebugConsole + || ConfigManager.GeneralConfig.NVIDIAP0State != GeneralConfigBackup.NVIDIAP0State + || ConfigManager.GeneralConfig.LogToFile != GeneralConfigBackup.LogToFile + || ConfigManager.GeneralConfig.SwitchMinSecondsFixed != GeneralConfigBackup.SwitchMinSecondsFixed + || ConfigManager.GeneralConfig.SwitchMinSecondsAMD != GeneralConfigBackup.SwitchMinSecondsAMD + || ConfigManager.GeneralConfig.SwitchMinSecondsDynamic != GeneralConfigBackup.SwitchMinSecondsDynamic + || ConfigManager.GeneralConfig.MinerAPIQueryInterval != GeneralConfigBackup.MinerAPIQueryInterval; + } + + public static void GeneralConfigFileCommit() { + GeneralConfig.LastDevicesSettup.Clear(); foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // doubly check if not added - if (BenchmarkConfigs.ContainsKey(CDev.UUID)) { - Helpers.ConsolePrint(TAG, "BUG - LoadBenchmarks() already added for {0}", CDev.UUID); + GeneralConfig.LastDevicesSettup.Add(CDev.GetComputeDeviceConfig()); + } + GeneralConfigFile.Commit(GeneralConfig); + } + + public static void CommitBenchmarks() { + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + string devUUID = CDev.UUID; + if (BenchmarkConfigFiles.ContainsKey(devUUID)) { + BenchmarkConfigFiles[devUUID].Commit(CDev.GetAlgorithmDeviceConfig()); } else { - var benchConfig = DeviceBenchmarkConfigManager.Instance.GetConfig(CDev.DeviceGroupType, CDev.UUID, CDev.Name); - benchConfig.InitializeConfig(); - BenchmarkConfigs.Add(CDev.UUID, benchConfig); + BenchmarkConfigFiles[devUUID] = new DeviceBenchmarkConfigFile(devUUID); + BenchmarkConfigFiles[devUUID].Commit(CDev.GetAlgorithmDeviceConfig()); } } } public static void AfterDeviceQueryInitialization() { - //GeneralConfig.AfterDeviceQueryInitialization(); - LoadBenchmarks(); - - //SetDeviceBenchmarkReferences(); - - // check ethminers and remove from settings if no device supports it in config - foreach (var config in BenchmarkConfigs) { - bool removeDagger = true; - var cDev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(config.Value.DeviceUUID); - if (cDev != null) { - // if only one dev ing roup supports terminate - if (cDev.IsEtherumCapale) { - removeDagger = false; - break; + // extra check (probably will never happen but just in case) + { + List invalidDevices = new List(); + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + if (CDev.AlgorithmSettings == null) { + Helpers.ConsolePrint(TAG, "CRITICAL ISSUE!!! Device has AlgorithmSettings == null. Will remove"); + invalidDevices.Add(CDev); } } - if (removeDagger) { - config.Value.AlgorithmSettings.Remove(AlgorithmType.DaggerHashimoto); + // remove invalids + foreach (var invalid in invalidDevices) { + ComputeDeviceManager.Avaliable.AllAvaliableDevices.Remove(invalid); + } + } + // set enabled/disabled devs + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + foreach (var devConf in GeneralConfig.LastDevicesSettup) { + CDev.SetFromComputeDeviceConfig(devConf); + } + } + // create/init device benchmark configs files and configs + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + string keyUUID = CDev.UUID; + BenchmarkConfigFiles[keyUUID] = new DeviceBenchmarkConfigFile(keyUUID); + // init + { + DeviceBenchmarkConfig currentConfig = null; + if (BenchmarkConfigFiles[keyUUID].IsFileExists()) { + currentConfig = BenchmarkConfigFiles[keyUUID].ReadFile(); + } + // config exists and file load success set from file + if (currentConfig != null) { + CDev.SetAlgorithmDeviceConfig(currentConfig); + // if new version create backup + if (IsNewVersion) { + BenchmarkConfigFiles[keyUUID].CreateBackup(); + } + } else { + // no config file or not loaded, create new + BenchmarkConfigFiles[keyUUID].Commit(CDev.GetAlgorithmDeviceConfig()); + } } } - - CommitBenchmarks(); } + + } } diff --git a/NiceHashMiner/Configs/ConfigManager_rem.cs b/NiceHashMiner/Configs/ConfigManager_rem.cs deleted file mode 100644 index d34af30..0000000 --- a/NiceHashMiner/Configs/ConfigManager_rem.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; - -namespace NiceHashMiner.Configs { - public partial class ConfigManager_rem : BaseLazySingleton { - public GeneralConfigHandler GeneralConfig { get; set; } - public Dictionary BenchmarkConfigs { get; set; } - - private readonly string TAG; - - // constructor has references don't delete it - protected ConfigManager_rem() { - TAG = this.GetType().Name; - GeneralConfig = new GeneralConfigHandler(true); - BenchmarkConfigs = new Dictionary(); - } - - public void CommitBenchmarks() { - foreach (var benchConfig in BenchmarkConfigs) { - benchConfig.Value.Commit(); - } - } - - private void LoadBenchmarks() { - foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // doubly check if not added - if (BenchmarkConfigs.ContainsKey(CDev.UUID)) { - Helpers.ConsolePrint(TAG, "BUG - LoadBenchmarks() already added for {0}", CDev.UUID); - } else { - var benchConfig = DeviceBenchmarkConfigManager.Instance.GetConfig(CDev.DeviceGroupType, CDev.UUID, CDev.Name); - benchConfig.InitializeConfig(); - BenchmarkConfigs.Add(CDev.UUID, benchConfig); - } - } - } - - public void AfterDeviceQueryInitialization() { - GeneralConfig.AfterDeviceQueryInitialization(); - LoadBenchmarks(); - - SetDeviceBenchmarkReferences(); - - // check ethminers and remove from settings if no device supports it in config - foreach (var config in BenchmarkConfigs) { - bool removeDagger = true; - var cDev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(config.Value.DeviceUUID); - if (cDev != null) { - // if only one dev ing roup supports terminate - if (cDev.IsEtherumCapale) { - removeDagger = false; - break; - } - } - if (removeDagger) { - config.Value.AlgorithmSettings.Remove(AlgorithmType.DaggerHashimoto); - } - } - - CommitBenchmarks(); - } - - public void SetDeviceBenchmarkReferences() { - // new stuff - // set references - // C# can handle cyclic refs - DeviceBenchmarkConfigManager.Instance.BenchmarkConfigs = BenchmarkConfigs; - BenchmarkConfigs = DeviceBenchmarkConfigManager.Instance.BenchmarkConfigs; - // set Benchmarks for devices - foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - cdev.SetDeviceBenchmarkConfig(DeviceBenchmarkConfigManager.Instance.GetConfig(cdev.DeviceGroupType, cdev.UUID, cdev.Name)); - } - } - - } -} diff --git a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs index 91ce2de..77dbe9a 100644 --- a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs +++ b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs @@ -9,10 +9,10 @@ namespace NiceHashMiner.Configs.Data { [Serializable] public class AlgorithmConfig { public AlgorithmType NiceHashID = AlgorithmType.NONE; - public string MinerName = ""; + public string MinerName = ""; // TODO probably not needed public double BenchmarkSpeed = 0; public string ExtraLaunchParameters= ""; - public bool Skip = true; + public bool Skip = false; public int LessThreads = 0; } } diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index bba91ac..a3bb706 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -133,6 +133,15 @@ public void FixSettingBounds() { if (this.ApiBindPortPoolStart > (65535 - 2000)) { this.ApiBindPortPoolStart = 5100; } + if (this.BenchmarkTimeLimits == null) { + this.BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); + } + if (this.DeviceDetection == null) { + this.DeviceDetection = new DeviceDetectionConfig(); + } + if (this.LastDevicesSettup == null) { + this.LastDevicesSettup = new List(); + } } } diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs deleted file mode 100644 index 875cf05..0000000 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfigManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; -using System; -using System.Collections.Generic; -using System.Text; - -namespace NiceHashMiner.Configs { - - public class DeviceBenchmarkConfigManager : BaseLazySingleton { - - private Dictionary _benchmarkConfigs; - public Dictionary BenchmarkConfigs { - get { return _benchmarkConfigs; } - set { - if (value != null) { - _benchmarkConfigs = value; - } - } - } - - // constructor has references don't delete it - protected DeviceBenchmarkConfigManager() { - _benchmarkConfigs = new Dictionary(); - } - - private DeviceBenchmarkConfig_rem GetConfig(string deviceUUID) { - DeviceBenchmarkConfig_rem retConfig = null; - if (_benchmarkConfigs.TryGetValue(deviceUUID, out retConfig) == false) { - retConfig = null; - } - return retConfig; - } - - public DeviceBenchmarkConfig_rem GetConfig(DeviceGroupType deviceGroupType, - string deviceUUID, string deviceName) { - DeviceBenchmarkConfig_rem retConfig = GetConfig(deviceUUID); - if (retConfig == null) { - retConfig = new DeviceBenchmarkConfig_rem(deviceGroupType, deviceUUID, deviceName); - _benchmarkConfigs.Add(deviceUUID, retConfig); - } - - return retConfig; - } - - /// - /// IsEnabledBenchmarksInitialized is to check if currently enabled devices have all enabled algorithms benchmarked. - /// - /// Returns tuple of boolean and dictionary of unbenchmarked algorithms per device - public Tuple> > IsEnabledBenchmarksInitialized() { - bool isEnabledBenchmarksInitialized = true; - // first get all enabled devices names - HashSet enabledDevicesNames = new HashSet(); - foreach (var device in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (device.Enabled) { - enabledDevicesNames.Add(device.UUID); - } - } - // get enabled unbenchmarked algorithms - Dictionary> unbenchmarkedAlgorithmsPerDevice = new Dictionary>(); - // init unbenchmarkedAlgorithmsPerDevice - foreach (var deviceName in enabledDevicesNames) { - unbenchmarkedAlgorithmsPerDevice.Add(deviceName, new List()); - } - // check benchmarks - foreach (var deviceName in enabledDevicesNames) { - if (_benchmarkConfigs.ContainsKey(deviceName)) { - foreach (var kvpAlgorithm in _benchmarkConfigs[deviceName].AlgorithmSettings) { - var algorithm = kvpAlgorithm.Value; - if (!algorithm.Skip && algorithm.BenchmarkSpeed <= 0.0d) { - isEnabledBenchmarksInitialized = false; - // add for reference to bench - unbenchmarkedAlgorithmsPerDevice[deviceName].Add(algorithm.NiceHashID); - } - } - } - } - - return - new Tuple>>( - isEnabledBenchmarksInitialized, - unbenchmarkedAlgorithmsPerDevice - ); - } - - } -} diff --git a/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs b/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs deleted file mode 100644 index 06a34be..0000000 --- a/NiceHashMiner/Configs/DeviceBenchmarkConfig_rem.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.Text; -using NiceHashMiner.Enums; -using NiceHashMiner.Devices; -using Newtonsoft.Json; -using System.IO; -using NiceHashMiner.Configs.ConfigJsonFile; - -namespace NiceHashMiner.Configs -{ - [Serializable] - public class DeviceBenchmarkConfig_rem : BaseConfigFile { - - public string DeviceUUID { get; private set; } - public string DeviceName { get; private set; } - //public int TimeLimit { get; set; } - public Dictionary AlgorithmSettings { get; set; } - - // TODO remove in furure releases - - [field: NonSerialized] - readonly public static string BENCHMARK_PREFIX = "benchmark_"; - - [JsonIgnore] - public bool IsAlgorithmSettingsInit { get; set; } - - public DeviceBenchmarkConfig_rem(DeviceGroupType deviceGroupType, - string deviceUUID, - string deviceName, - Dictionary benchmarkSpeeds = null) { - - DeviceUUID = deviceUUID; - DeviceName = deviceName; - if (benchmarkSpeeds != null) { - AlgorithmSettings = benchmarkSpeeds; - } else { - AlgorithmSettings = GroupAlgorithms.CreateDefaultsForGroup(deviceGroupType); - } - - IsAlgorithmSettingsInit = false; - } - - protected override void InitializePaths() { - // make device name - char[] invalid = new char[] { '<', '>', ':', '"', '/', '\\', '|', '?', '*' }; - string fileName = BENCHMARK_PREFIX + DeviceUUID.Replace(' ', '_'); - foreach (var c in invalid) { - fileName = fileName.Replace(c.ToString(), String.Empty); - } - const string extension = ".json"; - FilePath = fileName + extension; - FilePathOld = fileName + "_OLD" + extension; - } - - // TODO make generic initializations - protected override void InitializeObject() { - // if new backup benchmarks - if (ConfigManager_rem.Instance.GeneralConfig.IsNewVersion) { - Helpers.ConsolePrint("DeviceBenchmarkConfig", String.Format("Backing up {0} to {1}..", FilePath, FilePathOld)); - try { - if (File.Exists(FilePathOld)) - File.Delete(FilePathOld); - File.Move(FilePath, FilePathOld); - } catch { } - } - - - // check if data tampered - bool IsDataTampered = !( - /*this.ID == _file.ID - && this.DeviceGroupType == _file.DeviceGroupType - && */this.DeviceName == _file.DeviceName - ); - - //this.TimeLimit = _file.TimeLimit; - if (_file.DeviceUUID != null) { - this.DeviceUUID = _file.DeviceUUID; - } - - if (_file.AlgorithmSettings != null) { - // settings from files are initialized - foreach (var key in _file.AlgorithmSettings.Keys) { - if(this.AlgorithmSettings.ContainsKey(key)) { - this.AlgorithmSettings[key] = _file.AlgorithmSettings[key]; - } else { - // TODO think if we let tamnpered data - } - } - } - // if read fromfile then it is initialized - IsAlgorithmSettingsInit = true; - } - } -} diff --git a/NiceHashMiner/Configs/GeneralConfigHandler.cs b/NiceHashMiner/Configs/GeneralConfigHandler.cs deleted file mode 100644 index b9bbe0a..0000000 --- a/NiceHashMiner/Configs/GeneralConfigHandler.cs +++ /dev/null @@ -1,289 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using NiceHashMiner.Devices; -using NiceHashMiner.Enums; -using Newtonsoft.Json; -using System.IO; -using NiceHashMiner.Configs.ConfigJsonFile; -using NiceHashMiner.Configs.Data; - -namespace NiceHashMiner.Configs { - [Serializable] - public class GeneralConfigHandler : BaseConfigFile { - - #region Members - public Version ConfigFileVersion { get; set; } - public LanguageType Language { get; set; } - - private string _displayCurrency = "USD"; - public string DisplayCurrency { - get { return _displayCurrency; } - set { _displayCurrency = value == null ? "USD" : value; } - } - - public bool DebugConsole { get; set; } - public string BitcoinAddress { get; set; } - public string WorkerName { get; set; } - public int ServiceLocation { get; set; } - public bool AutoStartMining { get; set; } - public bool HideMiningWindows { get; set; } - public bool MinimizeToTray { get; set; } - //public int LessThreads { get; set; } - public CPUExtensionType ForceCPUExtension { get; set; } // 0 - automatic, 1 - SSE2, 2 - AVX, 3 - AVX2 - - private int _switchMinSecondsFixed = 90; - public int SwitchMinSecondsFixed { - get { return _switchMinSecondsFixed; } - set { - _switchMinSecondsFixed = value <= 0 ? 90 : value; - } - } - private int _switchMinSecondsDynamic = 30; - public int SwitchMinSecondsDynamic { - get { return _switchMinSecondsDynamic; } - set { - _switchMinSecondsDynamic = value <= 0 ? 30 : value; - } - } - - private int _switchMinSecondsAMD = 60; - public int SwitchMinSecondsAMD { - get { return _switchMinSecondsAMD; } - set { _switchMinSecondsAMD = value <= 0 ? 60 : value; } - } - - private int _minerAPIQueryInterval = 5; - public int MinerAPIQueryInterval { - get { return _minerAPIQueryInterval; } - set { _minerAPIQueryInterval = value <= 0 ? 5 : value;} - } - - private int _minerRestartDelayMS = 500; - public int MinerRestartDelayMS { - get { return _minerRestartDelayMS; } - set { _minerRestartDelayMS = value <= 0 ? 500 : value; } - } - - public BenchmarkTimeLimitsConfig BenchmarkTimeLimits { get; set; } - - // TODO deprecate this - public DeviceDetectionConfig DeviceDetection { get; set; } - - public bool DisableAMDTempControl { get; set; } - public bool DisableDefaultOptimizations { get; set; } - - public bool AutoScaleBTCValues { get; set; } - public bool StartMiningWhenIdle { get; set; } - - private int _minIdleSeconds = 60; - public int MinIdleSeconds { - get { return _minIdleSeconds; } - set { _minIdleSeconds = value <= 0 ? 60 : value; } - } - public bool LogToFile { get; set; } - - // in bytes - private long _logMaxFileSize = 1048576; - public long LogMaxFileSize { - get { return _logMaxFileSize; } - set { _logMaxFileSize = value <= 0 ? 1048576 : value; } - } - - public bool ShowDriverVersionWarning { get; set; } - public bool DisableWindowsErrorReporting { get; set; } - public bool NVIDIAP0State { get; set; } - - public int ethminerDefaultBlockHeight { get; set; } - public DagGenerationType EthminerDagGenerationType; - - private int _apiBindPortPoolStart = 5100; - public int ApiBindPortPoolStart { - get { return _apiBindPortPoolStart; } - set { - // check port start number, leave about 2000 ports pool size, huge yea! - if (value < (65535 - 2000)) { - _apiBindPortPoolStart = value; - } else { - // set default - _apiBindPortPoolStart = 5100; - } - } - } - public double MinimumProfit { get; set; } - - public bool ContinueMiningIfNoInternetAccess { get; set; } - - public string hwid { get; set; } - - public bool DownloadInit { get; set; } - - public Use3rdPartyMiners Use3rdPartyMiners { get; set; } - public bool DownloadInit3rdParty { get; set; } - - - [JsonIgnore] - public bool hwidOK { get; private set; } - [JsonIgnore] - public bool hwidLoadFromFile { get; private set; } - [JsonIgnore] - public bool IsNewVersion { get; private set; } - - - // After Device initialization - - /// - /// LastDevicesSettup field should not be manually edited - /// The changes can be of two scenarios: - /// #1 Detect if the device is enabled/disabled, - /// #2 Detect hardware changes/upgrades such as CPUs and GPUs. - /// - public List LastDevicesSettup { get; set; } - - #endregion //Members - - public bool IsFileExist() { - return FileLoaded; - } - - public void SetDefaults() { - ConfigFileVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; - Language = LanguageType.En; - BitcoinAddress = ""; - WorkerName = "worker1"; - ServiceLocation = 0; - AutoStartMining = false; - //LessThreads = 0; - DebugConsole = false; - HideMiningWindows = false; - MinimizeToTray = false; - BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); - DeviceDetection = new DeviceDetectionConfig(); - DisableAMDTempControl = false; - DisableDefaultOptimizations = false; - AutoScaleBTCValues = true; - StartMiningWhenIdle = false; - LogToFile = true; - LogMaxFileSize = 1048576; - ShowDriverVersionWarning = true; - DisableWindowsErrorReporting = true; - NVIDIAP0State = false; - MinerRestartDelayMS = 500; - ethminerDefaultBlockHeight = 2000000; - SwitchMinSecondsFixed = 90; - SwitchMinSecondsDynamic = 30; - SwitchMinSecondsAMD = 90; - MinIdleSeconds = 60; - DisplayCurrency = "USD"; - ApiBindPortPoolStart = 4000; - MinimumProfit = 0; - EthminerDagGenerationType = DagGenerationType.SingleKeep; - DownloadInit = false; - ContinueMiningIfNoInternetAccess = false; - Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; - DownloadInit3rdParty = false; - } - - public GeneralConfigHandler(bool initDefaults = false) { - ConfigFileVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; - BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); - DeviceDetection = new DeviceDetectionConfig(); - - hwidOK = false; - hwidLoadFromFile = false; - IsNewVersion = false; - - // only init defaults for created config not read - if (initDefaults) { - SetDefaults(); - hwid = Helpers.GetCpuID(); - } - } - - protected override void InitializePaths() { - FilePath = "General.json"; - FilePathOld = "General_old.json"; - } - protected override void InitializeObject() { - if (_file.ConfigFileVersion == null || - _file.ConfigFileVersion.CompareTo(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) != 0) { - IsNewVersion = true; - Helpers.ConsolePrint("GeneralConfig", "Config file is from an older version of NiceHashMiner.."); - Helpers.ConsolePrint("GeneralConfig", String.Format("Backing up {0} to {1}..", FilePath, FilePathOld)); - try { - if (File.Exists(FilePathOld)) - File.Delete(FilePathOld); - File.Move(FilePath, FilePathOld); - } catch { } - - SetDefaults(); - } - - - // init fields - Language = _file.Language; - DisplayCurrency = _file.DisplayCurrency; - DebugConsole = _file.DebugConsole; - BitcoinAddress = _file.BitcoinAddress; - WorkerName = _file.WorkerName; - ServiceLocation = _file.ServiceLocation; - AutoStartMining = _file.AutoStartMining; - HideMiningWindows = _file.HideMiningWindows; - MinimizeToTray = _file.MinimizeToTray; - //LessThreads = _file.LessThreads; - ForceCPUExtension = _file.ForceCPUExtension; - SwitchMinSecondsFixed = _file.SwitchMinSecondsFixed; - SwitchMinSecondsDynamic = _file.SwitchMinSecondsDynamic; - SwitchMinSecondsAMD = _file.SwitchMinSecondsAMD; - MinerAPIQueryInterval = _file.MinerAPIQueryInterval; - MinerRestartDelayMS = _file.MinerRestartDelayMS; - if (_file.BenchmarkTimeLimits != null) { - this.BenchmarkTimeLimits = _file.BenchmarkTimeLimits; - } - if (_file.DeviceDetection != null) { - this.DeviceDetection = _file.DeviceDetection; - } - AutoScaleBTCValues = _file.AutoScaleBTCValues; - StartMiningWhenIdle = _file.StartMiningWhenIdle; - MinIdleSeconds = _file.MinIdleSeconds; - LogToFile = _file.LogToFile; - LogMaxFileSize = _file.LogMaxFileSize; - ShowDriverVersionWarning = _file.ShowDriverVersionWarning; - DisableWindowsErrorReporting = _file.DisableWindowsErrorReporting; - NVIDIAP0State = _file.NVIDIAP0State; - ethminerDefaultBlockHeight = _file.ethminerDefaultBlockHeight; - EthminerDagGenerationType = _file.EthminerDagGenerationType; - ApiBindPortPoolStart = _file.ApiBindPortPoolStart; - MinimumProfit = _file.MinimumProfit; - - DisableAMDTempControl = _file.DisableAMDTempControl; - DisableDefaultOptimizations = _file.DisableDefaultOptimizations; - - ContinueMiningIfNoInternetAccess = _file.ContinueMiningIfNoInternetAccess; - if (!IsNewVersion) { - DownloadInit = _file.DownloadInit; - } - Use3rdPartyMiners = _file.Use3rdPartyMiners; - DownloadInit3rdParty = _file.DownloadInit3rdParty; - - hwidLoadFromFile = true; - hwidOK = this.hwid == _file.hwid; - } - - public void AfterDeviceQueryInitialization() { - - if (_file != null && _file.LastDevicesSettup != null) { - foreach (var configDevice in _file.LastDevicesSettup) { - foreach (var usedDevice in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (configDevice.UUID == usedDevice.UUID) { - usedDevice.Enabled = configDevice.Enabled; - continue; - } - } - } - } - - LastDevicesSettup = ComputeDeviceManager.Avaliable.AllAvaliableDevices; - } - } -} diff --git a/NiceHashMiner/CurrencyConverter.cs b/NiceHashMiner/CurrencyConverter.cs index 3b2ad44..685f685 100644 --- a/NiceHashMiner/CurrencyConverter.cs +++ b/NiceHashMiner/CurrencyConverter.cs @@ -12,7 +12,7 @@ public static class CurrencyConverter private static CurrencyAPIResponse LastResponse; private static bool ConverterActive { - get { return ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency != "USD"; } + get { return ConfigManager.GeneralConfig.DisplayCurrency != "USD"; } } @@ -35,12 +35,12 @@ public static double ConvertToActiveCurrency(double amount) //Helpers.ConsolePrint("CurrencyConverter", "Current Currency: " + ConfigManager.Instance.GeneralConfig.DisplayCurrency); double usdExchangeRate = 1.0; - if (LastResponse.rates.TryGetValue(ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency, out usdExchangeRate)) + if (LastResponse.rates.TryGetValue(ConfigManager.GeneralConfig.DisplayCurrency, out usdExchangeRate)) return amount * usdExchangeRate; else { - Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency + " falling back to USD rates"); - ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency = "USD"; + Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + ConfigManager.GeneralConfig.DisplayCurrency + " falling back to USD rates"); + ConfigManager.GeneralConfig.DisplayCurrency = "USD"; return amount; } } @@ -57,7 +57,7 @@ private static void UpdateAPI() { Helpers.ConsolePrint("CurrencyConverter", E.Message); Helpers.ConsolePrint("CurrencyConverter", "Unable to update API: reverting to usd"); - ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency = "USD"; + ConfigManager.GeneralConfig.DisplayCurrency = "USD"; } } } diff --git a/NiceHashMiner/Devices/CPUUtils.cs b/NiceHashMiner/Devices/CPUUtils.cs index 3d97358..9bd1cb4 100644 --- a/NiceHashMiner/Devices/CPUUtils.cs +++ b/NiceHashMiner/Devices/CPUUtils.cs @@ -44,14 +44,14 @@ private static bool HasExtensionSupport(CPUExtensionType type) { /// /// public static CPUExtensionType GetMostOptimized() { - if (ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension == CPUExtensionType.Automatic) { + if (ConfigManager.GeneralConfig.ForceCPUExtension == CPUExtensionType.Automatic) { for (int i = 0; i < _detectOrder.Length; ++i) { if (HasExtensionSupport(_detectOrder[i])) { return _detectOrder[i]; } } - } else if (HasExtensionSupport(ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension)) { - return ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension; + } else if (HasExtensionSupport(ConfigManager.GeneralConfig.ForceCPUExtension)) { + return ConfigManager.GeneralConfig.ForceCPUExtension; } return CPUExtensionType.Automatic; } diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 8928c3c..3c73a0b 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -5,71 +5,49 @@ using NiceHashMiner.Enums; using System.Security.Cryptography; using NiceHashMiner.Configs; +using NiceHashMiner.Configs.Data; namespace NiceHashMiner.Devices { - [Serializable] public class ComputeDevice { - [JsonIgnore] readonly public int ID; - readonly public string Name; // { get; set; } // to identify equality; - [JsonIgnore] - readonly public string _nameNoNums; + readonly public string Name; // { get; set; } // name count is the short name for displaying in moning groups - [JsonIgnore] readonly public string NameCount; public bool Enabled; - [JsonIgnore] public readonly bool IsEtherumCapale; - [JsonIgnore] readonly public DeviceGroupType DeviceGroupType; // UUID now used for saving readonly public string UUID; - // CPU, NVIDIA, AMD - [JsonIgnore] + // CPU extras readonly public int Threads; - - [JsonIgnore] readonly public ulong AffinityMask; // CPU, NVIDIA, AMD - [JsonIgnore] public DeviceType DeviceType { get; private set; } - [JsonIgnore] public string BenchmarkCopyUUID { get; set; } - [JsonIgnore] public static readonly ulong MEMORY_2GB = 2147483648; - [JsonIgnore] - CudaDevice _cudaDevice = null; - [JsonIgnore] - AmdGpuDevice _amdDevice = null; + //CudaDevice _cudaDevice = null; + //AmdGpuDevice _amdDevice = null; // sgminer extra quickfix - [JsonIgnore] public bool IsOptimizedVersion { get; private set; } - [JsonIgnore] public string Codename { get; private set; } - [JsonIgnore] - public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } + //public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } + public Dictionary AlgorithmSettings { get; set; } - [JsonIgnore] - [field: NonSerialized] public NiceHashMiner.Forms.Components.DevicesListViewEnableControl.ComputeDeviceEnabledOption ComputeDeviceEnabledOption { get; set; } - [JsonConstructor] - public ComputeDevice(int id, string name, string uuid, bool enabled = true) { + // Fake dev + public ComputeDevice(int id) { ID = id; - Name = name; - _nameNoNums = name; - UUID = uuid; - Enabled = enabled; } // CPU @@ -79,35 +57,33 @@ public ComputeDevice(int id, string group, string name, int threads, ulong affin Name = name; Threads = threads; AffinityMask = affinityMask; - _nameNoNums = name; Enabled = true; DeviceGroupType = DeviceGroupType.CPU; DeviceType = DeviceType.CPU; NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_CPU"), CPUCount); UUID = GetUUID(ID, GroupNames.GetGroupName(DeviceGroupType, ID), Name, DeviceGroupType); + AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); + IsEtherumCapale = false; } // GPU NVIDIA public ComputeDevice(CudaDevice cudaDevice, DeviceGroupType group, int GPUCount) { - _cudaDevice = cudaDevice; ID = (int)cudaDevice.DeviceID; Name = cudaDevice.GetName(); - _nameNoNums = cudaDevice.GetName(); Enabled = true; DeviceGroupType = group; IsEtherumCapale = cudaDevice.IsEtherumCapable(); DeviceType = DeviceType.NVIDIA; NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_NVIDIA_GPU"), GPUCount); UUID = cudaDevice.UUID; + AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); } // GPU AMD public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount) { - _amdDevice = amdDevice; ID = amdDevice.DeviceID; DeviceGroupType = DeviceGroupType.AMD_OpenCL; Name = amdDevice.DeviceName; - _nameNoNums = amdDevice.DeviceName; Enabled = true; IsEtherumCapale = amdDevice.IsEtherumCapable(); DeviceType = DeviceType.AMD; @@ -116,6 +92,7 @@ public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount) { // sgminer extra IsOptimizedVersion = amdDevice.UseOptimizedVersion; Codename = amdDevice.Codename; + AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); } // combines long and short name @@ -123,38 +100,10 @@ public string GetFullName() { return String.Format(International.GetText("ComputeDevice_Full_Device_Name"), NameCount, Name); } - // TODO add file check and stuff like that - public void SetDeviceBenchmarkConfig(DeviceBenchmarkConfig_rem deviceBenchmarkConfig, bool forceSet = false) { - - DeviceBenchmarkConfig = deviceBenchmarkConfig; - // check initialization - if (!DeviceBenchmarkConfig.IsAlgorithmSettingsInit || forceSet) { - DeviceBenchmarkConfig.IsAlgorithmSettingsInit = true; - // only AMD has extra initialization - if (_amdDevice != null) { - // Check for optimized version - if (_amdDevice.UseOptimizedVersion) { - DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; - DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; - DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 512 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; - } else { - // this is not the same as the constructor values?? check! - DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 4" + AmdGpuDevice.TemperatureParam; - DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 256 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; - DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam; - } - if (!_amdDevice.Codename.Contains("Tahiti")) { - DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.NeoScrypt].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam; - Helpers.ConsolePrint("ComputeDevice", "The GPU detected (" + _amdDevice.Codename + ") is not Tahiti. Changing default gpu-threads to 2."); - } - } - } - } - public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { - foreach (var copyAlgSpeeds in copyBenchCDev.DeviceBenchmarkConfig.AlgorithmSettings) { - if (this.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(copyAlgSpeeds.Key)) { - var setAlgo = this.DeviceBenchmarkConfig.AlgorithmSettings[copyAlgSpeeds.Key]; + foreach (var copyAlgSpeeds in copyBenchCDev.AlgorithmSettings) { + if (this.AlgorithmSettings.ContainsKey(copyAlgSpeeds.Key)) { + var setAlgo = this.AlgorithmSettings[copyAlgSpeeds.Key]; setAlgo.BenchmarkSpeed = copyAlgSpeeds.Value.BenchmarkSpeed; setAlgo.ExtraLaunchParameters = copyAlgSpeeds.Value.ExtraLaunchParameters; setAlgo.LessThreads = copyAlgSpeeds.Value.LessThreads; @@ -162,6 +111,56 @@ public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { } } + // settings + // setters + public void SetFromComputeDeviceConfig(ComputeDeviceConfig config) { + if (config != null && config.UUID == UUID) { + this.Enabled = config.Enabled; + } + } + public void SetAlgorithmDeviceConfig(DeviceBenchmarkConfig config) { + if (config != null && config.DeviceUUID == UUID && config.AlgorithmSettings != null) { + foreach (var algoSetting in config.AlgorithmSettings) { + AlgorithmType key = algoSetting.Key; + AlgorithmConfig conf = algoSetting.Value; + if (this.AlgorithmSettings.ContainsKey(key)) { + this.AlgorithmSettings[key].BenchmarkSpeed = conf.BenchmarkSpeed; + this.AlgorithmSettings[key].ExtraLaunchParameters = conf.ExtraLaunchParameters; + this.AlgorithmSettings[key].Skip = conf.Skip; + this.AlgorithmSettings[key].LessThreads = conf.LessThreads; + } + } + } + } + // getters + public ComputeDeviceConfig GetComputeDeviceConfig() { + ComputeDeviceConfig ret = new ComputeDeviceConfig(); + ret.Enabled = this.Enabled; + ret.Name = this.Name; + ret.UUID = this.UUID; + return ret; + } + public DeviceBenchmarkConfig GetAlgorithmDeviceConfig() { + DeviceBenchmarkConfig ret = new DeviceBenchmarkConfig(); + ret.DeviceName = this.Name; + ret.DeviceUUID = this.UUID; + // init algo settings + foreach (var algo in this.AlgorithmSettings.Values) { + AlgorithmType key = algo.NiceHashID; + // create/setup + AlgorithmConfig conf = new AlgorithmConfig(); + conf.NiceHashID = key; + conf.MinerName = algo.MinerName; // TODO probably not needed + conf.BenchmarkSpeed = algo.BenchmarkSpeed; + conf.ExtraLaunchParameters = algo.ExtraLaunchParameters; + conf.Skip = algo.Skip; + conf.LessThreads = algo.LessThreads; + // insert + ret.AlgorithmSettings[key] = conf; + } + return ret; + } + // static methods private static string GetUUID(int id, string group, string name, DeviceGroupType deviceGroupType) { diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index e6136e2..012ad9f 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -134,7 +134,7 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { NVIDIA.QueryCudaDevices(); } // OpenCL and AMD - if (ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD) { + if (ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD) { Helpers.ConsolePrint(TAG, "Skipping AMD device detection, settings set to disabled"); showMessageAndStep(International.GetText("Compute_Device_Query_Manager_AMD_Query_Skip")); } else { @@ -171,7 +171,7 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { _currentNvidiaSMIDriver = GetNvidiaSMIDriver(); // if we have nvidia cards but no CUDA devices tell the user to upgrade driver bool isNvidiaErrorShown = false; // to prevent showing twice - bool showWarning = ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController(); + bool showWarning = ConfigManager.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController(); if (showWarning && CudaDevices.Count == 0 && _currentNvidiaSMIDriver.IsLesserVersionThan(NVIDIA_MIN_DETECTION_DRIVER)) { isNvidiaErrorShown = true; var minDriver = NVIDIA_MIN_DETECTION_DRIVER.ToString(); @@ -235,7 +235,7 @@ public static void QueryVideoControllers() { AvaliableVideoControllers.Add(vidController); } Helpers.ConsolePrint(TAG, stringBuilder.ToString()); - if (ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning && !allVideoContollersOK) { + if (ConfigManager.GeneralConfig.ShowDriverVersionWarning && !allVideoContollersOK) { string msg = International.GetText("QueryVideoControllers_NOT_ALL_OK_Msg"); foreach (var vc in AvaliableVideoControllers) { if (!vc.Status.ToLower().Equals("ok")) { @@ -313,7 +313,7 @@ static private void QueryCudaDevicesOutputErrorDataReceived(object sender, DataR } public static bool IsSkipNVIDIA() { - return ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; + return ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; } static public void QueryCudaDevices() { @@ -518,7 +518,7 @@ static public void QueryAMD() { } } } - if (ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning && ShowWarningDialog == true) { + if (ConfigManager.GeneralConfig.ShowDriverVersionWarning && ShowWarningDialog == true) { Form WarningDialog = new DriverVersionConfirmationDialog(); WarningDialog.ShowDialog(); WarningDialog = null; @@ -677,7 +677,7 @@ static public void QueryAMD() { var newAmdDev = new AmdGpuDevice(amdGpus[i_id], deviceDriverOld[deviceName]); newAmdDev.DeviceName = deviceName; newAmdDev.UUID = _busIdsInfo[busID].Item2; - bool isDisabledGroup = ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; + bool isDisabledGroup = ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD; string skipOrAdd = isDisabledGroup ? "SKIPED" : "ADDED"; string isDisabledGroupStr = isDisabledGroup ? " (AMD group disabled)" : ""; string etherumCapableStr = newAmdDev.IsEtherumCapable() ? "YES" : "NO"; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 159f8a6..9d34f99 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -10,7 +10,54 @@ namespace NiceHashMiner.Devices { /// public static class GroupAlgorithms { - public static Dictionary CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { + + public static Dictionary CreateForDevice(ComputeDevice device) { + if (device != null) { + var algoSettings = CreateDefaultsForGroup(device.DeviceGroupType); + if (algoSettings != null) { + if (device.DeviceType == DeviceType.AMD) { + // Check for optimized version + if (device.IsOptimizedVersion) { + if (algoSettings.ContainsKey(AlgorithmType.Qubit)) { + algoSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; + } + if (algoSettings.ContainsKey(AlgorithmType.Quark)) { + algoSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; + } + if (algoSettings.ContainsKey(AlgorithmType.Lyra2REv2)) { + algoSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 512 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; + } + } else { + // this is not the same as the constructor values?? check! + if (algoSettings.ContainsKey(AlgorithmType.Qubit)) { + algoSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 4" + AmdGpuDevice.TemperatureParam; + } + if (algoSettings.ContainsKey(AlgorithmType.Quark)) { + algoSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 256 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; + } + if (algoSettings.ContainsKey(AlgorithmType.Lyra2REv2)) { + algoSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam; + } + } + if (!device.Codename.Contains("Tahiti")) { + if (algoSettings.ContainsKey(AlgorithmType.NeoScrypt)) { + algoSettings[AlgorithmType.NeoScrypt].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam; + Helpers.ConsolePrint("ComputeDevice", "The GPU detected (" + device.Codename + ") is not Tahiti. Changing default gpu-threads to 2."); + } + } + } + + // check if it is Etherum capable + if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto) && device.IsEtherumCapale == false) { + algoSettings.Remove(AlgorithmType.DaggerHashimoto); + } + } + return algoSettings; + } + return null; + } + + private static Dictionary CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { if (DeviceGroupType.CPU == deviceGroupType) { return new Dictionary() { { AlgorithmType.Lyra2RE, new Algorithm(AlgorithmType.Lyra2RE, "lyra2") }, @@ -43,8 +90,6 @@ public static Dictionary CreateDefaultsForGroup(Device { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - //{ AlgorithmType.Blake256r14 , new Algorithm(AlgorithmType.Blake256r14, "blake") - // { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, @@ -77,17 +122,7 @@ public static Dictionary CreateDefaultsForGroup(Device { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") }, { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; - if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { - // minerName change => "whirlpoolx" => "whirlpool" - ret[AlgorithmType.WhirlpoolX] = new Algorithm(AlgorithmType.WhirlpoolX, "whirlpool"); // Needed for new tpruvot's ccminer - // disable/remove neoscrypt, daggerhashimoto - ret.Remove(AlgorithmType.NeoScrypt); - ret.Remove(AlgorithmType.DaggerHashimoto); - - ret.Remove(AlgorithmType.Lyra2RE); - ret.Remove(AlgorithmType.Lyra2REv2); - } - if (DeviceGroupType.NVIDIA_3_x == deviceGroupType) { + if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType) { // minerName change => "whirlpoolx" => "whirlpool" ret[AlgorithmType.WhirlpoolX] = new Algorithm(AlgorithmType.WhirlpoolX, "whirlpool"); // Needed for new tpruvot's ccminer // disable/remove neoscrypt @@ -95,6 +130,10 @@ public static Dictionary CreateDefaultsForGroup(Device ret.Remove(AlgorithmType.Lyra2RE); ret.Remove(AlgorithmType.Lyra2REv2); } + if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { + // disable/remove daggerhashimoto + ret.Remove(AlgorithmType.DaggerHashimoto); + } return ret; } diff --git a/NiceHashMiner/Enums/AlgorithmType.cs b/NiceHashMiner/Enums/AlgorithmType.cs index 2b3ec42..d025dbc 100644 --- a/NiceHashMiner/Enums/AlgorithmType.cs +++ b/NiceHashMiner/Enums/AlgorithmType.cs @@ -30,7 +30,7 @@ public enum AlgorithmType : int Lyra2REv2 = 14, ScryptJaneNf16_UNUSED = 15, Blake256r8 = 16, - Blake256r14 = 17, + Blake256r14 = 17, // NOT USED ANYMORE? Blake256r8vnl = 18, Hodl = 19, DaggerHashimoto = 20, diff --git a/NiceHashMiner/Ethereum.cs b/NiceHashMiner/Ethereum.cs index af81cf0..4ca527f 100644 --- a/NiceHashMiner/Ethereum.cs +++ b/NiceHashMiner/Ethereum.cs @@ -151,8 +151,8 @@ public static void GetCurrentBlock(string worker) if (ret == null) { - Helpers.ConsolePrint(worker, "Failed to obtain current block, using default 1700000."); - CurrentBlockNum = ConfigManager_rem.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); + Helpers.ConsolePrint(worker, String.Format("Failed to obtain current block, using default {0}.", ConfigManager.GeneralConfig.ethminerDefaultBlockHeight)); + CurrentBlockNum = ConfigManager.GeneralConfig.ethminerDefaultBlockHeight.ToString(); } else { diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index 51dbbd1..7076f03 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -79,7 +79,7 @@ public void SetCurrentlySelected(ListViewItem lvi, ComputeDevice computeDevice) this.Enabled = lvi.Checked; groupBoxSelectedAlgorithmSettings.Text = String.Format(International.GetText("AlgorithmsListView_GroupBox"), - algorithm.NiceHashName); ; + algorithm.GetName()); ; //// no intensity for cpu miners and ccminer_cryptonight diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 158ad66..0d7ffc1 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -86,12 +86,11 @@ public void InitLocale() { public void SetAlgorithms(ComputeDevice computeDevice, bool isEnabled) { _computeDevice = computeDevice; - var config = computeDevice.DeviceBenchmarkConfig; listViewAlgorithms.BeginUpdate(); listViewAlgorithms.Items.Clear(); - foreach (var alg in config.AlgorithmSettings) { + foreach (var alg in computeDevice.AlgorithmSettings) { ListViewItem lvi = new ListViewItem(); - ListViewItem.ListViewSubItem sub = lvi.SubItems.Add(alg.Value.NiceHashName); + ListViewItem.ListViewSubItem sub = lvi.SubItems.Add(alg.Value.GetName()); //sub.Tag = alg.Value; lvi.SubItems.Add(alg.Value.BenchmarkSpeedString()); @@ -152,7 +151,7 @@ public void ResetListItemColors() { // benchmark settings public void SetSpeedStatus(ComputeDevice computeDevice, AlgorithmType algorithmType, string status) { - var algorithm = computeDevice.DeviceBenchmarkConfig.AlgorithmSettings[algorithmType]; + var algorithm = computeDevice.AlgorithmSettings[algorithmType]; algorithm.BenchmarkStatus = status; diff --git a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs index 92710fb..7590c07 100644 --- a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs +++ b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs @@ -167,7 +167,7 @@ private void listViewDevicesItemChecked(object sender, ItemCheckedEventArgs e) { G.SaveOption(); } if (SaveToGeneralConfig) { - ConfigManager_rem.Instance.GeneralConfig.Commit(); + ConfigManager.GeneralConfigFileCommit(); } var lvi = e.Item as ListViewItem; if (lvi != null) _listItemCheckColorSetter.LviSetColor(lvi); diff --git a/NiceHashMiner/Forms/DriverVersionConfirmationDialog.cs b/NiceHashMiner/Forms/DriverVersionConfirmationDialog.cs index fbbb2b8..ff24b30 100644 --- a/NiceHashMiner/Forms/DriverVersionConfirmationDialog.cs +++ b/NiceHashMiner/Forms/DriverVersionConfirmationDialog.cs @@ -27,7 +27,7 @@ private void buttonOK_Click(object sender, EventArgs e) if (chkBoxDontShowAgain.Checked) { Helpers.ConsolePrint("NICEHASH", "Setting ShowDriverVersionWarning to false"); - ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning = false; + ConfigManager.GeneralConfig.ShowDriverVersionWarning = false; } this.Close(); diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 3a3df56..a4f0871 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -124,7 +124,7 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm Dictionary benchNamesUUIDs = new Dictionary(); // initialize benchmark settings for same cards to only copy settings foreach (var GdevSetting in devicesListViewEnableControl1.Options) { - var plainDevName = GdevSetting.CDevice._nameNoNums; + var plainDevName = GdevSetting.CDevice.Name; if (benchNamesUUIDs.ContainsKey(plainDevName)) { GdevSetting.IsEnabled = false; GdevSetting.CDevice.BenchmarkCopyUUID = benchNamesUUIDs[plainDevName]; @@ -322,7 +322,7 @@ public void CalcBenchmarkDevicesAlgorithmQueue() { foreach (var option in devicesListViewEnableControl1.Options) { var algorithmQueue = new Queue(); if (_singleBenchmarkType == AlgorithmType.NONE) { - foreach (var kvpAlgorithm in option.CDevice.DeviceBenchmarkConfig.AlgorithmSettings) { + foreach (var kvpAlgorithm in option.CDevice.AlgorithmSettings) { if (ShoulBenchmark(kvpAlgorithm.Value)) { algorithmQueue.Enqueue(kvpAlgorithm.Value); kvpAlgorithm.Value.SetBenchmarkPendingNoMsg(); @@ -331,7 +331,7 @@ public void CalcBenchmarkDevicesAlgorithmQueue() { } } } else { // single bench - var algo = option.CDevice.DeviceBenchmarkConfig.AlgorithmSettings[_singleBenchmarkType]; + var algo = option.CDevice.AlgorithmSettings[_singleBenchmarkType]; algorithmQueue.Enqueue(algo); } @@ -418,7 +418,7 @@ void NextBenchmark() { CurrentAlgoName = AlgorithmNiceHashNames.GetName(_currentAlgorithm.NiceHashID); _currentMiner.InitBenchmarkSetup(new MiningPair(_currentDevice, _currentAlgorithm)); - var time = ConfigManager_rem.Instance.GeneralConfig.BenchmarkTimeLimits + var time = ConfigManager.GeneralConfig.BenchmarkTimeLimits .GetBenchamrktime(benchmarkOptions1.PerformanceType, _currentDevice.DeviceGroupType); //currentConfig.TimeLimit = time; if (__CPUBenchmarkStatus != null) { @@ -518,7 +518,7 @@ public void OnBenchmarkComplete(bool success, string status) { _benchmarkFailedAlgoPerDev.Add( new DeviceAlgo() { Device = _currentDevice.Name, - Algorithm = _currentAlgorithm.NiceHashName + Algorithm = _currentAlgorithm.GetName() } ); algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, status); } else if (!rebenchSame) { @@ -563,18 +563,18 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e // disable all pending benchmark foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + foreach (var algorithm in cDev.AlgorithmSettings.Values) { algorithm.ClearBenchmarkPending(); } } // save already benchmarked algorithms - ConfigManager_rem.Instance.CommitBenchmarks(); + ConfigManager.CommitBenchmarks(); // check devices without benchmarks foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cdev.ComputeDeviceEnabledOption.IsEnabled) { bool Enabled = false; - foreach (var algo in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { + foreach (var algo in cdev.AlgorithmSettings) { if (algo.Value.BenchmarkSpeed > 0) { Enabled = true; break; diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage_r.Designer.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs similarity index 98% rename from NiceHashMiner/Forms/Form_ChooseLanguage_r.Designer.cs rename to NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs index 413f263..09ab12b 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage_r.Designer.cs +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs @@ -1,5 +1,5 @@ namespace NiceHashMiner.Forms { - partial class Form_ChooseLanguage_r { + partial class Form_ChooseLanguage { /// /// Required designer variable. /// diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.cs similarity index 85% rename from NiceHashMiner/Forms/Form_ChooseLanguage_r.cs rename to NiceHashMiner/Forms/Form_ChooseLanguage.cs index bd380b0..a8c0372 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage_r.cs +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.cs @@ -11,8 +11,8 @@ using System.Windows.Forms; namespace NiceHashMiner.Forms { - public partial class Form_ChooseLanguage_r : Form { - public Form_ChooseLanguage_r() { + public partial class Form_ChooseLanguage : Form { + public Form_ChooseLanguage() { InitializeComponent(); // Add language selections list @@ -31,7 +31,7 @@ public Form_ChooseLanguage_r() { } private void button_OK_Click(object sender, EventArgs e) { - ConfigManager_rem.Instance.GeneralConfig.Language = (LanguageType)comboBox_Languages.SelectedIndex; + ConfigManager.GeneralConfig.Language = (LanguageType)comboBox_Languages.SelectedIndex; this.Close(); } } diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage_r.resx b/NiceHashMiner/Forms/Form_ChooseLanguage.resx similarity index 100% rename from NiceHashMiner/Forms/Form_ChooseLanguage_r.resx rename to NiceHashMiner/Forms/Form_ChooseLanguage.resx diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs b/NiceHashMiner/Forms/Form_ClaymoreTOS.cs index c3e2db6..4979b9c 100644 --- a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs +++ b/NiceHashMiner/Forms/Form_ClaymoreTOS.cs @@ -22,12 +22,12 @@ public Form_ClaymoreTOS() { } private void button_Agree_Click(object sender, EventArgs e) { - ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; + ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; this.Close(); } private void button_Decline_Click(object sender, EventArgs e) { - ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; this.Close(); } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index bac106e..6ac4344 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -101,11 +101,11 @@ private void InitLocalization() { // these strings are no longer used, check and use them as base string rateString = International.GetText("Rate") + ":"; string ratesBTCInitialString = "0.00000000 BTC/" + International.GetText("Day"); - string ratesDollarInitialString = String.Format("0.00 {0}/", ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency) + International.GetText("Day"); + string ratesDollarInitialString = String.Format("0.00 {0}/", ConfigManager.GeneralConfig.DisplayCurrency) + International.GetText("Day"); toolStripStatusLabelGlobalRateText.Text = International.GetText("Form_Main_global_rate") + ":"; toolStripStatusLabelBTCDayText.Text = "BTC/" + International.GetText("Day"); - toolStripStatusLabelBalanceText.Text = (ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; + toolStripStatusLabelBalanceText.Text = (ConfigManager.GeneralConfig.DisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; devicesListViewEnableControl1.InitLocale(); @@ -119,17 +119,17 @@ private void InitLocalization() { } private void InitMainConfigGUIData() { - if (ConfigManager_rem.Instance.GeneralConfig.ServiceLocation >= 0 && ConfigManager_rem.Instance.GeneralConfig.ServiceLocation < Globals.MiningLocation.Length) - comboBoxLocation.SelectedIndex = ConfigManager_rem.Instance.GeneralConfig.ServiceLocation; + if (ConfigManager.GeneralConfig.ServiceLocation >= 0 && ConfigManager.GeneralConfig.ServiceLocation < Globals.MiningLocation.Length) + comboBoxLocation.SelectedIndex = ConfigManager.GeneralConfig.ServiceLocation; else comboBoxLocation.SelectedIndex = 0; - textBoxBTCAddress.Text = ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress; - textBoxWorkerName.Text = ConfigManager_rem.Instance.GeneralConfig.WorkerName; + textBoxBTCAddress.Text = ConfigManager.GeneralConfig.BitcoinAddress; + textBoxWorkerName.Text = ConfigManager.GeneralConfig.WorkerName; ShowWarningNiceHashData = true; DemoMode = false; - toolStripStatusLabelBalanceDollarValue.Text = "(" + ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency + ")"; + toolStripStatusLabelBalanceDollarValue.Text = "(" + ConfigManager.GeneralConfig.DisplayCurrency + ")"; if (_isDeviceDetectionInitialized) { devicesListViewEnableControl1.ResetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); @@ -150,13 +150,13 @@ public void AfterLoadComplete() private void IdleCheck_Tick(object sender, EventArgs e) { - if (!ConfigManager_rem.Instance.GeneralConfig.StartMiningWhenIdle) return; + if (!ConfigManager.GeneralConfig.StartMiningWhenIdle) return; uint MSIdle = Helpers.GetIdleTime(); if (MinerStatsCheck.Enabled) { - if (MSIdle < (ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds * 1000)) + if (MSIdle < (ConfigManager.GeneralConfig.MinIdleSeconds * 1000)) { buttonStopMining_Click(null, null); Helpers.ConsolePrint("NICEHASH", "Resumed from idling"); @@ -164,7 +164,7 @@ private void IdleCheck_Tick(object sender, EventArgs e) } else { - if (BenchmarkForm == null && (MSIdle > (ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds * 1000))) + if (BenchmarkForm == null && (MSIdle > (ConfigManager.GeneralConfig.MinIdleSeconds * 1000))) { Helpers.ConsolePrint("NICEHASH", "Entering idling state"); buttonStartMining_Click(null, null); @@ -205,7 +205,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { ///////////////////////////////////////////// /////// from here on we have our devices and Miners initialized - ConfigManager_rem.Instance.AfterDeviceQueryInitialization(); + ConfigManager.AfterDeviceQueryInitialization(); LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SaveConfig")); // All devices settup should be initialized in AllDevices @@ -218,13 +218,13 @@ private void StartupTimer_Tick(object sender, EventArgs e) { MinerStatsCheck = new Timer(); MinerStatsCheck.Tick += MinerStatsCheck_Tick; - MinerStatsCheck.Interval = ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval * 1000; + MinerStatsCheck.Interval = ConfigManager.GeneralConfig.MinerAPIQueryInterval * 1000; SMAMinerCheck = new Timer(); SMAMinerCheck.Tick += SMAMinerCheck_Tick; - SMAMinerCheck.Interval = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); + SMAMinerCheck.Interval = ConfigManager.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager.GeneralConfig.SwitchMinSecondsDynamic * 1000); if (ComputeDeviceManager.Group.ContainsAMD_GPUs) { - SMAMinerCheck.Interval = (ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); + SMAMinerCheck.Interval = (ConfigManager.GeneralConfig.SwitchMinSecondsAMD + ConfigManager.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager.GeneralConfig.SwitchMinSecondsDynamic * 1000); } UpdateCheck = new Timer(); @@ -271,10 +271,10 @@ private void StartupTimer_Tick(object sender, EventArgs e) { LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetWindowsErrorReporting")); - Helpers.DisableWindowsErrorReporting(ConfigManager_rem.Instance.GeneralConfig.DisableWindowsErrorReporting); + Helpers.DisableWindowsErrorReporting(ConfigManager.GeneralConfig.DisableWindowsErrorReporting); LoadingScreen.IncreaseLoadCounter(); - if (ConfigManager_rem.Instance.GeneralConfig.NVIDIAP0State) { + if (ConfigManager.GeneralConfig.NVIDIAP0State) { LoadingScreen.SetInfoMsg(International.GetText("Form_Main_loadtext_NVIDIAP0State")); try { ProcessStartInfo psi = new ProcessStartInfo(); @@ -298,7 +298,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { // standard miners check scope { // check if download needed - if (!MinersExistanceChecker.IsMinersBinsInit() && !ConfigManager_rem.Instance.GeneralConfig.DownloadInit) { + if (!MinersExistanceChecker.IsMinersBinsInit() && !ConfigManager.GeneralConfig.DownloadInit) { Form_Loading downloadUnzipForm = new Form_Loading(new MinersDownloader(MinersDownloadManager.StandardDlSetup)); SetChildFormCenter(downloadUnzipForm); downloadUnzipForm.ShowDialog(); @@ -309,8 +309,8 @@ private void StartupTimer_Tick(object sender, EventArgs e) { International.GetText("Warning_with_Exclamation"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { - ConfigManager_rem.Instance.GeneralConfig.DownloadInit = false; - ConfigManager_rem.Instance.GeneralConfig.Commit(); + ConfigManager.GeneralConfig.DownloadInit = false; + ConfigManager.GeneralConfigFileCommit(); Process PHandle = new Process(); PHandle.StartInfo.FileName = Application.ExecutablePath; PHandle.Start(); @@ -319,21 +319,21 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } } else { // all good - ConfigManager_rem.Instance.GeneralConfig.DownloadInit = true; - ConfigManager_rem.Instance.GeneralConfig.Commit(); + ConfigManager.GeneralConfig.DownloadInit = true; + ConfigManager.GeneralConfigFileCommit(); } } // 3rdparty miners check scope { // check if setting set - if (ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.NOT_SET) { + if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.NOT_SET) { // Show TOS Form tos = new Form_ClaymoreTOS(); tos.ShowDialog(this); } // check if download needed - if (ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { - if (!MinersExistanceChecker.IsMiners3rdPartyBinsInit() && !ConfigManager_rem.Instance.GeneralConfig.DownloadInit3rdParty) { + if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { + if (!MinersExistanceChecker.IsMiners3rdPartyBinsInit() && !ConfigManager.GeneralConfig.DownloadInit3rdParty) { Form_Loading download3rdPartyUnzipForm = new Form_Loading(new MinersDownloader(MinersDownloadManager.ThirdPartyDlSetup)); SetChildFormCenter(download3rdPartyUnzipForm); download3rdPartyUnzipForm.ShowDialog(); @@ -344,8 +344,8 @@ private void StartupTimer_Tick(object sender, EventArgs e) { International.GetText("Warning_with_Exclamation"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { - ConfigManager_rem.Instance.GeneralConfig.DownloadInit3rdParty = false; - ConfigManager_rem.Instance.GeneralConfig.Commit(); + ConfigManager.GeneralConfig.DownloadInit3rdParty = false; + ConfigManager.GeneralConfigFileCommit(); Process PHandle = new Process(); PHandle.StartInfo.FileName = Application.ExecutablePath; PHandle.Start(); @@ -354,14 +354,14 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } } else { // all good - ConfigManager_rem.Instance.GeneralConfig.DownloadInit3rdParty = true; - ConfigManager_rem.Instance.GeneralConfig.Commit(); + ConfigManager.GeneralConfig.DownloadInit3rdParty = true; + ConfigManager.GeneralConfigFileCommit(); } } } // no bots please - if (ConfigManager_rem.Instance.GeneralConfig.hwidLoadFromFile && !ConfigManager_rem.Instance.GeneralConfig.hwidOK) { + if (ConfigManager.GeneralConfigHwidLoadFromFile() && !ConfigManager.GeneralConfigHwidOK()) { var result = MessageBox.Show("NiceHash Miner has detected change of hardware ID. If you did not download and install NiceHash Miner, your computer may be compromised. In that case, we suggest you to install an antivirus program or reinstall your Windows.\r\n\r\nContinue with NiceHash Miner?", //International.GetText("Form_Main_msgbox_anti_botnet_msgbox"), International.GetText("Warning_with_Exclamation"), @@ -371,10 +371,10 @@ private void StartupTimer_Tick(object sender, EventArgs e) { return; } else { // users agrees he installed it so commit changes - ConfigManager_rem.Instance.GeneralConfig.Commit(); + ConfigManager.GeneralConfigFileCommit(); } } else { - if (ConfigManager_rem.Instance.GeneralConfig.AutoStartMining) { + if (ConfigManager.GeneralConfig.AutoStartMining) { buttonStartMining_Click(null, null); } } @@ -403,9 +403,9 @@ private void Form_Main_Shown(object sender, EventArgs e) private void SMAMinerCheck_Tick(object sender, EventArgs e) { - SMAMinerCheck.Interval = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); + SMAMinerCheck.Interval = ConfigManager.GeneralConfig.SwitchMinSecondsFixed * 1000 + R.Next(ConfigManager.GeneralConfig.SwitchMinSecondsDynamic * 1000); if (ComputeDeviceManager.Group.ContainsAMD_GPUs) { - SMAMinerCheck.Interval = (ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD + ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic * 1000); + SMAMinerCheck.Interval = (ConfigManager.GeneralConfig.SwitchMinSecondsAMD + ConfigManager.GeneralConfig.SwitchMinSecondsFixed) * 1000 + R.Next(ConfigManager.GeneralConfig.SwitchMinSecondsDynamic * 1000); } #if (SWITCH_TESTING) @@ -475,7 +475,7 @@ public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPID string rateBTCString = FormatPayingOutput(paying); string rateCurrencyString = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying * Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency) + International.GetText("Day"); + + String.Format(" {0}/", ConfigManager.GeneralConfig.DisplayCurrency) + International.GetText("Day"); ((GroupProfitControl)flowLayoutPanelRates.Controls[flowLayoutPanelRatesIndex++]) .UpdateProfitStats(groupName, deviceStringInfo, speedString, rateBTCString, rateCurrencyString); @@ -497,7 +497,7 @@ private void UpdateGlobalRate() { double TotalRate = MinersManager.Instance.GetTotalRate(); - if (ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues && TotalRate < 0.1) + if (ConfigManager.GeneralConfig.AutoScaleBTCValues && TotalRate < 0.1) { toolStripStatusLabelBTCDayText.Text = "mBTC/" + International.GetText("Day"); toolStripStatusLabelGlobalRateValue.Text = (TotalRate * 1000).ToString("F7", CultureInfo.InvariantCulture); @@ -520,7 +520,7 @@ void BalanceCheck_Tick(object sender, EventArgs e) double Balance = NiceHashStats.GetBalance(textBoxBTCAddress.Text.Trim(), textBoxBTCAddress.Text.Trim() + "." + textBoxWorkerName.Text.Trim()); if (Balance > 0) { - if (ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues && Balance < 0.1) + if (ConfigManager.GeneralConfig.AutoScaleBTCValues && Balance < 0.1) { toolStripStatusLabelBalanceBTCCode.Text = "mBTC"; toolStripStatusLabelBalanceBTCValue.Text = (Balance * 1000).ToString("F7", CultureInfo.InvariantCulture); @@ -686,7 +686,7 @@ private void Form1_FormClosing(object sender, FormClosingEventArgs e) private void buttonBenchmark_Click(object sender, EventArgs e) { - ConfigManager_rem.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; + ConfigManager.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; BenchmarkForm = new Form_Benchmark(); SetChildFormCenter(BenchmarkForm); @@ -749,47 +749,48 @@ private void buttonStartMining_Click(object sender, EventArgs e) return; } - // first value is a boolean if initialized or not - var tuplePair = DeviceBenchmarkConfigManager.Instance.IsEnabledBenchmarksInitialized(); - bool isBenchInit = tuplePair.Item1; - Dictionary> nonBenchmarkedPerDevice = tuplePair.Item2; - // Check if the user has run benchmark first - if (!isBenchInit) { - DialogResult result = MessageBox.Show(International.GetText("EnabledUnbenchmarkedAlgorithmsWarning"), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); - if (result == System.Windows.Forms.DialogResult.Yes) { - List enabledDevices = new List(); - HashSet deviceNames = new HashSet(); - foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cdev.Enabled && !deviceNames.Contains(cdev.Name)) { - deviceNames.Add(cdev.Name); - enabledDevices.Add(cdev); - } - } - BenchmarkForm = new Form_Benchmark( - BenchmarkPerformanceType.Standard, - true); - SetChildFormCenter(BenchmarkForm); - BenchmarkForm.ShowDialog(); - BenchmarkForm = null; - InitMainConfigGUIData(); - } else if (result == System.Windows.Forms.DialogResult.No) { - // check devices without benchmarks - foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - bool Enabled = false; - foreach (var algo in cdev.DeviceBenchmarkConfig.AlgorithmSettings) { - if (algo.Value.BenchmarkSpeed > 0) { - Enabled = true; - break; - } - } - cdev.ComputeDeviceEnabledOption.IsEnabled = Enabled; - } - } else { - return; - } - } + //// TODO + //// first value is a boolean if initialized or not + //var tuplePair = DeviceBenchmarkConfigManager.Instance.IsEnabledBenchmarksInitialized(); + //bool isBenchInit = tuplePair.Item1; + //Dictionary> nonBenchmarkedPerDevice = tuplePair.Item2; + //// Check if the user has run benchmark first + //if (!isBenchInit) { + // DialogResult result = MessageBox.Show(International.GetText("EnabledUnbenchmarkedAlgorithmsWarning"), + // International.GetText("Warning_with_Exclamation"), + // MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); + // if (result == System.Windows.Forms.DialogResult.Yes) { + // List enabledDevices = new List(); + // HashSet deviceNames = new HashSet(); + // foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // if (cdev.Enabled && !deviceNames.Contains(cdev.Name)) { + // deviceNames.Add(cdev.Name); + // enabledDevices.Add(cdev); + // } + // } + // BenchmarkForm = new Form_Benchmark( + // BenchmarkPerformanceType.Standard, + // true); + // SetChildFormCenter(BenchmarkForm); + // BenchmarkForm.ShowDialog(); + // BenchmarkForm = null; + // InitMainConfigGUIData(); + // } else if (result == System.Windows.Forms.DialogResult.No) { + // // check devices without benchmarks + // foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // bool Enabled = false; + // foreach (var algo in cdev.AlgorithmSettings) { + // if (algo.Value.BenchmarkSpeed > 0) { + // Enabled = true; + // break; + // } + // } + // cdev.ComputeDeviceEnabledOption.IsEnabled = Enabled; + // } + // } else { + // return; + // } + //} // check if any device enabled // check devices without benchmarks @@ -816,9 +817,9 @@ private void buttonStartMining_Click(object sender, EventArgs e) devicesListViewEnableControl1.IsMining = true; buttonStopMining.Enabled = true; - ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); - ConfigManager_rem.Instance.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); - ConfigManager_rem.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; + ConfigManager.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); + ConfigManager.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); + ConfigManager.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; InitFlowPanelStart(); ClearRatesALL(); @@ -826,7 +827,7 @@ private void buttonStartMining_Click(object sender, EventArgs e) var btcAdress = DemoMode ? Globals.DemoUser : textBoxBTCAddress.Text.Trim(); var isMining = MinersManager.Instance.StartInitialize(this, Globals.MiningLocation[comboBoxLocation.SelectedIndex], textBoxWorkerName.Text.Trim(), btcAdress); - if (!DemoMode) ConfigManager_rem.Instance.GeneralConfig.Commit(); + if (!DemoMode) ConfigManager.GeneralConfigFileCommit(); SMAMinerCheck.Interval = 100; SMAMinerCheck.Start(); @@ -867,7 +868,7 @@ private string FormatPayingOutput(double paying) { string ret = ""; - if (ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues && paying < 0.1) + if (ConfigManager.GeneralConfig.AutoScaleBTCValues && paying < 0.1) ret = (paying * 1000).ToString("F7", CultureInfo.InvariantCulture) + " mBTC/" + International.GetText("Day"); else ret = paying.ToString("F8", CultureInfo.InvariantCulture) + " BTC/" + International.GetText("Day"); @@ -901,10 +902,10 @@ private void textBoxCheckBoxMain_Leave(object sender, EventArgs e) if (VerifyMiningAddress(false)) { // Commit to config.json - ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); - ConfigManager_rem.Instance.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); - ConfigManager_rem.Instance.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; - ConfigManager_rem.Instance.GeneralConfig.Commit(); + ConfigManager.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); + ConfigManager.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); + ConfigManager.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; + ConfigManager.GeneralConfigFileCommit(); } } @@ -914,7 +915,7 @@ private void Form1_Resize(object sender, EventArgs e) notifyIcon1.Icon = Properties.Resources.logo; notifyIcon1.Text = Application.ProductName + " v" + Application.ProductVersion + "\nDouble-click to restore.."; - if (ConfigManager_rem.Instance.GeneralConfig.MinimizeToTray && FormWindowState.Minimized == this.WindowState) + if (ConfigManager.GeneralConfig.MinimizeToTray && FormWindowState.Minimized == this.WindowState) { notifyIcon1.Visible = true; this.Hide(); diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index ce8fadb..44603ef 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -1,4 +1,5 @@ using NiceHashMiner.Configs; +using NiceHashMiner.Configs.Data; using NiceHashMiner.Devices; using NiceHashMiner.Enums; using NiceHashMiner.Miners; @@ -36,10 +37,6 @@ private set { ComputeDevice _selectedComputeDevice; - // deep copy initial state if we want to discard changes - private GeneralConfigHandler _generalConfigBackup; - private Dictionary _benchmarkConfigsBackup; - public Form_Settings() { InitializeComponent(); this.Icon = NiceHashMiner.Properties.Resources.logo; @@ -48,8 +45,8 @@ public Form_Settings() { IsChange = false; IsChangeSaved = false; - _benchmarkConfigsBackup = MemoryHelper.DeepClone(ConfigManager_rem.Instance.BenchmarkConfigs); - _generalConfigBackup = MemoryHelper.DeepClone(ConfigManager_rem.Instance.GeneralConfig); + // TODO + ConfigManager.CreateBackup(); // initialize form InitializeFormTranslations(); @@ -350,7 +347,7 @@ private void InitializeGeneralTabCallbacks() { } // CPU exceptions - comboBox_CPU0_ForceCPUExtension.SelectedIndex = (int)ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension; + comboBox_CPU0_ForceCPUExtension.SelectedIndex = (int)ConfigManager.GeneralConfig.ForceCPUExtension; comboBox_CPU0_ForceCPUExtension.SelectedIndexChanged += comboBox_CPU0_ForceCPUExtension_SelectedIndexChanged; // fill dag dropdown comboBox_DagLoadMode.Items.Clear(); @@ -358,51 +355,51 @@ private void InitializeGeneralTabCallbacks() { comboBox_DagLoadMode.Items.Add(MinerEtherum.GetDagGenerationString((DagGenerationType)i)); } // set selected - comboBox_DagLoadMode.SelectedIndex = (int)ConfigManager_rem.Instance.GeneralConfig.EthminerDagGenerationType; + comboBox_DagLoadMode.SelectedIndex = (int)ConfigManager.GeneralConfig.EthminerDagGenerationType; } private void InitializeGeneralTabFieldValuesReferences() { // Checkboxes set checked value { - checkBox_DebugConsole.Checked = ConfigManager_rem.Instance.GeneralConfig.DebugConsole; - checkBox_AutoStartMining.Checked = ConfigManager_rem.Instance.GeneralConfig.AutoStartMining; - checkBox_HideMiningWindows.Checked = ConfigManager_rem.Instance.GeneralConfig.HideMiningWindows; - checkBox_MinimizeToTray.Checked = ConfigManager_rem.Instance.GeneralConfig.MinimizeToTray; - checkBox_DisableDetectionNVIDIA.Checked = ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; - checkBox_DisableDetectionAMD.Checked = ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD; - checkBox_AutoScaleBTCValues.Checked = ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues; - checkBox_StartMiningWhenIdle.Checked = ConfigManager_rem.Instance.GeneralConfig.StartMiningWhenIdle; - checkBox_ShowDriverVersionWarning.Checked = ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning; - checkBox_DisableWindowsErrorReporting.Checked = ConfigManager_rem.Instance.GeneralConfig.DisableWindowsErrorReporting; - checkBox_NVIDIAP0State.Checked = ConfigManager_rem.Instance.GeneralConfig.NVIDIAP0State; - checkBox_LogToFile.Checked = ConfigManager_rem.Instance.GeneralConfig.LogToFile; - checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager_rem.Instance.GeneralConfig.DisableAMDTempControl; - checkBox_DisableDefaultOptimizations.Checked = ConfigManager_rem.Instance.GeneralConfig.DisableDefaultOptimizations; - checkBox_ContinueMiningIfNoInternetAccess.Checked = ConfigManager_rem.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess; - this.checkBox_Use3rdPartyMiners.Checked = ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; + checkBox_DebugConsole.Checked = ConfigManager.GeneralConfig.DebugConsole; + checkBox_AutoStartMining.Checked = ConfigManager.GeneralConfig.AutoStartMining; + checkBox_HideMiningWindows.Checked = ConfigManager.GeneralConfig.HideMiningWindows; + checkBox_MinimizeToTray.Checked = ConfigManager.GeneralConfig.MinimizeToTray; + checkBox_DisableDetectionNVIDIA.Checked = ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA; + checkBox_DisableDetectionAMD.Checked = ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD; + checkBox_AutoScaleBTCValues.Checked = ConfigManager.GeneralConfig.AutoScaleBTCValues; + checkBox_StartMiningWhenIdle.Checked = ConfigManager.GeneralConfig.StartMiningWhenIdle; + checkBox_ShowDriverVersionWarning.Checked = ConfigManager.GeneralConfig.ShowDriverVersionWarning; + checkBox_DisableWindowsErrorReporting.Checked = ConfigManager.GeneralConfig.DisableWindowsErrorReporting; + checkBox_NVIDIAP0State.Checked = ConfigManager.GeneralConfig.NVIDIAP0State; + checkBox_LogToFile.Checked = ConfigManager.GeneralConfig.LogToFile; + checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager.GeneralConfig.DisableAMDTempControl; + checkBox_DisableDefaultOptimizations.Checked = ConfigManager.GeneralConfig.DisableDefaultOptimizations; + checkBox_ContinueMiningIfNoInternetAccess.Checked = ConfigManager.GeneralConfig.ContinueMiningIfNoInternetAccess; + this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; } // Textboxes { - textBox_BitcoinAddress.Text = ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress; - textBox_WorkerName.Text = ConfigManager_rem.Instance.GeneralConfig.WorkerName; - textBox_SwitchMinSecondsFixed.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed.ToString(); - textBox_SwitchMinSecondsDynamic.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic.ToString(); - textBox_SwitchMinSecondsAMD.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD.ToString(); - textBox_MinerAPIQueryInterval.Text = ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval.ToString(); - textBox_MinerRestartDelayMS.Text = ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS.ToString(); - textBox_MinIdleSeconds.Text = ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds.ToString(); - textBox_LogMaxFileSize.Text = ConfigManager_rem.Instance.GeneralConfig.LogMaxFileSize.ToString(); - textBox_ethminerDefaultBlockHeight.Text = ConfigManager_rem.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); - textBox_APIBindPortStart.Text = ConfigManager_rem.Instance.GeneralConfig.ApiBindPortPoolStart.ToString(); - textBox_MinProfit.Text = ConfigManager_rem.Instance.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma; + textBox_BitcoinAddress.Text = ConfigManager.GeneralConfig.BitcoinAddress; + textBox_WorkerName.Text = ConfigManager.GeneralConfig.WorkerName; + textBox_SwitchMinSecondsFixed.Text = ConfigManager.GeneralConfig.SwitchMinSecondsFixed.ToString(); + textBox_SwitchMinSecondsDynamic.Text = ConfigManager.GeneralConfig.SwitchMinSecondsDynamic.ToString(); + textBox_SwitchMinSecondsAMD.Text = ConfigManager.GeneralConfig.SwitchMinSecondsAMD.ToString(); + textBox_MinerAPIQueryInterval.Text = ConfigManager.GeneralConfig.MinerAPIQueryInterval.ToString(); + textBox_MinerRestartDelayMS.Text = ConfigManager.GeneralConfig.MinerRestartDelayMS.ToString(); + textBox_MinIdleSeconds.Text = ConfigManager.GeneralConfig.MinIdleSeconds.ToString(); + textBox_LogMaxFileSize.Text = ConfigManager.GeneralConfig.LogMaxFileSize.ToString(); + textBox_ethminerDefaultBlockHeight.Text = ConfigManager.GeneralConfig.ethminerDefaultBlockHeight.ToString(); + textBox_APIBindPortStart.Text = ConfigManager.GeneralConfig.ApiBindPortPoolStart.ToString(); + textBox_MinProfit.Text = ConfigManager.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma; } // set custom control referances { - benchmarkLimitControlCPU.TimeLimits = ConfigManager_rem.Instance.GeneralConfig.BenchmarkTimeLimits.CPU; - benchmarkLimitControlNVIDIA.TimeLimits = ConfigManager_rem.Instance.GeneralConfig.BenchmarkTimeLimits.NVIDIA; - benchmarkLimitControlAMD.TimeLimits = ConfigManager_rem.Instance.GeneralConfig.BenchmarkTimeLimits.AMD; + benchmarkLimitControlCPU.TimeLimits = ConfigManager.GeneralConfig.BenchmarkTimeLimits.CPU; + benchmarkLimitControlNVIDIA.TimeLimits = ConfigManager.GeneralConfig.BenchmarkTimeLimits.NVIDIA; + benchmarkLimitControlAMD.TimeLimits = ConfigManager.GeneralConfig.BenchmarkTimeLimits.AMD; // here we want all devices devicesListViewEnableControl1.SetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); @@ -423,10 +420,10 @@ private void InitializeGeneralTabFieldValuesReferences() { // ComboBox { - comboBox_Language.SelectedIndex = (int)ConfigManager_rem.Instance.GeneralConfig.Language; - comboBox_ServiceLocation.SelectedIndex = ConfigManager_rem.Instance.GeneralConfig.ServiceLocation; + comboBox_Language.SelectedIndex = (int)ConfigManager.GeneralConfig.Language; + comboBox_ServiceLocation.SelectedIndex = ConfigManager.GeneralConfig.ServiceLocation; - currencyConverterCombobox.SelectedItem = ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency; + currencyConverterCombobox.SelectedItem = ConfigManager.GeneralConfig.DisplayCurrency; } } @@ -495,19 +492,19 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { if (!_isInitFinished) return; // indicate there has been a change IsChange = true; - ConfigManager_rem.Instance.GeneralConfig.DebugConsole = checkBox_DebugConsole.Checked; - ConfigManager_rem.Instance.GeneralConfig.AutoStartMining = checkBox_AutoStartMining.Checked; - ConfigManager_rem.Instance.GeneralConfig.HideMiningWindows = checkBox_HideMiningWindows.Checked; - ConfigManager_rem.Instance.GeneralConfig.MinimizeToTray = checkBox_MinimizeToTray.Checked; - ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA = checkBox_DisableDetectionNVIDIA.Checked; - ConfigManager_rem.Instance.GeneralConfig.DeviceDetection.DisableDetectionAMD = checkBox_DisableDetectionAMD.Checked; - ConfigManager_rem.Instance.GeneralConfig.AutoScaleBTCValues = checkBox_AutoScaleBTCValues.Checked; - ConfigManager_rem.Instance.GeneralConfig.StartMiningWhenIdle = checkBox_StartMiningWhenIdle.Checked; - ConfigManager_rem.Instance.GeneralConfig.ShowDriverVersionWarning = checkBox_ShowDriverVersionWarning.Checked; - ConfigManager_rem.Instance.GeneralConfig.DisableWindowsErrorReporting = checkBox_DisableWindowsErrorReporting.Checked; - ConfigManager_rem.Instance.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; - ConfigManager_rem.Instance.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; - ConfigManager_rem.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess = checkBox_ContinueMiningIfNoInternetAccess.Checked; + ConfigManager.GeneralConfig.DebugConsole = checkBox_DebugConsole.Checked; + ConfigManager.GeneralConfig.AutoStartMining = checkBox_AutoStartMining.Checked; + ConfigManager.GeneralConfig.HideMiningWindows = checkBox_HideMiningWindows.Checked; + ConfigManager.GeneralConfig.MinimizeToTray = checkBox_MinimizeToTray.Checked; + ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionNVIDIA = checkBox_DisableDetectionNVIDIA.Checked; + ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD = checkBox_DisableDetectionAMD.Checked; + ConfigManager.GeneralConfig.AutoScaleBTCValues = checkBox_AutoScaleBTCValues.Checked; + ConfigManager.GeneralConfig.StartMiningWhenIdle = checkBox_StartMiningWhenIdle.Checked; + ConfigManager.GeneralConfig.ShowDriverVersionWarning = checkBox_ShowDriverVersionWarning.Checked; + ConfigManager.GeneralConfig.DisableWindowsErrorReporting = checkBox_DisableWindowsErrorReporting.Checked; + ConfigManager.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; + ConfigManager.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; + ConfigManager.GeneralConfig.ContinueMiningIfNoInternetAccess = checkBox_ContinueMiningIfNoInternetAccess.Checked; } private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, EventArgs e) { @@ -515,10 +512,10 @@ private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, Ev // indicate there has been a change IsChange = true; - ConfigManager_rem.Instance.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; + ConfigManager.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cDev.DeviceType == DeviceType.AMD) { - foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { + foreach (var algorithm in cDev.AlgorithmSettings) { if (algorithm.Key != AlgorithmType.DaggerHashimoto) { algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( @@ -534,97 +531,98 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, // indicate there has been a change IsChange = true; - ConfigManager_rem.Instance.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; - if (ConfigManager_rem.Instance.GeneralConfig.DisableDefaultOptimizations) { - foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { - algorithm.Value.ExtraLaunchParameters = ""; - if (cDev.DeviceType == DeviceType.AMD && algorithm.Key != AlgorithmType.DaggerHashimoto) { - algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; - algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( - new MiningPair(cDev, algorithm.Value), algorithm.Key, cDev.DeviceType, false); - } - } - } - } else { - foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults - var deviceDefaults = GroupAlgorithms.CreateDefaultsForGroup(cDev.DeviceGroupType); - foreach (var defaultAlgoSettings in deviceDefaults) { - if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(defaultAlgoSettings.Key)) { - var algorithmKey = defaultAlgoSettings.Key; - var algorithm = cDev.DeviceBenchmarkConfig.AlgorithmSettings[algorithmKey]; - algorithm.ExtraLaunchParameters = defaultAlgoSettings.Value.ExtraLaunchParameters; - algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( - new MiningPair(cDev, algorithm), algorithmKey, cDev.DeviceType, false); - } - } - // set extra optimizations based on device - cDev.SetDeviceBenchmarkConfig(cDev.DeviceBenchmarkConfig, true); - } - } + // TODO TODO fix + //ConfigManager.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; + //if (ConfigManager.GeneralConfig.DisableDefaultOptimizations) { + // foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { + // algorithm.Value.ExtraLaunchParameters = ""; + // if (cDev.DeviceType == DeviceType.AMD && algorithm.Key != AlgorithmType.DaggerHashimoto) { + // algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; + // algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + // new MiningPair(cDev, algorithm.Value), algorithm.Key, cDev.DeviceType, false); + // } + // } + // } + //} else { + // foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults + // var deviceDefaults = GroupAlgorithms.CreateDefaultsForGroup(cDev.DeviceGroupType); + // foreach (var defaultAlgoSettings in deviceDefaults) { + // if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(defaultAlgoSettings.Key)) { + // var algorithmKey = defaultAlgoSettings.Key; + // var algorithm = cDev.DeviceBenchmarkConfig.AlgorithmSettings[algorithmKey]; + // algorithm.ExtraLaunchParameters = defaultAlgoSettings.Value.ExtraLaunchParameters; + // algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + // new MiningPair(cDev, algorithm), algorithmKey, cDev.DeviceType, false); + // } + // } + // // set extra optimizations based on device + // cDev.SetDeviceBenchmarkConfig(cDev.DeviceBenchmarkConfig, true); + // } + //} } private void GeneralTextBoxes_Leave(object sender, EventArgs e) { if (!_isInitFinished) return; IsChange = true; - ConfigManager_rem.Instance.GeneralConfig.BitcoinAddress = textBox_BitcoinAddress.Text.Trim(); - ConfigManager_rem.Instance.GeneralConfig.WorkerName = textBox_WorkerName.Text.Trim(); + ConfigManager.GeneralConfig.BitcoinAddress = textBox_BitcoinAddress.Text.Trim(); + ConfigManager.GeneralConfig.WorkerName = textBox_WorkerName.Text.Trim(); // TODO IMPORTANT fix this // int's only settings - keypress handles only ints should be safe. If string empty or null focus and alert // after number init set new value text back because it can be out of bounds // try to refactor this mess if (!ParseStringToInt32(ref textBox_SwitchMinSecondsFixed)) return; - ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed = Int32.Parse(textBox_SwitchMinSecondsFixed.Text); - textBox_SwitchMinSecondsFixed.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed.ToString(); + ConfigManager.GeneralConfig.SwitchMinSecondsFixed = Int32.Parse(textBox_SwitchMinSecondsFixed.Text); + textBox_SwitchMinSecondsFixed.Text = ConfigManager.GeneralConfig.SwitchMinSecondsFixed.ToString(); if (!ParseStringToInt32(ref textBox_SwitchMinSecondsDynamic)) return; - ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic = Int32.Parse(textBox_SwitchMinSecondsDynamic.Text); - textBox_SwitchMinSecondsDynamic.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic.ToString(); + ConfigManager.GeneralConfig.SwitchMinSecondsDynamic = Int32.Parse(textBox_SwitchMinSecondsDynamic.Text); + textBox_SwitchMinSecondsDynamic.Text = ConfigManager.GeneralConfig.SwitchMinSecondsDynamic.ToString(); if (!ParseStringToInt32(ref textBox_SwitchMinSecondsAMD)) return; - ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD = Int32.Parse(textBox_SwitchMinSecondsAMD.Text); - textBox_SwitchMinSecondsAMD.Text = ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD.ToString(); + ConfigManager.GeneralConfig.SwitchMinSecondsAMD = Int32.Parse(textBox_SwitchMinSecondsAMD.Text); + textBox_SwitchMinSecondsAMD.Text = ConfigManager.GeneralConfig.SwitchMinSecondsAMD.ToString(); if (!ParseStringToInt32(ref textBox_MinerAPIQueryInterval)) return; - ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval = Int32.Parse(textBox_MinerAPIQueryInterval.Text); - textBox_MinerAPIQueryInterval.Text = ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval.ToString(); + ConfigManager.GeneralConfig.MinerAPIQueryInterval = Int32.Parse(textBox_MinerAPIQueryInterval.Text); + textBox_MinerAPIQueryInterval.Text = ConfigManager.GeneralConfig.MinerAPIQueryInterval.ToString(); if (!ParseStringToInt32(ref textBox_MinerRestartDelayMS)) return; - ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS = Int32.Parse(textBox_MinerRestartDelayMS.Text); - textBox_MinerRestartDelayMS.Text = ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS.ToString(); + ConfigManager.GeneralConfig.MinerRestartDelayMS = Int32.Parse(textBox_MinerRestartDelayMS.Text); + textBox_MinerRestartDelayMS.Text = ConfigManager.GeneralConfig.MinerRestartDelayMS.ToString(); if (!ParseStringToInt32(ref textBox_MinIdleSeconds)) return; - ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds = Int32.Parse(textBox_MinIdleSeconds.Text); - textBox_MinIdleSeconds.Text = ConfigManager_rem.Instance.GeneralConfig.MinIdleSeconds.ToString(); + ConfigManager.GeneralConfig.MinIdleSeconds = Int32.Parse(textBox_MinIdleSeconds.Text); + textBox_MinIdleSeconds.Text = ConfigManager.GeneralConfig.MinIdleSeconds.ToString(); if (!ParseStringToInt64(ref textBox_LogMaxFileSize)) return; - ConfigManager_rem.Instance.GeneralConfig.LogMaxFileSize = Int64.Parse(textBox_LogMaxFileSize.Text); - textBox_LogMaxFileSize.Text = ConfigManager_rem.Instance.GeneralConfig.LogMaxFileSize.ToString(); + ConfigManager.GeneralConfig.LogMaxFileSize = Int64.Parse(textBox_LogMaxFileSize.Text); + textBox_LogMaxFileSize.Text = ConfigManager.GeneralConfig.LogMaxFileSize.ToString(); if (!ParseStringToInt32(ref textBox_ethminerDefaultBlockHeight)) return; - ConfigManager_rem.Instance.GeneralConfig.ethminerDefaultBlockHeight = Int32.Parse(textBox_ethminerDefaultBlockHeight.Text); - textBox_ethminerDefaultBlockHeight.Text = ConfigManager_rem.Instance.GeneralConfig.ethminerDefaultBlockHeight.ToString(); + ConfigManager.GeneralConfig.ethminerDefaultBlockHeight = Int32.Parse(textBox_ethminerDefaultBlockHeight.Text); + textBox_ethminerDefaultBlockHeight.Text = ConfigManager.GeneralConfig.ethminerDefaultBlockHeight.ToString(); if (!ParseStringToInt32(ref textBox_APIBindPortStart)) return; - ConfigManager_rem.Instance.GeneralConfig.ApiBindPortPoolStart = Int32.Parse(textBox_APIBindPortStart.Text); - textBox_APIBindPortStart.Text = ConfigManager_rem.Instance.GeneralConfig.ApiBindPortPoolStart.ToString(); + ConfigManager.GeneralConfig.ApiBindPortPoolStart = Int32.Parse(textBox_APIBindPortStart.Text); + textBox_APIBindPortStart.Text = ConfigManager.GeneralConfig.ApiBindPortPoolStart.ToString(); - ConfigManager_rem.Instance.GeneralConfig.MinimumProfit = Double.Parse(textBox_MinProfit.Text, CultureInfo.InvariantCulture); - textBox_MinProfit.Text = ConfigManager_rem.Instance.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma + ConfigManager.GeneralConfig.MinimumProfit = Double.Parse(textBox_MinProfit.Text, CultureInfo.InvariantCulture); + textBox_MinProfit.Text = ConfigManager.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma } private void GeneralComboBoxes_Leave(object sender, EventArgs e) { if (!_isInitFinished) return; IsChange = true; - ConfigManager_rem.Instance.GeneralConfig.Language = (LanguageType)comboBox_Language.SelectedIndex; - ConfigManager_rem.Instance.GeneralConfig.ServiceLocation = comboBox_ServiceLocation.SelectedIndex; - ConfigManager_rem.Instance.GeneralConfig.EthminerDagGenerationType = (DagGenerationType)comboBox_DagLoadMode.SelectedIndex; + ConfigManager.GeneralConfig.Language = (LanguageType)comboBox_Language.SelectedIndex; + ConfigManager.GeneralConfig.ServiceLocation = comboBox_ServiceLocation.SelectedIndex; + ConfigManager.GeneralConfig.EthminerDagGenerationType = (DagGenerationType)comboBox_DagLoadMode.SelectedIndex; } private void comboBox_CPU0_ForceCPUExtension_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cmbbox = (ComboBox)sender; - ConfigManager_rem.Instance.GeneralConfig.ForceCPUExtension = (CPUExtensionType)cmbbox.SelectedIndex; + ConfigManager.GeneralConfig.ForceCPUExtension = (CPUExtensionType)cmbbox.SelectedIndex; } #endregion //Tab General @@ -648,7 +646,7 @@ private void buttonSelectedProfit_Click(object sender, EventArgs e) { return; } var url = Links.NHM_Profit_Check + _selectedComputeDevice.Name; - foreach (var algorithm in _selectedComputeDevice.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + foreach (var algorithm in _selectedComputeDevice.AlgorithmSettings.Values) { var id = (int)algorithm.NiceHashID; url += "&speed" + id + "=" + ProfitabilityCalculator.GetFormatedSpeed(algorithm.BenchmarkSpeed, algorithm.NiceHashID).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); } @@ -662,7 +660,7 @@ private void buttonAllProfit_Click(object sender, EventArgs e) { Dictionary total = new Dictionary(); foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - foreach (var algorithm in curCDev.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + foreach (var algorithm in curCDev.AlgorithmSettings.Values) { if (total.ContainsKey(algorithm.NiceHashID)) { total[algorithm.NiceHashID] += algorithm.BenchmarkSpeed; } else { @@ -695,9 +693,9 @@ private void buttonDefaults_Click(object sender, EventArgs e) { if (result == System.Windows.Forms.DialogResult.Yes) { IsChange = true; IsChangeSaved = true; - ConfigManager_rem.Instance.GeneralConfig.SetDefaults(); + ConfigManager.GeneralConfig.SetDefaults(); - International.Initialize(ConfigManager_rem.Instance.GeneralConfig.Language); + International.Initialize(ConfigManager.GeneralConfig.Language); InitializeGeneralTabFieldValuesReferences(); InitializeGeneralTabTranslations(); } @@ -732,30 +730,22 @@ private void FormSettings_FormClosing(object sender, FormClosingEventArgs e) { } // check restart parameters change - IsRestartNeeded = ConfigManager_rem.Instance.GeneralConfig.DebugConsole != _generalConfigBackup.DebugConsole - || ConfigManager_rem.Instance.GeneralConfig.NVIDIAP0State != _generalConfigBackup.NVIDIAP0State - || ConfigManager_rem.Instance.GeneralConfig.LogToFile != _generalConfigBackup.LogToFile - || ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsFixed != _generalConfigBackup.SwitchMinSecondsFixed - || ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsAMD != _generalConfigBackup.SwitchMinSecondsAMD - || ConfigManager_rem.Instance.GeneralConfig.SwitchMinSecondsDynamic != _generalConfigBackup.SwitchMinSecondsDynamic - || ConfigManager_rem.Instance.GeneralConfig.MinerAPIQueryInterval != _generalConfigBackup.MinerAPIQueryInterval; + IsRestartNeeded = ConfigManager.IsRestartNeeded(); if (IsChangeSaved) { devicesListViewEnableControl1.SaveOptions(); - ConfigManager_rem.Instance.GeneralConfig.Commit(); - ConfigManager_rem.Instance.CommitBenchmarks(); - International.Initialize(ConfigManager_rem.Instance.GeneralConfig.Language); + ConfigManager.GeneralConfigFileCommit(); + ConfigManager.CommitBenchmarks(); + International.Initialize(ConfigManager.GeneralConfig.Language); } else if (IsChange) { - ConfigManager_rem.Instance.GeneralConfig = _generalConfigBackup; - ConfigManager_rem.Instance.BenchmarkConfigs = _benchmarkConfigsBackup; - ConfigManager_rem.Instance.SetDeviceBenchmarkReferences(); + ConfigManager.RestoreBackup(); } } private void currencyConverterCombobox_SelectedIndexChanged(object sender, EventArgs e) { //Helpers.ConsolePrint("CurrencyConverter", "Currency Set to: " + currencyConverterCombobox.SelectedItem); var Selected = currencyConverterCombobox.SelectedItem.ToString(); - ConfigManager_rem.Instance.GeneralConfig.DisplayCurrency = Selected; + ConfigManager.GeneralConfig.DisplayCurrency = Selected; } #endregion Form Callbacks @@ -777,9 +767,9 @@ private void checkBox_Use3rdPartyMiners_CheckedChanged(object sender, EventArgs // Show TOS Form tos = new Form_ClaymoreTOS(); tos.ShowDialog(this); - this.checkBox_Use3rdPartyMiners.Checked = ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; + this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; } else { - ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; } } diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index 5aa3d0d..b85af0f 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -43,7 +43,7 @@ public static void ConsolePrint(string grp, string text) { Console.WriteLine("[" +DateTime.Now.ToLongTimeString() + "] [" + grp + "] " + text); - if (ConfigManager_rem.Instance.GeneralConfig.LogToFile) + if (ConfigManager.GeneralConfig.LogToFile) Logger.log.Info("[" + grp + "] " + text); } diff --git a/NiceHashMiner/Interfaces/IPathsProperties.cs b/NiceHashMiner/Interfaces/IPathsProperties.cs deleted file mode 100644 index 3e689f0..0000000 --- a/NiceHashMiner/Interfaces/IPathsProperties.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NiceHashMiner.Interfaces { - // TODO remove - public interface IPathsProperties { - string FilePath { get; set; } - string FilePathOld { get; set; } - } -} diff --git a/NiceHashMiner/Logger.cs b/NiceHashMiner/Logger.cs index 844a93b..1085f9c 100644 --- a/NiceHashMiner/Logger.cs +++ b/NiceHashMiner/Logger.cs @@ -27,7 +27,7 @@ public static void ConfigureWithFile() Hierarchy h = (Hierarchy)LogManager.GetRepository(); - if (ConfigManager_rem.Instance.GeneralConfig.LogToFile) + if (ConfigManager.GeneralConfig.LogToFile) h.Root.Level = Level.Info; //else if (ConfigManager.Instance.GeneralConfig.LogLevel == 2) // h.Root.Level = Level.Warn; @@ -46,7 +46,7 @@ public static IAppender CreateFileAppender() appender.AppendToFile = true; appender.RollingStyle = RollingFileAppender.RollingMode.Size; appender.MaxSizeRollBackups = 1; - appender.MaxFileSize = ConfigManager_rem.Instance.GeneralConfig.LogMaxFileSize; + appender.MaxFileSize = ConfigManager.GeneralConfig.LogMaxFileSize; appender.PreserveLogFileNameExtension = true; appender.Encoding = System.Text.Encoding.Unicode; diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index db09769..655ef78 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -139,7 +139,7 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { } protected override void BenchmarkThreadRoutine(object CommandLine) { - Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); + Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); BenchmarkSignalQuit = false; BenchmarkSignalHanged = false; diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index 602b258..16b737e 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -17,10 +17,6 @@ public class GroupMiner { public double CurrentRate { get; set; } public string Key { get; private set; } - //private string _miningLocation = ""; - //private string _btcAdress = ""; - //private string _worker = ""; - // , string miningLocation, string btcAdress, string worker public GroupMiner(List miningPairs, string key) { AlgorithmType = AlgorithmType.NONE; @@ -56,7 +52,7 @@ public void Stop() { if (Miner != null && Miner.IsRunning) { Miner.Stop(MinerStopType.SWITCH); // wait before going on - System.Threading.Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); + System.Threading.Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); } CurrentRate = 0; } @@ -73,7 +69,7 @@ public void Start(string miningLocation, string btcAdress, string worker) { return; } // Wait before new start - System.Threading.Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); + System.Threading.Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); string name = Globals.NiceHashData[AlgorithmType].name; int port = Globals.NiceHashData[AlgorithmType].port; diff --git a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs index 162edc9..7bd878b 100644 --- a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs +++ b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs @@ -24,7 +24,7 @@ public static Tuple getDeviceMiningStatus(Com status = DeviceMiningStatus.Disabled; } else { bool hasEnabledAlgo = false; - foreach (Algorithm algo in device.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + foreach (Algorithm algo in device.AlgorithmSettings.Values) { hasEnabledAlgo |= IsAlgoMiningCapable(algo) && IsValidMinerPath(device, algo); } if (hasEnabledAlgo == false) { @@ -79,7 +79,7 @@ private static void LogMiningNonMiningStatuses(List enabledDevices foreach (var miningDevice in enabledDevices) { var device = miningDevice.Device; stringBuilder.AppendLine(String.Format("\tENABLED ({0})", device.GetFullName())); - foreach (var algo in device.DeviceBenchmarkConfig.AlgorithmSettings.Values) { + foreach (var algo in device.AlgorithmSettings.Values) { var isEnabled = IsAlgoMiningCapable(algo) && IsValidMinerPath(device, algo); stringBuilder.AppendLine(String.Format("\t\tALGORITHM {0} ({1})", isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index aa214d1..0ecf402 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -89,7 +89,7 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy if (deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; - } else if(deviceType == DeviceType.AMD && ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state + } else if(deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state return MinerPaths.ClaymoreZcashMiner; } else { // supports all DeviceTypes diff --git a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs index 913da9f..0aae4d3 100644 --- a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs +++ b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs @@ -8,12 +8,12 @@ namespace NiceHashMiner.Miners.Grouping { public class MiningAlgorithm { public MiningAlgorithm(ComputeDevice dev, Algorithm algo) { - this.algoRef = algo; + this.AlgoRef = algo; // init speed that will be avaraged later this.AvaragedSpeed = algo.BenchmarkSpeed; this.MinerPath = MinerPaths.GetOptimizedMinerPath(dev, algo); } - public Algorithm algoRef { get; private set; } + public Algorithm AlgoRef { get; private set; } public string MinerPath { get; private set; } // avarage speed of same devices to increase mining stability public double AvaragedSpeed = 0; diff --git a/NiceHashMiner/Miners/Grouping/MiningDevice.cs b/NiceHashMiner/Miners/Grouping/MiningDevice.cs index ad50d94..26599e5 100644 --- a/NiceHashMiner/Miners/Grouping/MiningDevice.cs +++ b/NiceHashMiner/Miners/Grouping/MiningDevice.cs @@ -49,14 +49,13 @@ public static void SetNextTest() { public MiningDevice(ComputeDevice device) { Device = device; - foreach (var kvp in Device.DeviceBenchmarkConfig.AlgorithmSettings) { + foreach (var kvp in Device.AlgorithmSettings) { AlgorithmType key = kvp.Key; Algorithm algo = kvp.Value; bool isAlgoMiningCapable = GroupSetupUtils.IsAlgoMiningCapable(algo); bool isValidMinerPath = GroupSetupUtils.IsValidMinerPath(device, algo); if (isAlgoMiningCapable && isValidMinerPath) { - var newMiningAlgo = new MiningAlgorithm(device, algo); - Algorithms[key] = newMiningAlgo; + Algorithms[key] = new MiningAlgorithm(device, algo); } } } @@ -75,7 +74,7 @@ public double GetCurrentMostProfitValue { } public MiningPair GetMostProfitablePair() { - return new MiningPair(this.Device, Algorithms[MostProfitableKey].algoRef); + return new MiningPair(this.Device, Algorithms[MostProfitableKey].AlgoRef); } public bool HasProfitableAlgo() { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 3cd1a84..9a71503 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -406,13 +406,13 @@ virtual public void EndBenchmarkProcces() { if (BenchmarkHandle != null && BenchmarkProcessStatus != BenchmarkProcessStatus.Killing && BenchmarkProcessStatus != BenchmarkProcessStatus.DoneKilling) { BenchmarkProcessStatus = BenchmarkProcessStatus.Killing; try { - Helpers.ConsolePrint("BENCHMARK", String.Format("Trying to kill benchmark process {0} algorithm {1}", BenchmarkProcessPath, BenchmarkAlgorithm.NiceHashName)); + Helpers.ConsolePrint("BENCHMARK", String.Format("Trying to kill benchmark process {0} algorithm {1}", BenchmarkProcessPath, BenchmarkAlgorithm.GetName())); BenchmarkHandle.Kill(); BenchmarkHandle.Close(); } catch { } finally { BenchmarkProcessStatus = BenchmarkProcessStatus.DoneKilling; - Helpers.ConsolePrint("BENCHMARK", String.Format("Benchmark process {0} algorithm {1} KILLED", BenchmarkProcessPath, BenchmarkAlgorithm.NiceHashName)); + Helpers.ConsolePrint("BENCHMARK", String.Format("Benchmark process {0} algorithm {1} KILLED", BenchmarkProcessPath, BenchmarkAlgorithm.GetName())); //BenchmarkHandle = null; } } @@ -425,7 +425,7 @@ virtual protected void BenchmarkThreadRoutineStartSettup() { } virtual protected void BenchmarkThreadRoutine(object CommandLine) { - Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); + Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); BenchmarkSignalQuit = false; BenchmarkSignalHanged = false; @@ -498,7 +498,7 @@ virtual protected NiceHashProcess _Start() P.StartInfo.Arguments = LastCommandLine; if (Path != MinerPaths.eqm) { - P.StartInfo.CreateNoWindow = ConfigManager_rem.Instance.GeneralConfig.HideMiningWindows; + P.StartInfo.CreateNoWindow = ConfigManager.GeneralConfig.HideMiningWindows; } else { P.StartInfo.CreateNoWindow = false; } @@ -550,8 +550,8 @@ protected void StartCoolDownTimerChecker() { virtual protected void Miner_Exited() { // TODO make miner restart in 5 seconds //Stop(MinerStopType.END, true); - var RestartInMS = ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS > 5000 ? - ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS : 5000; + var RestartInMS = ConfigManager.GeneralConfig.MinerRestartDelayMS > 5000 ? + ConfigManager.GeneralConfig.MinerRestartDelayMS : 5000; Helpers.ConsolePrint(MinerTAG(), ProcessTag() + String.Format(" Miner_Exited Will restart in {0} ms", RestartInMS)); _currentMinerReadStatus = MinerAPIReadStatus.RESTART; NeedsRestart = true; @@ -577,7 +577,7 @@ private void Restart() { if (!isEnded) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Restarting miner.."); Stop(MinerStopType.END); // stop miner first - System.Threading.Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); + System.Threading.Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); ProcessHandle = _Start(); // start with old command line } } diff --git a/NiceHashMiner/Miners/MinersApiPortsManager.cs b/NiceHashMiner/Miners/MinersApiPortsManager.cs index a1643f6..bfcb2b2 100644 --- a/NiceHashMiner/Miners/MinersApiPortsManager.cs +++ b/NiceHashMiner/Miners/MinersApiPortsManager.cs @@ -43,7 +43,7 @@ private bool IsPortAvaliable(int port) { } public int GetAvaliablePort() { - int port = ConfigManager_rem.Instance.GeneralConfig.ApiBindPortPoolStart; + int port = ConfigManager.GeneralConfig.ApiBindPortPoolStart; int newPortEnd = port + 3000; for (; port < newPortEnd; ++port) { if (IsPortAvaliable(port) && _usedPorts.Add(port)) { diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index c0e16a4..0a82587 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -11,8 +11,6 @@ using NiceHashMiner.Enums; namespace NiceHashMiner.Miners { - // typedefs - using GroupedDevices = SortedSet; using NiceHashMiner.Miners.Grouping; public class MinersManager : BaseLazySingleton { @@ -40,7 +38,7 @@ public static bool EquihashCPU_USE_eqm() { || mostOptimized == CPUExtensionType.AVX_AES || mostOptimized == CPUExtensionType.AVX2_AES; } - // create miner creates new miners, except cpuminer, those are saves and called from GetCpuMiner() + // create miner creates new miners based on device type and algorithm/miner path public static Miner CreateMiner(ComputeDevice device, Algorithm algorithm) { var minerPath = MinerPaths.GetOptimizedMinerPath(device, algorithm); if (minerPath != MinerPaths.NONE) { @@ -55,10 +53,10 @@ public static Miner CreateMiner(DeviceType deviceType, string minerPath) { } else if (minerPath == MinerPaths.nheqminer) { return new nheqminer(); } else if ( - ConfigManager_rem.Instance.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES + ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES && minerPath == MinerPaths.ClaymoreZcashMiner && DeviceType.AMD == deviceType) { return new ClaymoreZcashMiner(); - } else if (minerPath.Contains("ethminer") && DeviceType.CPU != deviceType) { + } else if (minerPath == MinerPaths.ethminer && DeviceType.CPU != deviceType) { if (DeviceType.AMD == deviceType) { return new MinerEtherumOCL(); } else { diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 9d34630..11cd55e 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -7,14 +7,14 @@ using System.Text; using System.Threading.Tasks; using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Configs; +using System.IO; using Timer = System.Timers.Timer; using System.Timers; namespace NiceHashMiner.Miners { using GroupedDevices = SortedSet; - using NiceHashMiner.Configs; - using System.IO; public class MiningSession { const string TAG = "MiningSession"; const string DOUBLE_FORMAT = "F12"; @@ -103,12 +103,12 @@ public MiningSession(List devices, _miningStatusCheckTimer.Start(); } - IsMiningRegardlesOfProfit = ConfigManager_rem.Instance.GeneralConfig.MinimumProfit == 0; + IsMiningRegardlesOfProfit = ConfigManager.GeneralConfig.MinimumProfit == 0; } #region Timers stuff private void InternetCheckTimer_Tick(object sender, EventArgs e) { - if (ConfigManager_rem.Instance.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { + if (ConfigManager.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { IsConnectedToInternet = Helpers.IsConnectedToInternet(); } } @@ -225,13 +225,13 @@ private bool CheckIfProfitable(double CurrentProfit, bool log = true) { var currentProfitUSD = (CurrentProfit * Globals.BitcoinRate); IsProfitable = IsMiningRegardlesOfProfit - || !IsMiningRegardlesOfProfit && currentProfitUSD >= ConfigManager_rem.Instance.GeneralConfig.MinimumProfit; + || !IsMiningRegardlesOfProfit && currentProfitUSD >= ConfigManager.GeneralConfig.MinimumProfit; if (log) { Helpers.ConsolePrint(TAG, "Current Global profit: " + currentProfitUSD.ToString("F8") + " USD/Day"); if (!IsProfitable) { - Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager_rem.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); + Helpers.ConsolePrint(TAG, "Current Global profit: NOT PROFITABLE MinProfit " + ConfigManager.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"); } else { - string profitabilityInfo = IsMiningRegardlesOfProfit ? "mine always regardless of profit" : ConfigManager_rem.Instance.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"; + string profitabilityInfo = IsMiningRegardlesOfProfit ? "mine always regardless of profit" : ConfigManager.GeneralConfig.MinimumProfit.ToString("F8") + " USD/Day"; Helpers.ConsolePrint(TAG, "Current Global profit: IS PROFITABLE MinProfit " + profitabilityInfo); } } @@ -451,5 +451,6 @@ public void MinerStatsCheck(Dictionary NiceHashData) } } } + } } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 8015e39..9830a8e 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -292,7 +292,7 @@ public static string ParseForMiningPair(MiningPair miningPair, AlgorithmType alg MinerPaths.GetOptimizedMinerPath(miningPair), showLog); } - private static string ParseForMiningPairs(List MiningPairs, AlgorithmType algorithmType, DeviceType deviceType, string minerPath = "", bool showLog = true) { + private static string ParseForMiningPairs(List MiningPairs, AlgorithmType algorithmType, DeviceType deviceType, string minerPath, bool showLog = true) { _showLog = showLog; // parse for nheqminer @@ -330,7 +330,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith var fakeAlgo = new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto"); foreach (var pair in MiningPairs) { while (++id != pair.Device.ID) { - var fakeCdev = new ComputeDevice(id, "", ""); + var fakeCdev = new ComputeDevice(id); cdevs_mappings.Add(new MiningPair(fakeCdev, fakeAlgo)); } cdevs_mappings.Add(pair); @@ -400,7 +400,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith List sgminerOptionsNew = new List(); string temperatureControl = ""; // temp control and parse - if (ConfigManager_rem.Instance.GeneralConfig.DisableAMDTempControl) { + if (ConfigManager.GeneralConfig.DisableAMDTempControl) { LogParser("DisableAMDTempControl is TRUE, temp control parameters will be ignored"); } else { LogParser("Sgminer parsing temperature control parameters"); diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index ce3f7b9..ab87be4 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -168,7 +168,7 @@ public override APIData GetSummary() { var totalSpeed = 0.0d; foreach (var miningPair in MiningSetup.MiningPairs) { - totalSpeed += miningPair.Device.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.CryptoNight].BenchmarkSpeed; + totalSpeed += miningPair.Device.AlgorithmSettings[AlgorithmType.CryptoNight].BenchmarkSpeed; } APIData CryptoNightData = new APIData(MiningSetup.CurrentAlgorithmType); diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index c27d81d..c7e3760 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -30,7 +30,7 @@ public MinerEtherum(string minerDeviceName, string blockString) Path = Ethereum.EtherMinerPath; _isEthMinerExit = true; CurrentBlockString = blockString; - DagGenerationType = ConfigManager_rem.Instance.GeneralConfig.EthminerDagGenerationType; + DagGenerationType = ConfigManager.GeneralConfig.EthminerDagGenerationType; } protected override int GET_MAX_CooldownTimeInMilliseconds() { @@ -81,7 +81,7 @@ public void Start(string url, string btcAdress, string worker, List 0) - username += "." + ConfigManager_rem.Instance.GeneralConfig.WorkerName.Trim(); + if (ConfigManager.GeneralConfig.WorkerName.Length > 0) + username += "." + ConfigManager.GeneralConfig.WorkerName.Trim(); // cd to the cgminer for the process bins CommandLine = " /C \"cd /d " + MinerPath.Replace("sgminer.exe", "") + " && sgminer.exe " + @@ -177,7 +177,7 @@ protected override void BenchmarkThreadRoutineStartSettup() { if (Globals.NiceHashData[NHDataIndex].paying == 0) { Helpers.ConsolePrint("BENCHMARK", "Skipping sgminer benchmark because there is no work on Nicehash.com " + - "[algo: " + BenchmarkAlgorithm.NiceHashName + "(" + NHDataIndex + ")]"); + "[algo: " + BenchmarkAlgorithm.GetName() + "(" + NHDataIndex + ")]"); throw new Exception("No work can be used for benchmarking"); } @@ -206,7 +206,7 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { } protected override void BenchmarkThreadRoutine(object CommandLine) { - Thread.Sleep(ConfigManager_rem.Instance.GeneralConfig.MinerRestartDelayMS); + Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); BenchmarkSignalQuit = false; BenchmarkSignalHanged = false; diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index abed2ae..d293f04 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -84,15 +84,10 @@ - - - - - @@ -166,11 +161,11 @@ Form_Benchmark.cs - + Form - - Form_ChooseLanguage_r.cs + + Form_ChooseLanguage.cs Form @@ -191,7 +186,6 @@ - @@ -289,8 +283,8 @@ Form_Benchmark.cs - - Form_ChooseLanguage_r.cs + + Form_ChooseLanguage.cs Form_ClaymoreTOS.cs diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index 13e4c29..0347005 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -32,13 +32,13 @@ static void Main(string[] argv) }; // #1 first initialize config - ConfigManager_rem.Instance.GeneralConfig.InitializeConfig(); + ConfigManager.InitializeConfig(); - if (ConfigManager_rem.Instance.GeneralConfig.LogToFile) { + if (ConfigManager.GeneralConfig.LogToFile) { Logger.ConfigureWithFile(); } - if (ConfigManager_rem.Instance.GeneralConfig.DebugConsole) { + if (ConfigManager.GeneralConfig.DebugConsole) { Helpers.AllocConsole(); } @@ -47,20 +47,19 @@ static void Main(string[] argv) Helpers.ConsolePrint("NICEHASH", "Starting up NiceHashMiner v" + Application.ProductVersion); - if (!ConfigManager_rem.Instance.GeneralConfig.IsFileExist() && !commandLineArgs.IsLang) + if (!ConfigManager.GeneralConfigIsFileExist() && !commandLineArgs.IsLang) { Helpers.ConsolePrint("NICEHASH", "No config file found. Running NiceHash Miner for the first time. Choosing a default language."); - //Application.Run(new Form_ChooseLanguage()); - Application.Run(new Form_ChooseLanguage_r()); + Application.Run(new Form_ChooseLanguage()); } // Init languages - International.Initialize(ConfigManager_rem.Instance.GeneralConfig.Language); + International.Initialize(ConfigManager.GeneralConfig.Language); if (commandLineArgs.IsLang) { Helpers.ConsolePrint("NICEHASH", "Language is overwritten by command line parameter (-lang)."); International.Initialize(commandLineArgs.LangValue); - ConfigManager_rem.Instance.GeneralConfig.Language = commandLineArgs.LangValue; + ConfigManager.GeneralConfig.Language = commandLineArgs.LangValue; } Application.Run(new Form_Main()); From 15e51f1970026b05bd077ece73993a01c88cae6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 27 Nov 2016 21:14:21 +0100 Subject: [PATCH 131/366] fixes, cleanup --- NiceHashMiner/Algorithm.cs | 4 - NiceHashMiner/Configs/ConfigManager.cs | 19 ++- NiceHashMiner/Devices/ComputeDevice.cs | 17 +- .../Components/AlgorithmSettingsControl.cs | 62 ------- .../DevicesListViewEnableControl.cs | 97 ++--------- .../Forms/Form_Benchmark.Designer.cs | 2 - NiceHashMiner/Forms/Form_Benchmark.cs | 70 ++++---- NiceHashMiner/Forms/Form_Loading.cs | 10 +- NiceHashMiner/Forms/Form_Main.Designer.cs | 2 - NiceHashMiner/Forms/Form_Main.cs | 8 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 2 - NiceHashMiner/Forms/Form_Settings.cs | 157 ++++++------------ NiceHashMiner/Helpers.cs | 23 +++ 13 files changed, 148 insertions(+), 325 deletions(-) diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index d6c8928..adca89c 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -33,11 +33,8 @@ public string GetName() { } // benchmark info - [JsonIgnore] public string BenchmarkStatus { get; set; } - [JsonIgnore] public bool IsBenchmarkPending { get; private set; } - [JsonIgnore] public string CurPayingRatio { get { string ratio = International.GetText("BenchmarkRatioRateN_A"); @@ -47,7 +44,6 @@ public string CurPayingRatio { return ratio; } } - [JsonIgnore] public string CurPayingRate { get { string rate = International.GetText("BenchmarkRatioRateN_A"); diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index 8811f66..bb583e5 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -43,12 +43,13 @@ public static void InitializeConfig() { ConfigManager.GeneralConfig = fromFile; if (ConfigManager.GeneralConfig.ConfigFileVersion == null || ConfigManager.GeneralConfig.ConfigFileVersion.CompareTo(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) != 0) { + if (ConfigManager.GeneralConfig.ConfigFileVersion == null) { + Helpers.ConsolePrint(TAG, "Loaded Config file no version detected falling back to defaults."); + ConfigManager.GeneralConfig.SetDefaults(); + } Helpers.ConsolePrint(TAG, "Config file is from an older version of NiceHashMiner.."); IsNewVersion = true; GeneralConfigFile.CreateBackup(); - } else { - Helpers.ConsolePrint(TAG, "Loaded Config file no version detected falling back to defaults."); - ConfigManager.GeneralConfig.SetDefaults(); } ConfigManager.GeneralConfig.FixSettingBounds(); // check vars @@ -80,10 +81,18 @@ public static void CreateBackup() { } public static void RestoreBackup() { + // restore general GeneralConfig = GeneralConfigBackup; - BenchmarkConfigsBackup = new Dictionary(); + if (GeneralConfig.LastDevicesSettup != null) { + foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + foreach (var conf in GeneralConfig.LastDevicesSettup) { + CDev.SetFromComputeDeviceConfig(conf); + } + } + } + // restore benchmarks foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (BenchmarkConfigsBackup.ContainsKey(CDev.UUID)) { + if (BenchmarkConfigsBackup != null && BenchmarkConfigsBackup.ContainsKey(CDev.UUID)) { CDev.SetAlgorithmDeviceConfig(BenchmarkConfigsBackup[CDev.UUID]); } } diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 3c73a0b..2b044d9 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -18,20 +18,19 @@ public class ComputeDevice readonly public string NameCount; public bool Enabled; - public readonly bool IsEtherumCapale; readonly public DeviceGroupType DeviceGroupType; + // CPU, NVIDIA, AMD + readonly public DeviceType DeviceType; // UUID now used for saving readonly public string UUID; + // CPU extras readonly public int Threads; readonly public ulong AffinityMask; - // CPU, NVIDIA, AMD - public DeviceType DeviceType { get; private set; } - - public string BenchmarkCopyUUID { get; set; } - + // GPU extras + public readonly bool IsEtherumCapale; public static readonly ulong MEMORY_2GB = 2147483648; //CudaDevice _cudaDevice = null; @@ -43,7 +42,7 @@ public class ComputeDevice //public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } public Dictionary AlgorithmSettings { get; set; } - public NiceHashMiner.Forms.Components.DevicesListViewEnableControl.ComputeDeviceEnabledOption ComputeDeviceEnabledOption { get; set; } + public string BenchmarkCopyUUID { get; set; } // Fake dev public ComputeDevice(int id) { @@ -111,6 +110,7 @@ public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { } } + #region Config Setters/Getters // settings // setters public void SetFromComputeDeviceConfig(ComputeDeviceConfig config) { @@ -160,7 +160,8 @@ public DeviceBenchmarkConfig GetAlgorithmDeviceConfig() { } return ret; } - + #endregion Config Setters/Getters + // static methods private static string GetUUID(int id, string group, string name, DeviceGroupType deviceGroupType) { diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index 7076f03..ea8b793 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -21,11 +21,8 @@ public partial class AlgorithmSettingsControl : UserControl, AlgorithmsListView. public AlgorithmSettingsControl() { InitializeComponent(); fieldBoxBenchmarkSpeed.SetInputModeDoubleOnly(); - //fieldIntensity.SetInputModeDoubleOnly(); field_LessThreads.SetInputModeIntOnly(); - // TODO make sure intensity accepts valid ints based on Device and algo, miner... - //fieldIntensity.SetOnTextLeave(textLeaveIntensity); field_LessThreads.SetOnTextLeave(LessThreads_Leave); fieldBoxBenchmarkSpeed.SetOnTextChanged(textChangedBenchmarkSpeed); richTextBoxExtraLaunchParameters.TextChanged += textChangedExtraLaunchParameters; @@ -38,7 +35,6 @@ public void Deselect() { International.GetText("AlgorithmsListView_GroupBox_NONE")); Enabled = false; fieldBoxBenchmarkSpeed.EntryText = ""; - //fieldIntensity.EntryText = ""; field_LessThreads.EntryText = ""; richTextBoxExtraLaunchParameters.Text = ""; } @@ -47,9 +43,6 @@ public void InitLocale(ToolTip toolTip1) { field_LessThreads.InitLocale(toolTip1, International.GetText("Form_Settings_General_CPU_LessThreads") + ":", International.GetText("Form_Settings_ToolTip_CPU_LessThreads")); - //fieldIntensity.InitLocale(toolTip1, - // International.GetText("AlgorithmSettingsControl_Label_Intensity") + ":", - // International.GetText("AlgorithmSettingsControl_ToolTip_Intensity")); fieldBoxBenchmarkSpeed.InitLocale(toolTip1, International.GetText("Form_Settings_Algo_BenchmarkSpeed") + ":", International.GetText("Form_Settings_ToolTip_AlgoBenchmarkSpeed")); @@ -81,23 +74,6 @@ public void SetCurrentlySelected(ListViewItem lvi, ComputeDevice computeDevice) groupBoxSelectedAlgorithmSettings.Text = String.Format(International.GetText("AlgorithmsListView_GroupBox"), algorithm.GetName()); ; - - //// no intensity for cpu miners and ccminer_cryptonight - //fieldIntensity.Enabled = !( - // _computeDevice.DeviceGroupType == DeviceGroupType.CPU - // || _computeDevice.DeviceGroupType == DeviceGroupType.AMD_OpenCL - // || _currentlySelectedAlgorithm.NiceHashID == AlgorithmType.CryptoNight - // || _currentlySelectedAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto); - //if (fieldIntensity.Enabled) { - // if (algorithm.Intensity == 0) { - // fieldIntensity.EntryText = "0"; - // } else { - // fieldIntensity.EntryText = algorithm.Intensity.ToString("F8"); - // } - //} else { - // fieldIntensity.EntryText = ""; - //} - field_LessThreads.Enabled = _computeDevice.DeviceGroupType == DeviceGroupType.CPU; if (field_LessThreads.Enabled) { field_LessThreads.EntryText = algorithm.LessThreads.ToString(); @@ -121,34 +97,6 @@ private bool CanEdit() { } #region Callbacks Events - // TODO Intensity - //private void textLeaveIntensity(object sender, EventArgs e) { - // if (!CanEdit()) return; - // var deviceType = _computeDevice.DeviceGroupType; - // var minerPath = MinersManager.Instance.MinerPathChecker[deviceType].GetOptimizedMinerPath(_currentlySelectedAlgorithm.NiceHashID); - // if (MinersManager.Instance.CCMinersIntensitiesBoundries.ContainsKey(minerPath)) { - // double min = MinersManager.Instance.CCMinersIntensitiesBoundries[minerPath].Item1; - // double max = MinersManager.Instance.CCMinersIntensitiesBoundries[minerPath].Item2; - // // parse - // double value; - // if (Double.TryParse(fieldIntensity.EntryText, out value)) { - // if (min <= value && value <= max) { - // _currentlySelectedAlgorithm.Intensity = value; - // } else if (value != 0) { - // _currentlySelectedAlgorithm.Intensity = 0; - // MessageBox.Show( - // String.Format(International.GetText("AlgorithmSettingsControl_IntensityWaringn"), - // min.ToString("F2"), - // max.ToString("F2")), - // International.GetText("Warning_with_Exclamation"), - // MessageBoxButtons.OK, MessageBoxIcon.Warning); - // } - // } else { - // _currentlySelectedAlgorithm.Intensity = 0; - // } - // //_currentlySelectedAlgorithm.Intensity = fieldIntensity.EntryText.Trim(); - // } - //} private void textChangedBenchmarkSpeed(object sender, EventArgs e) { if (!CanEdit()) return; double value; @@ -187,16 +135,6 @@ private void textChangedExtraLaunchParameters(object sender, EventArgs e) { var ExtraLaunchParams = richTextBoxExtraLaunchParameters.Text.Replace("\r\n", " "); ExtraLaunchParams = ExtraLaunchParams.Replace("\n", " "); _currentlySelectedAlgorithm.ExtraLaunchParameters = ExtraLaunchParams; - //// if dagger copy for all devices group CUDA or AMD - //if (_currentlySelectedAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto) { - // foreach (var cDev in ComputeDevice.AllAvaliableDevices) { - // if (_computeDevice.DeviceType == cDev.DeviceType) { - // if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(AlgorithmType.DaggerHashimoto)) { - // cDev.DeviceBenchmarkConfig.AlgorithmSettings[AlgorithmType.DaggerHashimoto].ExtraLaunchParameters = ExtraLaunchParams; - // } - // } - // } - //} } #endregion diff --git a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs index 7590c07..cc929d1 100644 --- a/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs +++ b/NiceHashMiner/Forms/Components/DevicesListViewEnableControl.cs @@ -19,9 +19,9 @@ private class DefaultDevicesColorSeter : IListItemCheckColorSetter { private static Color ENABLED_COLOR = Color.White; private static Color DISABLED_COLOR = Color.DarkGray; public void LviSetColor(ListViewItem lvi) { - ComputeDeviceEnabledOption cdvo = lvi.Tag as ComputeDeviceEnabledOption; + var cdvo = lvi.Tag as ComputeDevice; if (cdvo != null) { - if(cdvo.IsEnabled) { + if(cdvo.Enabled) { lvi.BackColor = ENABLED_COLOR; } else { lvi.BackColor = DISABLED_COLOR; @@ -68,34 +68,18 @@ public bool IsMining { public bool IsBenchmarkForm = false; public bool IsSettingsCopyEnabled = false; - [Serializable] - public class ComputeDeviceEnabledOption { - public bool IsEnabled { get; set; } - public ComputeDevice CDevice { get; set; } - public void SaveOption() { - CDevice.Enabled = IsEnabled; - } - } - public string FirstColumnText { get { return listViewDevices.Columns[ENABLED].Text; } set { if (value != null) listViewDevices.Columns[ENABLED].Text = value; } } - public List Options { get; private set; } - // to automatically save on enabled click or not - public bool AutoSaveChange { get; set; } public bool SaveToGeneralConfig { get; set; } - public bool SetAllEnabled { get; set; } public DevicesListViewEnableControl() { InitializeComponent(); - AutoSaveChange = false; SaveToGeneralConfig = false; - SetAllEnabled = false; - Options = new List(); // intialize ListView callbacks listViewDevices.ItemChecked += new ItemCheckedEventHandler(listViewDevicesItemChecked); //listViewDevices.CheckBoxes = false; @@ -121,9 +105,7 @@ public void ResetListItemColors() { public void SetComputeDevices(List computeDevices) { // to not run callbacks when setting new - bool tmp_AutoSaveChange = AutoSaveChange; bool tmp_SaveToGeneralConfig = SaveToGeneralConfig; - AutoSaveChange = false; SaveToGeneralConfig = false; listViewDevices.BeginUpdate(); listViewDevices.Items.Clear(); @@ -131,27 +113,19 @@ public void SetComputeDevices(List computeDevices) { foreach (var computeDevice in computeDevices) { ListViewItem lvi = new ListViewItem(); //lvi.SubItems.Add(computeDevice.Name); - lvi.Checked = computeDevice.Enabled || SetAllEnabled; + lvi.Checked = computeDevice.Enabled; lvi.Text = computeDevice.GetFullName(); - ComputeDeviceEnabledOption newTag = new ComputeDeviceEnabledOption() { - IsEnabled = computeDevice.Enabled || SetAllEnabled, - CDevice = computeDevice - }; - computeDevice.ComputeDeviceEnabledOption = newTag; - Options.Add(newTag); - lvi.Tag = newTag; + lvi.Tag = computeDevice; listViewDevices.Items.Add(lvi); _listItemCheckColorSetter.LviSetColor(lvi); } listViewDevices.EndUpdate(); listViewDevices.Invalidate(true); // reset properties - AutoSaveChange = tmp_AutoSaveChange; SaveToGeneralConfig = tmp_SaveToGeneralConfig; } public void ResetComputeDevices(List computeDevices) { - Options.Clear(); SetComputeDevices(computeDevices); } @@ -161,26 +135,18 @@ public void InitLocale() { } private void listViewDevicesItemChecked(object sender, ItemCheckedEventArgs e) { - ComputeDeviceEnabledOption G = e.Item.Tag as ComputeDeviceEnabledOption; - G.IsEnabled = e.Item.Checked; - if (AutoSaveChange) { - G.SaveOption(); - } + var CDevice = e.Item.Tag as ComputeDevice; + CDevice.Enabled = e.Item.Checked; + if (SaveToGeneralConfig) { ConfigManager.GeneralConfigFileCommit(); } var lvi = e.Item as ListViewItem; if (lvi != null) _listItemCheckColorSetter.LviSetColor(lvi); - if (_algorithmsListView != null) _algorithmsListView.RepaintStatus(G.IsEnabled, G.CDevice.UUID); + if (_algorithmsListView != null) _algorithmsListView.RepaintStatus(CDevice.Enabled, CDevice.UUID); if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); } - public void SaveOptions() { - foreach (var option in Options) { - option.SaveOption(); - } - } - public void SetDeviceSelectionChangedCallback(ListViewItemSelectionChangedEventHandler callback) { listViewDevices.ItemSelectionChanged += callback; } @@ -191,30 +157,17 @@ private void listViewDevices_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { if (listViewDevices.FocusedItem.Bounds.Contains(e.Location) == true) { contextMenuStrip1.Items.Clear(); - ComputeDeviceEnabledOption G = listViewDevices.FocusedItem.Tag as ComputeDeviceEnabledOption; - //if (G.IsEnabled) { - // var disableItem = new ToolStripMenuItem(); - // disableItem.Text = International.GetText("DeviceListView_ContextMenu_DisableDevice"); - // //disableItem.Checked = true; - // disableItem.Click += toolStripMenuItemEnable_Click; - // contextMenuStrip1.Items.Add(disableItem); - //} else { - // var disableItem = new ToolStripMenuItem(); - // disableItem.Text = International.GetText("DeviceListView_ContextMenu_EnableDevice"); - // //disableItem.Checked = false; - // disableItem.Click += toolStripMenuItemEnable_Click; - // contextMenuStrip1.Items.Add(disableItem); - //} if (IsSettingsCopyEnabled) { - var sameDevTypes = ComputeDeviceManager.Avaliable.GetSameDevicesTypeAsDeviceWithUUID(G.CDevice.UUID); + var CDevice = listViewDevices.FocusedItem.Tag as ComputeDevice; + var sameDevTypes = ComputeDeviceManager.Avaliable.GetSameDevicesTypeAsDeviceWithUUID(CDevice.UUID); if (sameDevTypes.Count > 0) { var copyBenchItem = new ToolStripMenuItem(); //copyBenchItem.DropDownItems foreach (var cDev in sameDevTypes) { - if (cDev.ComputeDeviceEnabledOption.IsEnabled) { + if (cDev.Enabled) { var copyBenchDropDownItem = new ToolStripMenuItem(); copyBenchDropDownItem.Text = cDev.Name; - copyBenchDropDownItem.Checked = cDev.UUID == G.CDevice.BenchmarkCopyUUID; + copyBenchDropDownItem.Checked = cDev.UUID == CDevice.BenchmarkCopyUUID; copyBenchDropDownItem.Click += toolStripMenuItemCopySettings_Click; copyBenchDropDownItem.Tag = cDev.UUID; copyBenchItem.DropDownItems.Add(copyBenchDropDownItem); @@ -229,40 +182,24 @@ private void listViewDevices_MouseClick(object sender, MouseEventArgs e) { } } - //private void toolStripMenuItemEnable_Click(object sender, EventArgs e) { - // ComputeDeviceEnabledOption G = listViewDevices.FocusedItem.Tag as ComputeDeviceEnabledOption; - // var isEnabled = !G.IsEnabled; - // G.IsEnabled = isEnabled; - // if (AutoSaveChange) { - // G.SaveOption(); - // } - // if (SaveToGeneralConfig) { - // ConfigManager.Instance.GeneralConfig.Commit(); - // } - // var lvi = listViewDevices.FocusedItem as ListViewItem; - // if (lvi != null) _listItemCheckColorSetter.LviSetColor(lvi); - // if (_algorithmsListView != null) _algorithmsListView.RepaintStatus(G.IsEnabled, G.CDevice.UUID); - // if (BenchmarkCalculation != null) _benchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); - //} - private void toolStripMenuItemCopySettings_Click(object sender, EventArgs e) { - ComputeDeviceEnabledOption G = listViewDevices.FocusedItem.Tag as ComputeDeviceEnabledOption; + var CDevice = listViewDevices.FocusedItem.Tag as ComputeDevice; ToolStripMenuItem item = sender as ToolStripMenuItem; if(item != null) { var uuid = item.Tag as string; if (uuid != null) { var copyBenchCDev = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(uuid); - G.CDevice.BenchmarkCopyUUID = uuid; + CDevice.BenchmarkCopyUUID = uuid; var result = MessageBox.Show( String.Format( - International.GetText("DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Msg"), copyBenchCDev.GetFullName(), G.CDevice.GetFullName()), + International.GetText("DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Msg"), copyBenchCDev.GetFullName(), CDevice.GetFullName()), International.GetText("DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Title"), MessageBoxButtons.YesNo); if(result == DialogResult.Yes) { // just copy - G.CDevice.CopyBenchmarkSettingsFrom(copyBenchCDev); - if (_algorithmsListView != null) _algorithmsListView.RepaintStatus(G.IsEnabled, G.CDevice.UUID); + CDevice.CopyBenchmarkSettingsFrom(copyBenchCDev); + if (_algorithmsListView != null) _algorithmsListView.RepaintStatus(CDevice.Enabled, CDevice.UUID); } } } diff --git a/NiceHashMiner/Forms/Form_Benchmark.Designer.cs b/NiceHashMiner/Forms/Form_Benchmark.Designer.cs index f3b7e78..af59d0e 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.Designer.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.Designer.cs @@ -127,7 +127,6 @@ private void InitializeComponent() { // // devicesListViewEnableControl1 // - this.devicesListViewEnableControl1.AutoSaveChange = false; this.devicesListViewEnableControl1.BenchmarkCalculation = null; this.devicesListViewEnableControl1.FirstColumnText = "Benckmark"; this.devicesListViewEnableControl1.IsInBenchmark = false; @@ -135,7 +134,6 @@ private void InitializeComponent() { this.devicesListViewEnableControl1.Location = new System.Drawing.Point(12, 15); this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.SetAllEnabled = false; this.devicesListViewEnableControl1.Size = new System.Drawing.Size(376, 112); this.devicesListViewEnableControl1.TabIndex = 0; // diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index a4f0871..492c842 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -67,10 +67,10 @@ private class CPUBenchmarkStatus { private static Color BENCHMARKED_COLOR = Color.LightGreen; private static Color UNBENCHMARKED_COLOR = Color.LightBlue; public void LviSetColor(ListViewItem lvi) { - var cdvo = lvi.Tag as NiceHashMiner.Forms.Components.DevicesListViewEnableControl.ComputeDeviceEnabledOption; - if (cdvo != null && _benchmarkDevicesAlgorithmStatus != null) { - var uuid = cdvo.CDevice.UUID; - if (!cdvo.IsEnabled) { + var CDevice = lvi.Tag as ComputeDevice; + if (CDevice != null && _benchmarkDevicesAlgorithmStatus != null) { + var uuid = CDevice.UUID; + if (!CDevice.Enabled) { lvi.BackColor = DISABLED_COLOR; } else { switch (_benchmarkDevicesAlgorithmStatus[uuid]) { @@ -107,8 +107,6 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm // benchmark only unique devices devicesListViewEnableControl1.SetIListItemCheckColorSetter(this); - //devicesListViewEnableControl1.SetAllEnabled = true; - //devicesListViewEnableControl1.SaveToGeneralConfig = true; devicesListViewEnableControl1.SetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); // use this to track miner benchmark statuses @@ -123,15 +121,15 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm // name, UUID Dictionary benchNamesUUIDs = new Dictionary(); // initialize benchmark settings for same cards to only copy settings - foreach (var GdevSetting in devicesListViewEnableControl1.Options) { - var plainDevName = GdevSetting.CDevice.Name; + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + var plainDevName = cDev.Name; if (benchNamesUUIDs.ContainsKey(plainDevName)) { - GdevSetting.IsEnabled = false; - GdevSetting.CDevice.BenchmarkCopyUUID = benchNamesUUIDs[plainDevName]; + cDev.Enabled = false; + cDev.BenchmarkCopyUUID = benchNamesUUIDs[plainDevName]; } else { - benchNamesUUIDs.Add(plainDevName, GdevSetting.CDevice.UUID); - GdevSetting.IsEnabled = true; // enable benchmark - GdevSetting.CDevice.BenchmarkCopyUUID = null; + benchNamesUUIDs.Add(plainDevName, cDev.UUID); + cDev.Enabled = true; // enable benchmark + cDev.BenchmarkCopyUUID = null; } } @@ -155,7 +153,7 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm // set first device selected { if (ComputeDeviceManager.Avaliable.AllAvaliableDevices.Count > 0) { var firstComputedevice = ComputeDeviceManager.Avaliable.AllAvaliableDevices[0]; - algorithmsListView1.SetAlgorithms(firstComputedevice, firstComputedevice.ComputeDeviceEnabledOption.IsEnabled); + algorithmsListView1.SetAlgorithms(firstComputedevice, firstComputedevice.Enabled); } if (autostart) { @@ -166,13 +164,13 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm private void CopyBenchmarks() { Helpers.ConsolePrint("CopyBenchmarks", "Checking for benchmarks to copy"); - foreach (var GdevSetting in devicesListViewEnableControl1.Options) { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { // check if copy - if (!GdevSetting.IsEnabled && GdevSetting.CDevice.BenchmarkCopyUUID != null) { - var copyCdevSettings = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(GdevSetting.CDevice.BenchmarkCopyUUID); + if (!cDev.Enabled && cDev.BenchmarkCopyUUID != null) { + var copyCdevSettings = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(cDev.BenchmarkCopyUUID); if (copyCdevSettings != null) { - Helpers.ConsolePrint("CopyBenchmarks", String.Format("Copy from {0} to {1}", GdevSetting.CDevice.UUID, GdevSetting.CDevice.BenchmarkCopyUUID)); - GdevSetting.CDevice.CopyBenchmarkSettingsFrom(copyCdevSettings); + Helpers.ConsolePrint("CopyBenchmarks", String.Format("Copy from {0} to {1}", cDev.UUID, cDev.BenchmarkCopyUUID)); + cDev.CopyBenchmarkSettingsFrom(copyCdevSettings); } } } @@ -225,15 +223,12 @@ private void BenchmarkStoppedGUISettings() { } ResetBenchmarkProgressStatus(); CalcBenchmarkDevicesAlgorithmQueue(); - //groupBoxAlgorithmBenchmarkSettings.Enabled = true && _singleBenchmarkType == AlgorithmType.NONE; benchmarkOptions1.Enabled = true; algorithmsListView1.IsInBenchmark = false; devicesListViewEnableControl1.IsInBenchmark = false; - // TODO make scrolable but not checkable - //devicesListViewEnableControl1.Enabled = true && _singleBenchmarkType == AlgorithmType.NONE; if (_currentDevice != null) { - algorithmsListView1.RepaintStatus(_currentDevice.ComputeDeviceEnabledOption.IsEnabled, _currentDevice.UUID); + algorithmsListView1.RepaintStatus(_currentDevice.Enabled, _currentDevice.UUID); } CloseBtn.Enabled = true; @@ -259,8 +254,8 @@ private bool StartButonClick() { // device selection check scope { bool noneSelected = true; - foreach (var option in devicesListViewEnableControl1.Options) { - if (option.IsEnabled) { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + if (cDev.Enabled) { noneSelected = false; break; } @@ -292,10 +287,7 @@ private bool StartButonClick() { // current failed new list _benchmarkFailedAlgoPerDev = new List(); // disable gui controls - //groupBoxAlgorithmBenchmarkSettings.Enabled = false; benchmarkOptions1.Enabled = false; - // TODO make scrolable but not checkable - //devicesListViewEnableControl1.Enabled = false; CloseBtn.Enabled = false; algorithmsListView1.IsInBenchmark = true; devicesListViewEnableControl1.IsInBenchmark = true; @@ -306,7 +298,7 @@ private bool StartButonClick() { } } if (_currentDevice != null) { - algorithmsListView1.RepaintStatus(_currentDevice.ComputeDeviceEnabledOption.IsEnabled, _currentDevice.UUID); + algorithmsListView1.RepaintStatus(_currentDevice.Enabled, _currentDevice.UUID); } StartBenchmark(); @@ -319,10 +311,10 @@ public void CalcBenchmarkDevicesAlgorithmQueue() { _benchmarkAlgorithmsCount = 0; _benchmarkDevicesAlgorithmStatus = new Dictionary(); _benchmarkDevicesAlgorithmQueue = new List>>(); - foreach (var option in devicesListViewEnableControl1.Options) { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { var algorithmQueue = new Queue(); if (_singleBenchmarkType == AlgorithmType.NONE) { - foreach (var kvpAlgorithm in option.CDevice.AlgorithmSettings) { + foreach (var kvpAlgorithm in cDev.AlgorithmSettings) { if (ShoulBenchmark(kvpAlgorithm.Value)) { algorithmQueue.Enqueue(kvpAlgorithm.Value); kvpAlgorithm.Value.SetBenchmarkPendingNoMsg(); @@ -331,22 +323,22 @@ public void CalcBenchmarkDevicesAlgorithmQueue() { } } } else { // single bench - var algo = option.CDevice.AlgorithmSettings[_singleBenchmarkType]; + var algo = cDev.AlgorithmSettings[_singleBenchmarkType]; algorithmQueue.Enqueue(algo); } BenchmarkSettingsStatus status; - if (option.IsEnabled) { + if (cDev.Enabled) { _benchmarkAlgorithmsCount += algorithmQueue.Count; status = algorithmQueue.Count == 0 ? BenchmarkSettingsStatus.NONE : BenchmarkSettingsStatus.TODO; _benchmarkDevicesAlgorithmQueue.Add( - new Tuple>(option.CDevice, algorithmQueue) + new Tuple>(cDev, algorithmQueue) ); } else { status = algorithmQueue.Count == 0 ? BenchmarkSettingsStatus.DISABLED_NONE : BenchmarkSettingsStatus.DISABLED_TODO; } - _benchmarkDevicesAlgorithmStatus[option.CDevice.UUID] = status; + _benchmarkDevicesAlgorithmStatus[cDev.UUID] = status; } // GUI stuff progressBarBenchmarkSteps.Maximum = _benchmarkAlgorithmsCount; @@ -572,7 +564,7 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e ConfigManager.CommitBenchmarks(); // check devices without benchmarks foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cdev.ComputeDeviceEnabledOption.IsEnabled) { + if (cdev.Enabled) { bool Enabled = false; foreach (var algo in cdev.AlgorithmSettings) { if (algo.Value.BenchmarkSpeed > 0) { @@ -580,18 +572,16 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e break; } } - cdev.ComputeDeviceEnabledOption.IsEnabled = Enabled; + cdev.Enabled = Enabled; } } - devicesListViewEnableControl1.SaveOptions(); } private void devicesListView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { - //algorithmSettingsControl1.Deselect(); // show algorithms var _selectedComputeDevice = ComputeDeviceManager.Avaliable.GetCurrentlySelectedComputeDevice(e.ItemIndex, true); - algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); + algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.Enabled); } private void radioButton_SelectedUnbenchmarked_CheckedChanged_1(object sender, EventArgs e) { diff --git a/NiceHashMiner/Forms/Form_Loading.cs b/NiceHashMiner/Forms/Form_Loading.cs index 28a2f76..8e27a39 100644 --- a/NiceHashMiner/Forms/Form_Loading.cs +++ b/NiceHashMiner/Forms/Form_Loading.cs @@ -121,11 +121,11 @@ public void SetTitle(string title) { public void FinishMsg(bool ok) { this.Invoke((MethodInvoker)delegate { - //if (success) { - // label_LoadingText.Text = "Init Finished!"; - //} else { - // label_LoadingText.Text = "Init Failed!"; - //} + if (ok) { + label_LoadingText.Text = "Init Finished!"; + } else { + label_LoadingText.Text = "Init Failed!"; + } System.Threading.Thread.Sleep(1000); Close(); }); diff --git a/NiceHashMiner/Forms/Form_Main.Designer.cs b/NiceHashMiner/Forms/Form_Main.Designer.cs index f26aca2..60a3e81 100644 --- a/NiceHashMiner/Forms/Form_Main.Designer.cs +++ b/NiceHashMiner/Forms/Form_Main.Designer.cs @@ -351,7 +351,6 @@ private void InitializeComponent() // // devicesListViewEnableControl1 // - this.devicesListViewEnableControl1.AutoSaveChange = false; this.devicesListViewEnableControl1.BenchmarkCalculation = null; this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; this.devicesListViewEnableControl1.IsInBenchmark = false; @@ -359,7 +358,6 @@ private void InitializeComponent() this.devicesListViewEnableControl1.Location = new System.Drawing.Point(11, 91); this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.SetAllEnabled = false; this.devicesListViewEnableControl1.Size = new System.Drawing.Size(435, 105); this.devicesListViewEnableControl1.TabIndex = 109; // diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 6ac4344..162ba50 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -211,7 +211,6 @@ private void StartupTimer_Tick(object sender, EventArgs e) { // All devices settup should be initialized in AllDevices devicesListViewEnableControl1.ResetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); // set properties after - devicesListViewEnableControl1.AutoSaveChange = true; devicesListViewEnableControl1.SaveToGeneralConfig = true; LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_CheckLatestVersion")); @@ -785,7 +784,7 @@ private void buttonStartMining_Click(object sender, EventArgs e) // break; // } // } - // cdev.ComputeDeviceEnabledOption.IsEnabled = Enabled; + // cdev.Enabled = Enabled; // } // } else { // return; @@ -796,7 +795,7 @@ private void buttonStartMining_Click(object sender, EventArgs e) // check devices without benchmarks bool noDeviceEnabled = true; foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cdev.ComputeDeviceEnabledOption.IsEnabled) { + if (cdev.Enabled) { noDeviceEnabled = false; break; } @@ -856,9 +855,6 @@ private void buttonStopMining_Click(object sender, EventArgs e) { DemoMode = false; labelDemoMode.Visible = false; - - //textBoxBTCAddress.Text = ""; - //ConfigManager.Instance.GeneralConfig.BitcoinAddress = ""; } UpdateGlobalRate(); diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 1a63cf3..94a7e48 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -1312,7 +1312,6 @@ private void InitializeComponent() { // // devicesListViewEnableControl1 // - this.devicesListViewEnableControl1.AutoSaveChange = true; this.devicesListViewEnableControl1.BenchmarkCalculation = null; this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; this.devicesListViewEnableControl1.IsInBenchmark = false; @@ -1320,7 +1319,6 @@ private void InitializeComponent() { this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.SetAllEnabled = false; this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); this.devicesListViewEnableControl1.TabIndex = 397; // diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 44603ef..4394efe 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -45,7 +45,7 @@ public Form_Settings() { IsChange = false; IsChangeSaved = false; - // TODO + // backup settings ConfigManager.CreateBackup(); // initialize form @@ -68,7 +68,7 @@ public Form_Settings() { // set first device selected { if (ComputeDeviceManager.Avaliable.AllAvaliableDevices.Count > 0) { _selectedComputeDevice = ComputeDeviceManager.Avaliable.AllAvaliableDevices[0]; - algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); + algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.Enabled); groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); } @@ -403,7 +403,6 @@ private void InitializeGeneralTabFieldValuesReferences() { // here we want all devices devicesListViewEnableControl1.SetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); - devicesListViewEnableControl1.AutoSaveChange = false; devicesListViewEnableControl1.SetAlgorithmsListView(algorithmsListView1); devicesListViewEnableControl1.IsSettingsCopyEnabled = true; } @@ -438,15 +437,9 @@ private void InitializeGeneralTab() { #region Tab Devices private void InitializeDevicesTab() { - InitializeDevicesTabTranslations(); InitializeDevicesCallbacks(); } - private void InitializeDevicesTabTranslations() { - //deviceSettingsControl1.InitLocale(toolTip1); - } - - private void InitializeDevicesCallbacks() { devicesListViewEnableControl1.SetDeviceSelectionChangedCallback(devicesListView1_ItemSelectionChanged); } @@ -456,35 +449,6 @@ private void InitializeDevicesCallbacks() { #endregion // Initializations - // TODO - #region Evaluate to be removed - private bool ParseStringToInt32(ref TextBox textBox) { - int configInt; // dummy variable - if (!Int32.TryParse(textBox.Text, out configInt)) { - MessageBox.Show(International.GetText("Form_Settings_ParseIntMsg"), - International.GetText("Form_Settings_ParseIntTitle"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - textBox.Focus(); - return false; - } - - return true; - } - - private bool ParseStringToInt64(ref TextBox textBox) { - long configInt; // dummy variable - if (!Int64.TryParse(textBox.Text, out configInt)) { - MessageBox.Show(International.GetText("Form_Settings_ParseIntMsg"), - International.GetText("Form_Settings_ParseIntTitle"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - textBox.Focus(); - return false; - } - - return true; - } - #endregion // Evaluate to be removed - #region Form Callbacks #region Tab General @@ -531,36 +495,33 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, // indicate there has been a change IsChange = true; - // TODO TODO fix - //ConfigManager.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; - //if (ConfigManager.GeneralConfig.DisableDefaultOptimizations) { - // foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // foreach (var algorithm in cDev.DeviceBenchmarkConfig.AlgorithmSettings) { - // algorithm.Value.ExtraLaunchParameters = ""; - // if (cDev.DeviceType == DeviceType.AMD && algorithm.Key != AlgorithmType.DaggerHashimoto) { - // algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; - // algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( - // new MiningPair(cDev, algorithm.Value), algorithm.Key, cDev.DeviceType, false); - // } - // } - // } - //} else { - // foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults - // var deviceDefaults = GroupAlgorithms.CreateDefaultsForGroup(cDev.DeviceGroupType); - // foreach (var defaultAlgoSettings in deviceDefaults) { - // if (cDev.DeviceBenchmarkConfig.AlgorithmSettings.ContainsKey(defaultAlgoSettings.Key)) { - // var algorithmKey = defaultAlgoSettings.Key; - // var algorithm = cDev.DeviceBenchmarkConfig.AlgorithmSettings[algorithmKey]; - // algorithm.ExtraLaunchParameters = defaultAlgoSettings.Value.ExtraLaunchParameters; - // algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( - // new MiningPair(cDev, algorithm), algorithmKey, cDev.DeviceType, false); - // } - // } - // // set extra optimizations based on device - // cDev.SetDeviceBenchmarkConfig(cDev.DeviceBenchmarkConfig, true); - // } - //} + ConfigManager.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; + if (ConfigManager.GeneralConfig.DisableDefaultOptimizations) { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + foreach (var algorithm in cDev.AlgorithmSettings) { + algorithm.Value.ExtraLaunchParameters = ""; + if (cDev.DeviceType == DeviceType.AMD && algorithm.Key != AlgorithmType.DaggerHashimoto) { + algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; + algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + new MiningPair(cDev, algorithm.Value), algorithm.Key, cDev.DeviceType, false); + } + } + } + } else { + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults + var deviceDefaultsAlgoSettings = GroupAlgorithms.CreateForDevice(cDev); + foreach (var defaultAlgoSettings in deviceDefaultsAlgoSettings) { + var algorithmKey = defaultAlgoSettings.Key; + if (cDev.AlgorithmSettings.ContainsKey(algorithmKey)) { + var algorithm = cDev.AlgorithmSettings[algorithmKey]; + algorithm.ExtraLaunchParameters = defaultAlgoSettings.Value.ExtraLaunchParameters; + algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + new MiningPair(cDev, algorithm), algorithmKey, cDev.DeviceType, false); + } + } + } + } } private void GeneralTextBoxes_Leave(object sender, EventArgs e) { @@ -568,48 +529,32 @@ private void GeneralTextBoxes_Leave(object sender, EventArgs e) { IsChange = true; ConfigManager.GeneralConfig.BitcoinAddress = textBox_BitcoinAddress.Text.Trim(); ConfigManager.GeneralConfig.WorkerName = textBox_WorkerName.Text.Trim(); - // TODO IMPORTANT fix this - // int's only settings - keypress handles only ints should be safe. If string empty or null focus and alert - // after number init set new value text back because it can be out of bounds - // try to refactor this mess - if (!ParseStringToInt32(ref textBox_SwitchMinSecondsFixed)) return; - ConfigManager.GeneralConfig.SwitchMinSecondsFixed = Int32.Parse(textBox_SwitchMinSecondsFixed.Text); - textBox_SwitchMinSecondsFixed.Text = ConfigManager.GeneralConfig.SwitchMinSecondsFixed.ToString(); - if (!ParseStringToInt32(ref textBox_SwitchMinSecondsDynamic)) return; - ConfigManager.GeneralConfig.SwitchMinSecondsDynamic = Int32.Parse(textBox_SwitchMinSecondsDynamic.Text); + ConfigManager.GeneralConfig.SwitchMinSecondsFixed = Helpers.ParseInt(textBox_SwitchMinSecondsFixed.Text); + ConfigManager.GeneralConfig.SwitchMinSecondsDynamic = Helpers.ParseInt(textBox_SwitchMinSecondsDynamic.Text); + ConfigManager.GeneralConfig.SwitchMinSecondsAMD = Helpers.ParseInt(textBox_SwitchMinSecondsAMD.Text); + ConfigManager.GeneralConfig.MinerAPIQueryInterval = Helpers.ParseInt(textBox_MinerAPIQueryInterval.Text); + ConfigManager.GeneralConfig.MinerRestartDelayMS = Helpers.ParseInt(textBox_MinerRestartDelayMS.Text); + ConfigManager.GeneralConfig.MinIdleSeconds = Helpers.ParseInt(textBox_MinIdleSeconds.Text); + ConfigManager.GeneralConfig.LogMaxFileSize = Helpers.ParseLong(textBox_LogMaxFileSize.Text); + ConfigManager.GeneralConfig.ethminerDefaultBlockHeight = Helpers.ParseInt(textBox_ethminerDefaultBlockHeight.Text); + ConfigManager.GeneralConfig.ApiBindPortPoolStart = Helpers.ParseInt(textBox_APIBindPortStart.Text); + // min profit + ConfigManager.GeneralConfig.MinimumProfit = Helpers.ParseDouble(textBox_MinProfit.Text); + + // Fix bounds + ConfigManager.GeneralConfig.FixSettingBounds(); + // update strings + textBox_MinProfit.Text = ConfigManager.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma + textBox_SwitchMinSecondsFixed.Text = ConfigManager.GeneralConfig.SwitchMinSecondsFixed.ToString(); textBox_SwitchMinSecondsDynamic.Text = ConfigManager.GeneralConfig.SwitchMinSecondsDynamic.ToString(); - - if (!ParseStringToInt32(ref textBox_SwitchMinSecondsAMD)) return; - ConfigManager.GeneralConfig.SwitchMinSecondsAMD = Int32.Parse(textBox_SwitchMinSecondsAMD.Text); textBox_SwitchMinSecondsAMD.Text = ConfigManager.GeneralConfig.SwitchMinSecondsAMD.ToString(); - - if (!ParseStringToInt32(ref textBox_MinerAPIQueryInterval)) return; - ConfigManager.GeneralConfig.MinerAPIQueryInterval = Int32.Parse(textBox_MinerAPIQueryInterval.Text); textBox_MinerAPIQueryInterval.Text = ConfigManager.GeneralConfig.MinerAPIQueryInterval.ToString(); - - if (!ParseStringToInt32(ref textBox_MinerRestartDelayMS)) return; - ConfigManager.GeneralConfig.MinerRestartDelayMS = Int32.Parse(textBox_MinerRestartDelayMS.Text); textBox_MinerRestartDelayMS.Text = ConfigManager.GeneralConfig.MinerRestartDelayMS.ToString(); - - if (!ParseStringToInt32(ref textBox_MinIdleSeconds)) return; - ConfigManager.GeneralConfig.MinIdleSeconds = Int32.Parse(textBox_MinIdleSeconds.Text); textBox_MinIdleSeconds.Text = ConfigManager.GeneralConfig.MinIdleSeconds.ToString(); - - if (!ParseStringToInt64(ref textBox_LogMaxFileSize)) return; - ConfigManager.GeneralConfig.LogMaxFileSize = Int64.Parse(textBox_LogMaxFileSize.Text); textBox_LogMaxFileSize.Text = ConfigManager.GeneralConfig.LogMaxFileSize.ToString(); - - if (!ParseStringToInt32(ref textBox_ethminerDefaultBlockHeight)) return; - ConfigManager.GeneralConfig.ethminerDefaultBlockHeight = Int32.Parse(textBox_ethminerDefaultBlockHeight.Text); textBox_ethminerDefaultBlockHeight.Text = ConfigManager.GeneralConfig.ethminerDefaultBlockHeight.ToString(); - - if (!ParseStringToInt32(ref textBox_APIBindPortStart)) return; - ConfigManager.GeneralConfig.ApiBindPortPoolStart = Int32.Parse(textBox_APIBindPortStart.Text); textBox_APIBindPortStart.Text = ConfigManager.GeneralConfig.ApiBindPortPoolStart.ToString(); - - ConfigManager.GeneralConfig.MinimumProfit = Double.Parse(textBox_MinProfit.Text, CultureInfo.InvariantCulture); - textBox_MinProfit.Text = ConfigManager.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma } private void GeneralComboBoxes_Leave(object sender, EventArgs e) { @@ -634,7 +579,7 @@ private void devicesListView1_ItemSelectionChanged(object sender, ListViewItemSe algorithmSettingsControl1.Deselect(); // show algorithms _selectedComputeDevice = ComputeDeviceManager.Avaliable.GetCurrentlySelectedComputeDevice(e.ItemIndex, ShowUniqueDeviceList); - algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); + algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.Enabled); groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); } @@ -733,17 +678,15 @@ private void FormSettings_FormClosing(object sender, FormClosingEventArgs e) { IsRestartNeeded = ConfigManager.IsRestartNeeded(); if (IsChangeSaved) { - devicesListViewEnableControl1.SaveOptions(); ConfigManager.GeneralConfigFileCommit(); ConfigManager.CommitBenchmarks(); International.Initialize(ConfigManager.GeneralConfig.Language); - } else if (IsChange) { + } else { ConfigManager.RestoreBackup(); } } private void currencyConverterCombobox_SelectedIndexChanged(object sender, EventArgs e) { - //Helpers.ConsolePrint("CurrencyConverter", "Currency Set to: " + currencyConverterCombobox.SelectedItem); var Selected = currencyConverterCombobox.SelectedItem.ToString(); ConfigManager.GeneralConfig.DisplayCurrency = Selected; } @@ -754,10 +697,6 @@ private void tabControlGeneral_Selected(object sender, TabControlEventArgs e) { // set first device selected { if (ComputeDeviceManager.Avaliable.AllAvaliableDevices.Count > 0) { algorithmSettingsControl1.Deselect(); - //_selectedComputeDevice = ComputeDevice.AllAvaliableDevices[0]; - //algorithmsListView1.SetAlgorithms(_selectedComputeDevice, _selectedComputeDevice.ComputeDeviceEnabledOption.IsEnabled); - //groupBoxAlgorithmSettings.Text = String.Format(International.GetText("FormSettings_AlgorithmsSettings"), _selectedComputeDevice.Name); - //devicesListViewEnableControl1.SetFirstSelected(); } } diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index b85af0f..e01fa7f 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -223,5 +223,28 @@ public static bool IsConnectedToInternet() { return returnValue; } + // parsing helpers + public static int ParseInt(string text) { + int tmpVal = 0; + if (Int32.TryParse(text, out tmpVal)) { + return tmpVal; + } + return 0; + } + public static long ParseLong(string text) { + long tmpVal = 0; + if (Int64.TryParse(text, out tmpVal)) { + return tmpVal; + } + return 0; + } + public static double ParseDouble(string text) { + try { + return Double.Parse(text, CultureInfo.InvariantCulture); + } catch { + return 0; + } + } + } } From daab8298c7212da2d65b06e5f1a154b6b3ed93a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 27 Nov 2016 22:59:35 +0100 Subject: [PATCH 132/366] don't show warning window for unsupported CUDA devices --- .../Configs/ConfigJsonFile/ConfigFile.cs | 4 +- NiceHashMiner/Configs/ConfigManager.cs | 2 + NiceHashMiner/Configs/Data/GeneralConfig.cs | 1 + NiceHashMiner/Devices/CUDA_Unsupported.cs | 170 ++++++++++++++++++ NiceHashMiner/Devices/ComputeDeviceManager.cs | 10 +- NiceHashMiner/Forms/Form_Main.cs | 4 +- NiceHashMiner/NiceHashMiner.csproj | 1 + 7 files changed, 186 insertions(+), 6 deletions(-) create mode 100644 NiceHashMiner/Devices/CUDA_Unsupported.cs diff --git a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs index 90b72f0..1e6ddd7 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs @@ -9,8 +9,9 @@ namespace NiceHashMiner.Configs.ConfigJsonFile { public abstract class ConfigFile where T : class { // statics/consts - const string TAG = "ConfigFile"; + const string TAG_FORMAT = "ConfigFile<{0}>"; const string CONF_FOLDER = @"configs\"; + private readonly string TAG; private static void CheckAndCreateConfigsFolder() { try { @@ -35,6 +36,7 @@ public ConfigFile(string fileName, string fileNameOld) { } else { this._filePathOld = CONF_FOLDER + fileNameOld; } + TAG = String.Format(TAG_FORMAT, typeof(T).Name); } public bool IsFileExists() { diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index bb583e5..ff186a4 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -172,6 +172,8 @@ public static void AfterDeviceQueryInitialization() { } } } + // save settings + GeneralConfigFileCommit(); } diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index a3bb706..0c36fae 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -104,6 +104,7 @@ public void SetDefaults() { } public void FixSettingBounds() { + this.ConfigFileVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; if (string.IsNullOrEmpty(this.DisplayCurrency) || string.IsNullOrWhiteSpace(this.DisplayCurrency)) { this.DisplayCurrency = "USD"; diff --git a/NiceHashMiner/Devices/CUDA_Unsupported.cs b/NiceHashMiner/Devices/CUDA_Unsupported.cs new file mode 100644 index 0000000..6974382 --- /dev/null +++ b/NiceHashMiner/Devices/CUDA_Unsupported.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NiceHashMiner.Devices { + public static class CUDA_Unsupported { + private static List SM_1_0 = new List() { + "GeForce 8800 Ultra", + "GeForce 8800 GTX", + "GeForce 8800 GTS", + "Quadro FX 5600", + "Quadro FX 4600", + "Quadro Plex 2100 S4", + "Tesla C870", + "Tesla D870", + "Tesla S870", + }; + private static List SM_1_1 = new List() { + "GeForce GTS 250", + "GeForce 9800 GX2", + "GeForce 9800 GTX", + "GeForce 9800 GT", + "GeForce 8800 GTS", + "GeForce 8800 GT", + "GeForce 9600 GT", + "GeForce 9500 GT", + "GeForce 9400 GT", + "GeForce 8600 GTS", + "GeForce 8600 GT", + "GeForce 8500 GT", + "GeForce G110M", + "GeForce 9300M GS", + "GeForce 9200M GS", + "GeForce 9100M G", + "GeForce 8400M GT","GeForce G105M", + "Quadro FX 4700 X2", + "Quadro FX 3700", + "Quadro FX 1800", + "Quadro FX 1700", + "Quadro FX 580", + "Quadro FX 570", + "Quadro FX 470", + "Quadro FX 380", + "Quadro FX 370", + "Quadro FX 370 Low Profile", + "Quadro NVS 450", + "Quadro NVS 420", + "Quadro NVS 290", + "Quadro NVS 295", + "Quadro Plex 2100 D4", + "Quadro FX 3800M", + "Quadro FX 3700M", + "Quadro FX 3600M", + "Quadro FX 2800M", + "Quadro FX 2700M", + "Quadro FX 1700M", + "Quadro FX 1600M", + "Quadro FX 770M", + "Quadro FX 570M", + "Quadro FX 370M", + "Quadro FX 360M", + "Quadro NVS 320M", + "Quadro NVS 160M", + "Quadro NVS 150M", + "Quadro NVS 140M", + "Quadro NVS 135M", + "Quadro NVS 130M", + "Quadro NVS 450", + "Quadro NVS 420", + "Quadro NVS 295", + }; + private static List SM_1_2 = new List() { + "GeForce GT 340", + "GeForce GT 330", + "GeForce GT 320", + "GeForce 315", + "GeForce 310", + "GeForce GT 240", + "GeForce GT 220", + "GeForce 210", + "GeForce GTS 360M", + "GeForce GTS 350M", + "GeForce GT 335M", + "GeForce GT 330M", + "GeForce GT 325M", + "GeForce GT 240M", + "GeForce G210M", + "GeForce 310M", + "GeForce 305M", + "Quadro FX 380 Low Profile", + "Nvidia NVS 300", + "Quadro FX 1800M", + "Quadro FX 880M", + "Quadro FX 380M", + "Nvidia NVS 300", + "NVS 5100M", + "NVS 3100M", + "NVS 2100M", + "ION", + }; + private static List SM_1_3 = new List() { + "GeForce GTX 295", + "GTX 285", + "GTX 280", + "GeForce GTX 275", + "GeForce GTX 260", + "Quadro FX 5800", + "Quadro FX 4800", + "Quadro FX 3800", + "Quadro CX", + "Quadro Plex 2200 D2", + "Tesla C1060", + "Tesla S1070", + "Tesla M1060", + }; + private static List SM_2_0 = new List() { + "GeForce GTX 590", + "GeForce GTX 580", + "GeForce GTX 570", + "GeForce GTX 480", + "GeForce GTX 470", + "GeForce GTX 465", + "GeForce GTX 480M", + "Quadro 6000", + "Quadro 5000", + "Quadro 4000", + "Quadro Plex 7000", + "Quadro 5010M", + "Quadro 5000M", + "Tesla C2075", + "Tesla C2050", + "Tesla C2070", + "Tesla M2050", + "Tesla M2070", + "Tesla M2075", + "Tesla M2090", + }; + + private static bool ContainsSM(List list, string text) { + foreach(var el in list) { + if(text.Contains(el)) { + return true; + } + } + return false; + } + + public static bool IsSupported(string text) { + if (ContainsSM(SM_1_0, text)) { + return false; + } + if (ContainsSM(SM_1_1, text)) { + return false; + } + if (ContainsSM(SM_1_2, text)) { + return false; + } + if (ContainsSM(SM_1_3, text)) { + return false; + } + if (ContainsSM(SM_2_0, text)) { + return false; + } + + return true; + } + } +} diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 012ad9f..3437f46 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -149,11 +149,15 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { // TODO update this to report undetected hardware // #6 check NVIDIA, AMD devices count + int NVIDIA_count = 0; { - int NVIDIA_count = 0; int AMD_count = 0; foreach (var vidCtrl in AvaliableVideoControllers) { - NVIDIA_count += (vidCtrl.Name.ToLower().Contains("nvidia")) ? 1 : 0; + if(vidCtrl.Name.ToLower().Contains("nvidia") && CUDA_Unsupported.IsSupported(vidCtrl.Name)) { + NVIDIA_count += 1; + } else if (vidCtrl.Name.ToLower().Contains("nvidia")) { + Helpers.ConsolePrint(TAG, "Device not supported NVIDIA/CUDA device not supported " + vidCtrl.Name); + } AMD_count += (vidCtrl.Name.ToLower().Contains("amd")) ? 1 : 0; } if (NVIDIA_count == CudaDevices.Count) { @@ -172,7 +176,7 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { // if we have nvidia cards but no CUDA devices tell the user to upgrade driver bool isNvidiaErrorShown = false; // to prevent showing twice bool showWarning = ConfigManager.GeneralConfig.ShowDriverVersionWarning && WindowsDisplayAdapters.HasNvidiaVideoController(); - if (showWarning && CudaDevices.Count == 0 && _currentNvidiaSMIDriver.IsLesserVersionThan(NVIDIA_MIN_DETECTION_DRIVER)) { + if (showWarning && CudaDevices.Count != NVIDIA_count && _currentNvidiaSMIDriver.IsLesserVersionThan(NVIDIA_MIN_DETECTION_DRIVER)) { isNvidiaErrorShown = true; var minDriver = NVIDIA_MIN_DETECTION_DRIVER.ToString(); var recomendDrvier = NVIDIA_RECOMENDED_DRIVER.ToString(); diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 162ba50..1adb68b 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -316,7 +316,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { Close(); return; } - } else { + } else if (!ConfigManager.GeneralConfig.DownloadInit) { // all good ConfigManager.GeneralConfig.DownloadInit = true; ConfigManager.GeneralConfigFileCommit(); @@ -351,7 +351,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { Close(); return; } - } else { + } else if (!ConfigManager.GeneralConfig.DownloadInit3rdParty) { // all good ConfigManager.GeneralConfig.DownloadInit3rdParty = true; ConfigManager.GeneralConfigFileCommit(); diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index d293f04..6325e5a 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -94,6 +94,7 @@ + From 63e601b37475001f7890b7e2e8396f20c21f4573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 09:03:59 +0100 Subject: [PATCH 133/366] CPU id fix (multiple CPU run fix) --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 4 ++-- NiceHashMiner/Miners/MiningSession.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 3437f46..8f7d21d 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -293,10 +293,10 @@ public static void QueryCPUs() { Avaliable.AllAvaliableDevices.Add( new ComputeDevice(0, "CPU0", CPUID.GetCPUName().Trim(), ThreadsPerCPU, (ulong)0, ++CPUCount) ); - } else { + } else if (Avaliable.CPUsCount > 1) { for (int i = 0; i < Avaliable.CPUsCount; i++) { Avaliable.AllAvaliableDevices.Add( - new ComputeDevice(0, "CPU" + i, CPUID.GetCPUName().Trim(), ThreadsPerCPU, CPUID.CreateAffinityMask(i, ThreadsPerCPUMask), ++CPUCount) + new ComputeDevice(i, "CPU" + i, CPUID.GetCPUName().Trim(), ThreadsPerCPU, CPUID.CreateAffinityMask(i, ThreadsPerCPUMask), ++CPUCount) ); } } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 11cd55e..c2d2323 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -278,7 +278,7 @@ public void SwichMostProfitableGroupUpMethod(Dictionary Date: Mon, 28 Nov 2016 09:41:00 +0100 Subject: [PATCH 134/366] changing subprojects from .NET20 to .NET45 --- MessageBoxManager/MessageBoxManager.csproj | 5 ++++- nvidiasetp0state/App.config | 2 +- nvidiasetp0state/nvidiasetp0state.csproj | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/MessageBoxManager/MessageBoxManager.csproj b/MessageBoxManager/MessageBoxManager.csproj index f481f1c..c8d2821 100644 --- a/MessageBoxManager/MessageBoxManager.csproj +++ b/MessageBoxManager/MessageBoxManager.csproj @@ -10,12 +10,13 @@ Properties MessageBoxManager MessageBoxManager - v2.0 + v4.5 2.0 + true @@ -25,6 +26,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -33,6 +35,7 @@ TRACE prompt 4 + false diff --git a/nvidiasetp0state/App.config b/nvidiasetp0state/App.config index 343984d..e707b32 100644 --- a/nvidiasetp0state/App.config +++ b/nvidiasetp0state/App.config @@ -2,5 +2,5 @@ - + diff --git a/nvidiasetp0state/nvidiasetp0state.csproj b/nvidiasetp0state/nvidiasetp0state.csproj index 82ed879..3cf1e02 100644 --- a/nvidiasetp0state/nvidiasetp0state.csproj +++ b/nvidiasetp0state/nvidiasetp0state.csproj @@ -9,7 +9,7 @@ Properties nvidiasetp0state nvidiasetp0state - v2.0 + v4.5 512 @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -31,6 +32,7 @@ TRACE prompt 4 + false app.manifest From 363be687a6b1943e1781d931a8097142aa9d2204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 10:12:41 +0100 Subject: [PATCH 135/366] remove support for nonprofitable algos --- NiceHashMiner/Devices/GroupAlgorithms.cs | 76 ++++++++++++++---------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 9d34f99..8ed825a 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -70,28 +70,28 @@ private static Dictionary CreateDefaultsForGroup(Devic // DisableAMDTempControl = false; TemperatureParam must be appended lastly string DefaultParam = AmdGpuDevice.DefaultParam; return new Dictionary() { - { AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.Keccak , new Algorithm(AlgorithmType.Keccak, "keccak") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 300 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.X15 , new Algorithm(AlgorithmType.X15, "x15") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam} }, - { AlgorithmType.Nist5 , new Algorithm(AlgorithmType.Nist5, "nist5") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 16 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") + // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.Keccak , new Algorithm(AlgorithmType.Keccak, "keccak") + // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 300 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.X15 , new Algorithm(AlgorithmType.X15, "x15") + // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam} }, + //{ AlgorithmType.Nist5 , new Algorithm(AlgorithmType.Nist5, "nist5") + // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 16 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.NeoScrypt , new Algorithm(AlgorithmType.NeoScrypt, "neoscrypt") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.WhirlpoolX , new Algorithm(AlgorithmType.WhirlpoolX, "whirlpoolx") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.Qubit , new Algorithm(AlgorithmType.Qubit, "qubitcoin") - { ExtraLaunchParameters = DefaultParam + "--intensity 18 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.Quark , new Algorithm(AlgorithmType.Quark, "quarkcoin") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.WhirlpoolX , new Algorithm(AlgorithmType.WhirlpoolX, "whirlpoolx") + // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.Qubit , new Algorithm(AlgorithmType.Qubit, "qubitcoin") + // { ExtraLaunchParameters = DefaultParam + "--intensity 18 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.Quark , new Algorithm(AlgorithmType.Quark, "quarkcoin") + // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "Lyra2REv2") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") - { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") - { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") + // { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + //{ AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") + // { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } }, @@ -103,19 +103,19 @@ private static Dictionary CreateDefaultsForGroup(Devic // NVIDIA if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType || DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { var ret = new Dictionary { - { AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") }, - { AlgorithmType.Keccak , new Algorithm(AlgorithmType.Keccak, "keccak") }, - { AlgorithmType.X15 , new Algorithm(AlgorithmType.X15, "x15") }, - { AlgorithmType.Nist5 , new Algorithm(AlgorithmType.Nist5, "nist5") }, + //{ AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") }, + //{ AlgorithmType.Keccak , new Algorithm(AlgorithmType.Keccak, "keccak") }, + //{ AlgorithmType.X15 , new Algorithm(AlgorithmType.X15, "x15") }, + //{ AlgorithmType.Nist5 , new Algorithm(AlgorithmType.Nist5, "nist5") }, { AlgorithmType.NeoScrypt , new Algorithm(AlgorithmType.NeoScrypt, "neoscrypt") }, - { AlgorithmType.WhirlpoolX , new Algorithm(AlgorithmType.WhirlpoolX, "whirlpoolx") }, - { AlgorithmType.Qubit , new Algorithm(AlgorithmType.Qubit, "qubit") }, - { AlgorithmType.Quark , new Algorithm(AlgorithmType.Quark, "quark") }, + //{ AlgorithmType.WhirlpoolX , new Algorithm(AlgorithmType.WhirlpoolX, "whirlpoolx") }, + //{ AlgorithmType.Qubit , new Algorithm(AlgorithmType.Qubit, "qubit") }, + //{ AlgorithmType.Quark , new Algorithm(AlgorithmType.Quark, "quark") }, { AlgorithmType.Lyra2RE , new Algorithm(AlgorithmType.Lyra2RE, "lyra2") }, { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "lyra2v2") }, - { AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") }, - { AlgorithmType.Blake256r14 , new Algorithm(AlgorithmType.Blake256r14, "blake") }, - { AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") }, + //{ AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") }, + //{ AlgorithmType.Blake256r14 , new Algorithm(AlgorithmType.Blake256r14, "blake") }, + //{ AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") }, { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, @@ -124,15 +124,25 @@ private static Dictionary CreateDefaultsForGroup(Devic }; if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType) { // minerName change => "whirlpoolx" => "whirlpool" - ret[AlgorithmType.WhirlpoolX] = new Algorithm(AlgorithmType.WhirlpoolX, "whirlpool"); // Needed for new tpruvot's ccminer + if (ret.ContainsKey(AlgorithmType.WhirlpoolX)) { + ret[AlgorithmType.WhirlpoolX] = new Algorithm(AlgorithmType.WhirlpoolX, "whirlpool"); // Needed for new tpruvot's ccminer + } // disable/remove neoscrypt - ret.Remove(AlgorithmType.NeoScrypt); - ret.Remove(AlgorithmType.Lyra2RE); - ret.Remove(AlgorithmType.Lyra2REv2); + if (ret.ContainsKey(AlgorithmType.NeoScrypt)) { + ret.Remove(AlgorithmType.NeoScrypt); + } + if (ret.ContainsKey(AlgorithmType.Lyra2RE)) { + ret.Remove(AlgorithmType.Lyra2RE); + } + if (ret.ContainsKey(AlgorithmType.Lyra2REv2)) { + ret.Remove(AlgorithmType.Lyra2REv2); + } } if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { // disable/remove daggerhashimoto - ret.Remove(AlgorithmType.DaggerHashimoto); + if (ret.ContainsKey(AlgorithmType.DaggerHashimoto)) { + ret.Remove(AlgorithmType.DaggerHashimoto); + } } return ret; } From dd5819c6e40b75dc4d680c1b00146d023a782fcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 11:47:57 +0100 Subject: [PATCH 136/366] ver bump remove NVIDIA CrytoNight (unstable miner) --- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 8ed825a..f35dd52 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -118,7 +118,7 @@ private static Dictionary CreateDefaultsForGroup(Devic //{ AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, + //{ AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") }, { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 1adb68b..bf7cae6 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -49,7 +49,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = "_PENDING"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 9792819..08dda19 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.7")] -[assembly: AssemblyFileVersion("1.7.3.7")] +[assembly: AssemblyVersion("1.7.3.8")] +[assembly: AssemblyFileVersion("1.7.3.8")] From e2062d36d960716be9ad5ca5dc2ec8a6d63c69a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 13:27:46 +0100 Subject: [PATCH 137/366] remove NVIDIA Lyra2RE support, Currency converter fixes/logic change --- NiceHashMiner/CurrencyConverter.cs | 36 ++++++++++++++++-------- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- NiceHashMiner/Forms/Form_Main.cs | 22 +++++++-------- NiceHashMiner/Program.cs | 3 ++ 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/NiceHashMiner/CurrencyConverter.cs b/NiceHashMiner/CurrencyConverter.cs index 685f685..8c2edc7 100644 --- a/NiceHashMiner/CurrencyConverter.cs +++ b/NiceHashMiner/CurrencyConverter.cs @@ -4,14 +4,18 @@ using System.Net; using NiceHashMiner.Configs; -namespace NiceHashMiner.CurrencyConverter +namespace NiceHashMiner { public static class CurrencyConverter { private static DateTime LastUpdate = DateTime.Now; - private static CurrencyAPIResponse LastResponse; + //private static CurrencyAPIResponse LastResponse; + private static CurrencyAPIResponse CurrencyAPIResponse; + // after first successful request don't fallback to USD + private static bool IsCurrencyConverterInit = false; + public static string ActiveDisplayCurrency = "USD"; - private static bool ConverterActive { + private static bool ConverterActive { get { return ConfigManager.GeneralConfig.DisplayCurrency != "USD"; } } @@ -21,13 +25,13 @@ public static double ConvertToActiveCurrency(double amount) if (!ConverterActive) return amount; - if(LastResponse == null || DateTime.Now - LastUpdate > TimeSpan.FromMinutes(10)) + if (!IsCurrencyConverterInit || DateTime.Now - LastUpdate > TimeSpan.FromMinutes(10)) { UpdateAPI(); } // if we are still null after an update something went wrong. just use USD hopefully itll update next tick - if (LastResponse == null) + if (CurrencyAPIResponse == null || ActiveDisplayCurrency == "USD") { Helpers.ConsolePrint("CurrencyConverter", "Unable to retrieve update, Falling back to USD"); return amount; @@ -35,12 +39,12 @@ public static double ConvertToActiveCurrency(double amount) //Helpers.ConsolePrint("CurrencyConverter", "Current Currency: " + ConfigManager.Instance.GeneralConfig.DisplayCurrency); double usdExchangeRate = 1.0; - if (LastResponse.rates.TryGetValue(ConfigManager.GeneralConfig.DisplayCurrency, out usdExchangeRate)) + if (CurrencyAPIResponse.rates.TryGetValue(ActiveDisplayCurrency, out usdExchangeRate)) return amount * usdExchangeRate; else { - Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + ConfigManager.GeneralConfig.DisplayCurrency + " falling back to USD rates"); - ConfigManager.GeneralConfig.DisplayCurrency = "USD"; + Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + ActiveDisplayCurrency + " falling back to USD rates"); + ActiveDisplayCurrency = "USD"; return amount; } } @@ -50,14 +54,22 @@ private static void UpdateAPI() try { var Client = new WebClient(); var Response = Client.DownloadString("http://api.fixer.io/latest?base=USD"); - LastResponse = JsonConvert.DeserializeObject(Response, Globals.JsonSettings); + var LastResponse = JsonConvert.DeserializeObject(Response, Globals.JsonSettings); LastUpdate = DateTime.Now; + // set that we have a response + if (LastResponse != null) { + IsCurrencyConverterInit = true; + CurrencyAPIResponse = LastResponse; + ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; + } } catch (Exception E) { - Helpers.ConsolePrint("CurrencyConverter", E.Message); - Helpers.ConsolePrint("CurrencyConverter", "Unable to update API: reverting to usd"); - ConfigManager.GeneralConfig.DisplayCurrency = "USD"; + if (!IsCurrencyConverterInit) { + Helpers.ConsolePrint("CurrencyConverter", E.Message); + Helpers.ConsolePrint("CurrencyConverter", "Unable to update API: reverting to usd"); + ActiveDisplayCurrency = "USD"; + } } } } diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index f35dd52..f0473b4 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -111,7 +111,7 @@ private static Dictionary CreateDefaultsForGroup(Devic //{ AlgorithmType.WhirlpoolX , new Algorithm(AlgorithmType.WhirlpoolX, "whirlpoolx") }, //{ AlgorithmType.Qubit , new Algorithm(AlgorithmType.Qubit, "qubit") }, //{ AlgorithmType.Quark , new Algorithm(AlgorithmType.Quark, "quark") }, - { AlgorithmType.Lyra2RE , new Algorithm(AlgorithmType.Lyra2RE, "lyra2") }, + //{ AlgorithmType.Lyra2RE , new Algorithm(AlgorithmType.Lyra2RE, "lyra2") }, { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "lyra2v2") }, //{ AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") }, //{ AlgorithmType.Blake256r14 , new Algorithm(AlgorithmType.Blake256r14, "blake") }, diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index bf7cae6..6b03f97 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -98,14 +98,9 @@ private void InitLocalization() { linkLabelCheckStats.Text = International.GetText("Form_Main_check_stats"); linkLabelChooseBTCWallet.Text = International.GetText("Form_Main_choose_bitcoin_wallet"); - // these strings are no longer used, check and use them as base - string rateString = International.GetText("Rate") + ":"; - string ratesBTCInitialString = "0.00000000 BTC/" + International.GetText("Day"); - string ratesDollarInitialString = String.Format("0.00 {0}/", ConfigManager.GeneralConfig.DisplayCurrency) + International.GetText("Day"); - toolStripStatusLabelGlobalRateText.Text = International.GetText("Form_Main_global_rate") + ":"; toolStripStatusLabelBTCDayText.Text = "BTC/" + International.GetText("Day"); - toolStripStatusLabelBalanceText.Text = (ConfigManager.GeneralConfig.DisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; + toolStripStatusLabelBalanceText.Text = (CurrencyConverter.ActiveDisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; devicesListViewEnableControl1.InitLocale(); @@ -129,7 +124,11 @@ private void InitMainConfigGUIData() { ShowWarningNiceHashData = true; DemoMode = false; - toolStripStatusLabelBalanceDollarValue.Text = "(" + ConfigManager.GeneralConfig.DisplayCurrency + ")"; + // init active display currency after config load + CurrencyConverter.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; + + toolStripStatusLabelBalanceDollarValue.Text = "(" + CurrencyConverter.ActiveDisplayCurrency + ")"; + BalanceCheck_Tick(null, null); // update currency changes if (_isDeviceDetectionInitialized) { devicesListViewEnableControl1.ResetComputeDevices(ComputeDeviceManager.Avaliable.AllAvaliableDevices); @@ -473,8 +472,8 @@ public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPID } string rateBTCString = FormatPayingOutput(paying); - string rateCurrencyString = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(paying * Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", ConfigManager.GeneralConfig.DisplayCurrency) + International.GetText("Day"); + string rateCurrencyString = CurrencyConverter.ConvertToActiveCurrency(paying * Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) + + String.Format(" {0}/", CurrencyConverter.ActiveDisplayCurrency) + International.GetText("Day"); ((GroupProfitControl)flowLayoutPanelRates.Controls[flowLayoutPanelRatesIndex++]) .UpdateProfitStats(groupName, deviceStringInfo, speedString, rateBTCString, rateCurrencyString); @@ -507,7 +506,7 @@ private void UpdateGlobalRate() toolStripStatusLabelGlobalRateValue.Text = (TotalRate).ToString("F8", CultureInfo.InvariantCulture); } - toolStripStatusLabelBTCDayValue.Text = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency((TotalRate * Globals.BitcoinRate)).ToString("F2", CultureInfo.InvariantCulture); + toolStripStatusLabelBTCDayValue.Text = CurrencyConverter.ConvertToActiveCurrency((TotalRate * Globals.BitcoinRate)).ToString("F2", CultureInfo.InvariantCulture); } @@ -532,7 +531,7 @@ void BalanceCheck_Tick(object sender, EventArgs e) //Helpers.ConsolePrint("CurrencyConverter", "Using CurrencyConverter" + ConfigManager.Instance.GeneralConfig.DisplayCurrency); double Amount = (Balance * Globals.BitcoinRate); - Amount = CurrencyConverter.CurrencyConverter.ConvertToActiveCurrency(Amount); + Amount = CurrencyConverter.ConvertToActiveCurrency(Amount); toolStripStatusLabelBalanceDollarText.Text = Amount.ToString("F2", CultureInfo.InvariantCulture); } } @@ -714,7 +713,6 @@ private void buttonSettings_Click(object sender, EventArgs e) } else if (Settings.IsChange && Settings.IsChangeSaved) { InitLocalization(); InitMainConfigGUIData(); - UpdateGlobalRate(); // update currency changes } } diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index 0347005..42d8862 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -42,6 +42,9 @@ static void Main(string[] argv) Helpers.AllocConsole(); } + // init active display currency after config load + CurrencyConverter.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; + // #2 then parse args var commandLineArgs = new CommandLineParser(argv); From fded86c7e240b0e98ddbbfdaf3693f16f479b057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 15:12:26 +0100 Subject: [PATCH 138/366] AvaragedSpeed for Algorithm and use for dagger dag load checking --- NiceHashMiner/Algorithm.cs | 2 ++ NiceHashMiner/Devices/GroupAlgorithms.cs | 16 ++++++++++++++++ NiceHashMiner/Globals.cs | 2 ++ NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs | 15 ++++++++++++++- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 2 +- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index adca89c..62a4c39 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -16,6 +16,8 @@ public class Algorithm { // CPU miners only setting public int LessThreads { get; set; } + // avarage speed of same devices to increase mining stability + public double AvaragedSpeed { get; set; } public Algorithm(AlgorithmType niceHashID, string minerName) { NiceHashID = niceHashID; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index f0473b4..09e4278 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -45,6 +45,22 @@ public static Dictionary CreateForDevice(ComputeDevice Helpers.ConsolePrint("ComputeDevice", "The GPU detected (" + device.Codename + ") is not Tahiti. Changing default gpu-threads to 2."); } } + + // Ellesmere, Polaris + // Ellesmere sgminer workaround, keep this until sgminer is fixed to work with Ellesmere + if (device.Codename.Contains("Ellesmere") && Globals.IsEllesmereSgminerIgnore) { + // remove all algos except equi and dagger + List toRemove = new List(); + foreach (var key in algoSettings.Keys) { + if (AlgorithmType.DaggerHashimoto != key && AlgorithmType.Equihash != key) { + toRemove.Add(key); + } + } + // remove keys + foreach (var key in toRemove) { + algoSettings.Remove(key); + } + } } // check if it is Etherum capable diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index a799876..2188978 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -16,5 +16,7 @@ public class Globals { public static bool IsFirstNetworkCheckTimeout = true; public static int FirstNetworkCheckTimeoutTimeMS = 500; public static int FirstNetworkCheckTimeoutTries = 10; + // sgminer Ellesmere ignore setting + public static bool IsEllesmereSgminerIgnore = true; } } \ No newline at end of file diff --git a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs index 0aae4d3..149a63f 100644 --- a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs +++ b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs @@ -16,7 +16,20 @@ public MiningAlgorithm(ComputeDevice dev, Algorithm algo) { public Algorithm AlgoRef { get; private set; } public string MinerPath { get; private set; } // avarage speed of same devices to increase mining stability - public double AvaragedSpeed = 0; + public double AvaragedSpeed + { + get { + if(AlgoRef != null) { + return AlgoRef.AvaragedSpeed; + } + return 0; + } + set { + if (AlgoRef != null) { + AlgoRef.AvaragedSpeed = value; + } + } + } public double CurrentProfit = 0; public double CurNhmSMADataVal = 0; } diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index c7e3760..91e2d48 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -110,7 +110,7 @@ public override void InitMiningSetup(MiningSetup miningSetup) { // now find the fastest for DAG generation double fastestSpeed = double.MinValue; foreach (var mPair in MiningSetup.MiningPairs) { - double compareSpeed = mPair.Device.AlgorithmSettings[AlgorithmType.DaggerHashimoto].BenchmarkSpeed; + double compareSpeed = mPair.Algorithm.AvaragedSpeed; if (fastestSpeed < compareSpeed) { DaggerHashimotoGenerateDevice = mPair.Device; fastestSpeed = compareSpeed; From 7b5a56424173ac1539fe8ec4f0eff35b113cdcfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 15:38:11 +0100 Subject: [PATCH 139/366] check for profitability only when SMA switch checking is called --- NiceHashMiner/Miners/MiningSession.cs | 45 ++++++++++++++------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index c2d2323..ab06d6b 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -44,9 +44,9 @@ public class MiningSession { // check internet connection private Timer _internetCheckTimer; - // - private Timer _miningStatusCheckTimer; - bool CheckStatus = false; + //// + //private Timer _miningStatusCheckTimer; + //bool CheckStatus = false; public bool IsMiningEnabled { get { @@ -88,9 +88,9 @@ public MiningSession(List devices, _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; _internetCheckTimer.Interval = 1000 * 30 * 1; // every minute or 5?? // 1000 * 60 * 1 - _miningStatusCheckTimer = new Timer(); - _miningStatusCheckTimer.Elapsed += MiningStatusCheckTimer_Tick; - _miningStatusCheckTimer.Interval = 1000 * 30; + //_miningStatusCheckTimer = new Timer(); + //_miningStatusCheckTimer.Elapsed += MiningStatusCheckTimer_Tick; + //_miningStatusCheckTimer.Interval = 1000 * 30; // assume profitable IsProfitable = true; @@ -100,7 +100,7 @@ public MiningSession(List devices, if (IsMiningEnabled) { _preventSleepTimer.Start(); _internetCheckTimer.Start(); - _miningStatusCheckTimer.Start(); + //_miningStatusCheckTimer.Start(); } IsMiningRegardlesOfProfit = ConfigManager.GeneralConfig.MinimumProfit == 0; @@ -118,9 +118,9 @@ private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { Helpers.PreventSleep(); } - private void MiningStatusCheckTimer_Tick(object sender, ElapsedEventArgs e) { - CheckStatus = true; - } + //private void MiningStatusCheckTimer_Tick(object sender, ElapsedEventArgs e) { + // CheckStatus = true; + //} #endregion #region Start/Stop @@ -143,7 +143,7 @@ public void StopAllMiners() { // restroe/enable sleep _preventSleepTimer.Stop(); _internetCheckTimer.Stop(); - _miningStatusCheckTimer.Stop(); + //_miningStatusCheckTimer.Stop(); Helpers.AllowMonitorPowerdownAndSleep(); // delete generated bin files @@ -297,6 +297,7 @@ public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData) // Update GUI _mainFormRatesComunication.AddRateInfo(m.MinerTAG(), groupMiners.DevicesInfoString, AD, groupMiners.CurrentRate, m.IsAPIReadException); } - // check if profitabile - if (CheckStatus && !IsMiningRegardlesOfProfit) { - CheckStatus = false; - if (IsProfitable) { - // check current profit - CheckIfShouldMine(CurrentProfit, true); - } else if (!IsProfitable) { - // recalculate and switch - SwichMostProfitableGroupUpMethod(NiceHashData, true); - } - } + //// check if profitabile + //if (CheckStatus && !IsMiningRegardlesOfProfit) { + // CheckStatus = false; + // if (IsProfitable) { + // // check current profit + // CheckIfShouldMine(CurrentProfit, true); + // } else if (!IsProfitable) { + // // recalculate and switch + // SwichMostProfitableGroupUpMethod(NiceHashData, true); + // } + //} } } From 4c76dc71e5993f1067a138b3842952f238379e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 17:10:22 +0100 Subject: [PATCH 140/366] fake compute device fix needed for dagger parsing --- NiceHashMiner/Devices/ComputeDevice.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 2b044d9..766bb16 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -47,6 +47,15 @@ public class ComputeDevice // Fake dev public ComputeDevice(int id) { ID = id; + Name = "fake_" + id; + NameCount = Name; + Enabled = true; + DeviceType = DeviceType.CPU; + DeviceGroupType = DeviceGroupType.NONE; + IsEtherumCapale = false; + IsOptimizedVersion = false; + Codename = "fake"; + UUID = GetUUID(ID, GroupNames.GetGroupName(DeviceGroupType, ID), Name, DeviceGroupType); } // CPU From 4a23781a16f916081b54f1dadf8fb49fb930b21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 17:12:40 +0100 Subject: [PATCH 141/366] GetGroupName bounds checking fix --- NiceHashMiner/Devices/GroupNames.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupNames.cs b/NiceHashMiner/Devices/GroupNames.cs index 7f642e6..4dc192b 100644 --- a/NiceHashMiner/Devices/GroupNames.cs +++ b/NiceHashMiner/Devices/GroupNames.cs @@ -19,7 +19,7 @@ static public class GroupNames public static string GetGroupName(DeviceGroupType type, int id) { if(DeviceGroupType.CPU == type) { return "CPU"+id; - } else if ((int)type < _names.Length) { + } else if ((int)type < _names.Length && (int)type >= 0) { return _names[(int)type]; } return "UnknownGroup"; From a2d29951728935e973e3d284cbe7cb63dd5ec845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 28 Nov 2016 18:25:19 +0100 Subject: [PATCH 142/366] disable neoscrypt on Ellesmere (BSODs/does not work) --- NiceHashMiner/Devices/GroupAlgorithms.cs | 4 ++++ NiceHashMiner/Globals.cs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 09e4278..91acefa 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -60,6 +60,10 @@ public static Dictionary CreateForDevice(ComputeDevice foreach (var key in toRemove) { algoSettings.Remove(key); } + } else if (device.Codename.Contains("Ellesmere")) { + if (algoSettings.ContainsKey(AlgorithmType.NeoScrypt)) { + algoSettings.Remove(AlgorithmType.NeoScrypt); + } } } diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index 2188978..c68cf90 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -17,6 +17,6 @@ public class Globals { public static int FirstNetworkCheckTimeoutTimeMS = 500; public static int FirstNetworkCheckTimeoutTries = 10; // sgminer Ellesmere ignore setting - public static bool IsEllesmereSgminerIgnore = true; + public static bool IsEllesmereSgminerIgnore = false; } } \ No newline at end of file From 4e469020dd30f3fb932de810b3df02e6f9c2b066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 29 Nov 2016 14:00:55 +0100 Subject: [PATCH 143/366] differentiate manual and automatic (Idle) starts, fix idle no device window spam --- NiceHashMiner/Forms/Form_Main.cs | 217 +++++++++++++++++-------------- 1 file changed, 121 insertions(+), 96 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 6b03f97..42d8dd8 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -53,6 +53,9 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, private bool _isDeviceDetectionInitialized = false; + private bool IsManuallyStarted = false; + private bool IsMining = false; + public Form_Main() { InitializeComponent(); @@ -149,7 +152,7 @@ public void AfterLoadComplete() private void IdleCheck_Tick(object sender, EventArgs e) { - if (!ConfigManager.GeneralConfig.StartMiningWhenIdle) return; + if (!ConfigManager.GeneralConfig.StartMiningWhenIdle || IsManuallyStarted) return; uint MSIdle = Helpers.GetIdleTime(); @@ -157,7 +160,7 @@ private void IdleCheck_Tick(object sender, EventArgs e) { if (MSIdle < (ConfigManager.GeneralConfig.MinIdleSeconds * 1000)) { - buttonStopMining_Click(null, null); + StopMining(); Helpers.ConsolePrint("NICEHASH", "Resumed from idling"); } } @@ -166,7 +169,9 @@ private void IdleCheck_Tick(object sender, EventArgs e) if (BenchmarkForm == null && (MSIdle > (ConfigManager.GeneralConfig.MinIdleSeconds * 1000))) { Helpers.ConsolePrint("NICEHASH", "Entering idling state"); - buttonStartMining_Click(null, null); + if (StartMining(false) == false) { + StopMining(); + } } } } @@ -373,7 +378,12 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } } else { if (ConfigManager.GeneralConfig.AutoStartMining) { - buttonStartMining_Click(null, null); + // well this is started manually as we want it to start at runtime + IsManuallyStarted = true; + if (StartMining(true) == false) { + IsManuallyStarted = false; + StopMining(); + } } } } @@ -717,33 +727,114 @@ private void buttonSettings_Click(object sender, EventArgs e) } - private void buttonStartMining_Click(object sender, EventArgs e) + private void buttonStartMining_Click(object sender, EventArgs e) { + IsManuallyStarted = true; + if (StartMining(true) == false) { + IsManuallyStarted = false; + StopMining(); + } + } + + + private void buttonStopMining_Click(object sender, EventArgs e) { + IsManuallyStarted = false; + StopMining(); + } + + private string FormatPayingOutput(double paying) + { + string ret = ""; + + if (ConfigManager.GeneralConfig.AutoScaleBTCValues && paying < 0.1) + ret = (paying * 1000).ToString("F7", CultureInfo.InvariantCulture) + " mBTC/" + International.GetText("Day"); + else + ret = paying.ToString("F8", CultureInfo.InvariantCulture) + " BTC/" + International.GetText("Day"); + + return ret; + } + + + private void buttonHelp_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Links.NHM_Help); + } + + private void toolStripStatusLabel10_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Links.NHM_Paying_Faq); + } + + private void toolStripStatusLabel10_MouseHover(object sender, EventArgs e) + { + statusStrip1.Cursor = Cursors.Hand; + } + + private void toolStripStatusLabel10_MouseLeave(object sender, EventArgs e) { - if (textBoxBTCAddress.Text.Equals("")) + statusStrip1.Cursor = Cursors.Default; + } + + private void textBoxCheckBoxMain_Leave(object sender, EventArgs e) + { + if (VerifyMiningAddress(false)) + { + // Commit to config.json + ConfigManager.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); + ConfigManager.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); + ConfigManager.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; + ConfigManager.GeneralConfigFileCommit(); + } + } + + // Minimize to system tray if MinimizeToTray is set to true + private void Form1_Resize(object sender, EventArgs e) + { + notifyIcon1.Icon = Properties.Resources.logo; + notifyIcon1.Text = Application.ProductName + " v" + Application.ProductVersion + "\nDouble-click to restore.."; + + if (ConfigManager.GeneralConfig.MinimizeToTray && FormWindowState.Minimized == this.WindowState) { - DialogResult result = MessageBox.Show(International.GetText("Form_Main_DemoModeMsg"), + notifyIcon1.Visible = true; + this.Hide(); + } + } + + // Restore NiceHashMiner from the system tray + private void notifyIcon1_DoubleClick(object sender, EventArgs e) + { + this.Show(); + this.WindowState = FormWindowState.Normal; + notifyIcon1.Visible = false; + } + + /////////////////////////////////////// + // Miner control functions + private bool StartMining(bool showWarnings) { + if (textBoxBTCAddress.Text.Equals("")) { + if (showWarnings) { + DialogResult result = MessageBox.Show(International.GetText("Form_Main_DemoModeMsg"), International.GetText("Form_Main_DemoModeTitle"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (result == System.Windows.Forms.DialogResult.Yes) - { - DemoMode = true; - labelDemoMode.Visible = true; - labelDemoMode.Text = International.GetText("Form_Main_DemoModeLabel"); - - //textBoxBTCAddress.Text = "34HKWdzLxWBduUfJE9JxaFhoXnfC6gmePG"; + if (result == System.Windows.Forms.DialogResult.Yes) { + DemoMode = true; + labelDemoMode.Visible = true; + labelDemoMode.Text = International.GetText("Form_Main_DemoModeLabel"); + } else { + return false; + } + } else { + return false; } - else - return; - } - else if (!VerifyMiningAddress(true)) return; + } else if (!VerifyMiningAddress(true)) return false; - if (Globals.NiceHashData == null) - { - MessageBox.Show(International.GetText("Form_Main_msgbox_NullNiceHashDataMsg"), + if (Globals.NiceHashData == null) { + if (showWarnings) { + MessageBox.Show(International.GetText("Form_Main_msgbox_NullNiceHashDataMsg"), International.GetText("Error_with_Exclamation"), MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + } + return false; } //// TODO @@ -799,10 +890,12 @@ private void buttonStartMining_Click(object sender, EventArgs e) } } if (noDeviceEnabled) { - DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_For_Mining"), + if (showWarnings) { + DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_For_Mining"), International.GetText("Warning_with_Exclamation"), MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; + } + return false; } textBoxBTCAddress.Enabled = false; @@ -828,13 +921,12 @@ private void buttonStartMining_Click(object sender, EventArgs e) SMAMinerCheck.Interval = 100; SMAMinerCheck.Start(); - //SMAMinerCheck_Tick(null, null); MinerStatsCheck.Start(); - } + return isMining; + } - private void buttonStopMining_Click(object sender, EventArgs e) - { + private void StopMining() { MinerStatsCheck.Stop(); SMAMinerCheck.Stop(); @@ -849,79 +941,12 @@ private void buttonStopMining_Click(object sender, EventArgs e) devicesListViewEnableControl1.IsMining = false; buttonStopMining.Enabled = false; - if (DemoMode) - { + if (DemoMode) { DemoMode = false; labelDemoMode.Visible = false; } UpdateGlobalRate(); } - - private string FormatPayingOutput(double paying) - { - string ret = ""; - - if (ConfigManager.GeneralConfig.AutoScaleBTCValues && paying < 0.1) - ret = (paying * 1000).ToString("F7", CultureInfo.InvariantCulture) + " mBTC/" + International.GetText("Day"); - else - ret = paying.ToString("F8", CultureInfo.InvariantCulture) + " BTC/" + International.GetText("Day"); - - return ret; - } - - - private void buttonHelp_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start(Links.NHM_Help); - } - - private void toolStripStatusLabel10_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start(Links.NHM_Paying_Faq); - } - - private void toolStripStatusLabel10_MouseHover(object sender, EventArgs e) - { - statusStrip1.Cursor = Cursors.Hand; - } - - private void toolStripStatusLabel10_MouseLeave(object sender, EventArgs e) - { - statusStrip1.Cursor = Cursors.Default; - } - - private void textBoxCheckBoxMain_Leave(object sender, EventArgs e) - { - if (VerifyMiningAddress(false)) - { - // Commit to config.json - ConfigManager.GeneralConfig.BitcoinAddress = textBoxBTCAddress.Text.Trim(); - ConfigManager.GeneralConfig.WorkerName = textBoxWorkerName.Text.Trim(); - ConfigManager.GeneralConfig.ServiceLocation = comboBoxLocation.SelectedIndex; - ConfigManager.GeneralConfigFileCommit(); - } - } - - // Minimize to system tray if MinimizeToTray is set to true - private void Form1_Resize(object sender, EventArgs e) - { - notifyIcon1.Icon = Properties.Resources.logo; - notifyIcon1.Text = Application.ProductName + " v" + Application.ProductVersion + "\nDouble-click to restore.."; - - if (ConfigManager.GeneralConfig.MinimizeToTray && FormWindowState.Minimized == this.WindowState) - { - notifyIcon1.Visible = true; - this.Hide(); - } - } - - // Restore NiceHashMiner from the system tray - private void notifyIcon1_DoubleClick(object sender, EventArgs e) - { - this.Show(); - this.WindowState = FormWindowState.Normal; - notifyIcon1.Visible = false; - } } } From 7878425497f443a19ea33ce3659302ab6fd5be6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 1 Dec 2016 11:09:34 +0100 Subject: [PATCH 144/366] AMD device detection fallback --- .../AMDOpenCLDeviceDetection.h | 2 + NiceHashMiner/Devices/ComputeDevice.cs | 8 +- NiceHashMiner/Devices/ComputeDeviceManager.cs | 94 +++++++++++++++++-- 3 files changed, 96 insertions(+), 8 deletions(-) diff --git a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h index 2e273a6..e5da942 100644 --- a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h +++ b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h @@ -2,6 +2,8 @@ #define __CL_ENABLE_EXCEPTIONS #define CL_USE_DEPRECATED_OPENCL_2_0_APIS +#define CL_VERSION_1_2 +//#define CL_USE_DEPRECATED_OPENCL_1_1_APIS #include "cl_ext.hpp" diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 766bb16..03f6f94 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -88,7 +88,7 @@ public ComputeDevice(CudaDevice cudaDevice, DeviceGroupType group, int GPUCount) } // GPU AMD - public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount) { + public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount, bool isDetectionFallback) { ID = amdDevice.DeviceID; DeviceGroupType = DeviceGroupType.AMD_OpenCL; Name = amdDevice.DeviceName; @@ -96,7 +96,11 @@ public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount) { IsEtherumCapale = amdDevice.IsEtherumCapable(); DeviceType = DeviceType.AMD; NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_AMD_GPU"), GPUCount); - UUID = amdDevice.UUID; + if (isDetectionFallback) { + UUID = GetUUID(ID, GroupNames.GetGroupName(DeviceGroupType, ID), Name, DeviceGroupType); + } else { + UUID = amdDevice.UUID; + } // sgminer extra IsOptimizedVersion = amdDevice.UseOptimizedVersion; Codename = amdDevice.Codename; diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 8f7d21d..e45731e 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -207,6 +207,8 @@ private class VideoControllerData { public string PNPDeviceID { get; set; } public string DriverVersion { get; set; } public string Status { get; set; } + public string InfSection { get; set; } // get codename for fallback not reliable + public ulong AdapterRAM { get; set; } } private static List AvaliableVideoControllers = new List(); static class WindowsDisplayAdapters { @@ -217,12 +219,17 @@ public static void QueryVideoControllers() { ManagementObjectCollection moc = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController").Get(); bool allVideoContollersOK = true; foreach (var manObj in moc) { + ulong memTmp = 0; + //Int16 ram_Str = manObj["ProtocolSupported"] as Int16; manObj["AdapterRAM"] as string + UInt64.TryParse(manObj.GetPropertyValue("AdapterRAM").ToString(), out memTmp); var vidController = new VideoControllerData() { Name = manObj["Name"] as string, Description = manObj["Description"] as string, PNPDeviceID = manObj["PNPDeviceID"] as string, DriverVersion = manObj["DriverVersion"] as string, - Status = manObj["Status"] as string + Status = manObj["Status"] as string, + InfSection = manObj["InfSection"] as string, + AdapterRAM = memTmp }; stringBuilder.AppendLine("\tWin32_VideoController detected:"); stringBuilder.AppendLine(String.Format("\t\tName {0}", vidController.Name)); @@ -556,9 +563,31 @@ static public void QueryAMD() { } } } + bool isBusID_OK = true; + // check if buss ids are unuque and different from -1 + { + HashSet bus_ids = new HashSet(); + foreach (var amdOclDev in amdGpus) { + if (amdOclDev.AMD_BUS_ID == -1) { + isBusID_OK = false; + break; + } + bus_ids.Add(amdOclDev.AMD_BUS_ID); + } + // check if unique + isBusID_OK = isBusID_OK && bus_ids.Count == amdGpus.Count; + } + if (amdGpus.Count == 0) { Helpers.ConsolePrint(TAG, "AMD GPUs count is 0"); } else { + // print BUS id status + if (isBusID_OK) { + Helpers.ConsolePrint(TAG, "AMD Bus IDs are unique and valid. OK"); + } else { + Helpers.ConsolePrint(TAG, "AMD Bus IDs IS INVALID. Using fallback AMD detection mode"); + } + Helpers.ConsolePrint(TAG, "AMD GPUs count : " + amdGpus.Count.ToString()); Helpers.ConsolePrint(TAG, "AMD Getting device name and serial from ADL"); // ADL @@ -645,6 +674,7 @@ static public void QueryAMD() { } } else { Helpers.ConsolePrint(TAG, "ADL_Adapter_AdapterInfo_Get() returned error code " + ADLRet.ToString()); + isAdlInit = false; } } // Release the memory for the AdapterInfo structure @@ -658,12 +688,17 @@ static public void QueryAMD() { // TODO Helpers.ConsolePrint(TAG, "ADL_Main_Control_Create() returned error code " + ADLRet.ToString()); Helpers.ConsolePrint(TAG, "Check if ADL is properly installed!"); + isAdlInit = false; } } catch (Exception ex) { Helpers.ConsolePrint(TAG, "AMD ADL exception: " + ex.Message); isAdlInit = false; } - if (isAdlInit) { + + /////// + // AMD device creation (in NHM context) + if (isAdlInit && isBusID_OK) { + Helpers.ConsolePrint(TAG, "Using AMD device creation DEFAULT Reliable mappings"); if (amdGpus.Count == _amdDeviceUUID.Count) { Helpers.ConsolePrint(TAG, "AMD OpenCL and ADL AMD query COUNTS GOOD/SAME"); } else { @@ -671,7 +706,7 @@ static public void QueryAMD() { } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(""); - stringBuilder.AppendLine("QueryAMD devices: "); + stringBuilder.AppendLine("QueryAMD [DEFAULT query] devices: "); for (int i_id = 0; i_id < amdGpus.Count; ++i_id) { Avaliable.HasAMD = true; @@ -687,7 +722,7 @@ static public void QueryAMD() { string etherumCapableStr = newAmdDev.IsEtherumCapable() ? "YES" : "NO"; Avaliable.AllAvaliableDevices.Add( - new ComputeDevice(newAmdDev, ++GPUCount)); + new ComputeDevice(newAmdDev, ++GPUCount, false)); // just in case try { stringBuilder.AppendLine(String.Format("\t{0} device{1}:", skipOrAdd, isDisabledGroupStr)); @@ -703,10 +738,57 @@ static public void QueryAMD() { } } Helpers.ConsolePrint(TAG, stringBuilder.ToString()); + } else { + Helpers.ConsolePrint(TAG, "Using AMD device creation FALLBACK UnReliable mappings"); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(""); + stringBuilder.AppendLine("QueryAMD [FALLBACK query] devices: "); + + // get video AMD controllers and sort them by RAM + // (find a way to get PCI BUS Numbers from PNPDeviceID) + List AMDVideoControllers = new List(); + foreach (var vcd in AvaliableVideoControllers) { + if (vcd.Name.ToLower().Contains("amd") + || vcd.Name.ToLower().Contains("radeon") + || vcd.Name.ToLower().Contains("firepro")) { + AMDVideoControllers.Add(vcd); + } + } + // sort by ram not ideal + AMDVideoControllers.Sort((a, b) => (int)(a.AdapterRAM - b.AdapterRAM)); + amdGpus.Sort((a, b) => (int)(a._CL_DEVICE_GLOBAL_MEM_SIZE - b._CL_DEVICE_GLOBAL_MEM_SIZE)); + int minCount = Math.Min(AMDVideoControllers.Count, amdGpus.Count); + + for (int i = 0; i < minCount; ++i) { + Avaliable.HasAMD = true; + + var deviceName = AMDVideoControllers[i].Name; + var newAmdDev = new AmdGpuDevice(amdGpus[i], deviceDriverOld[deviceName]); + newAmdDev.DeviceName = deviceName; + newAmdDev.UUID = "UNUSED"; + bool isDisabledGroup = ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD; + string skipOrAdd = isDisabledGroup ? "SKIPED" : "ADDED"; + string isDisabledGroupStr = isDisabledGroup ? " (AMD group disabled)" : ""; + string etherumCapableStr = newAmdDev.IsEtherumCapable() ? "YES" : "NO"; + + Avaliable.AllAvaliableDevices.Add( + new ComputeDevice(newAmdDev, ++GPUCount, true)); + // just in case + try { + stringBuilder.AppendLine(String.Format("\t{0} device{1}:", skipOrAdd, isDisabledGroupStr)); + stringBuilder.AppendLine(String.Format("\t\tID: {0}", newAmdDev.DeviceID.ToString())); + stringBuilder.AppendLine(String.Format("\t\tNAME: {0}", newAmdDev.DeviceName)); + stringBuilder.AppendLine(String.Format("\t\tCODE_NAME: {0}", newAmdDev.Codename)); + stringBuilder.AppendLine(String.Format("\t\tUUID: {0}", newAmdDev.UUID)); + stringBuilder.AppendLine(String.Format("\t\tMEMORY: {0}", newAmdDev.DeviceGlobalMemory.ToString())); + stringBuilder.AppendLine(String.Format("\t\tETHEREUM: {0}", etherumCapableStr)); + } catch { } + } + Helpers.ConsolePrint(TAG, stringBuilder.ToString()); } } - } - } + } // end is amdPlatformNumFound + } // end is OpenCLSuccess Helpers.ConsolePrint(TAG, "QueryAMD END"); } From eb44530547b08bcacc9bd859d762a25738b9fb82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 1 Dec 2016 12:40:48 +0100 Subject: [PATCH 145/366] Add setting to disable multiple instances --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 4 ++ NiceHashMiner/Forms/Form_Settings.Designer.cs | 57 ++++++++++++----- NiceHashMiner/Forms/Form_Settings.cs | 7 +++ NiceHashMiner/Program.cs | 61 ++++++++++++------- NiceHashMiner/langs/en.lang | 4 +- NiceHashMiner/langs/ru.lang | 4 +- 6 files changed, 98 insertions(+), 39 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index 0c36fae..a6dc90a 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -58,6 +58,9 @@ public class GeneralConfig { // 3rd party miners public Use3rdPartyMiners Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; public bool DownloadInit3rdParty = false; + + public bool AllowMultipleInstances = true; + // device enabled disabled stuff public List LastDevicesSettup = new List(); // @@ -101,6 +104,7 @@ public void SetDefaults() { ContinueMiningIfNoInternetAccess = false; Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; DownloadInit3rdParty = false; + AllowMultipleInstances = true; } public void FixSettingBounds() { diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 94a7e48..d319559 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -125,6 +125,8 @@ private void InitializeComponent() { this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); + this.pictureBox_AllowMultipleInstances = new System.Windows.Forms.PictureBox(); + this.checkBox_AllowMultipleInstances = new System.Windows.Forms.CheckBox(); this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); @@ -176,6 +178,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AllowMultipleInstances)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -211,10 +214,12 @@ private void InitializeComponent() { // // groupBox_Misc // + this.groupBox_Misc.Controls.Add(this.checkBox_AllowMultipleInstances); this.groupBox_Misc.Controls.Add(this.checkBox_DisableDefaultOptimizations); this.groupBox_Misc.Controls.Add(this.checkBox_AMD_DisableAMDTempControl); this.groupBox_Misc.Controls.Add(this.checkBox_AutoStartMining); this.groupBox_Misc.Controls.Add(this.checkBox_HideMiningWindows); + this.groupBox_Misc.Controls.Add(this.pictureBox_AllowMultipleInstances); this.groupBox_Misc.Controls.Add(this.checkBox_MinimizeToTray); this.groupBox_Misc.Controls.Add(this.pictureBox_DisableDefaultOptimizations); this.groupBox_Misc.Controls.Add(this.pictureBox_AMD_DisableAMDTempControl); @@ -239,7 +244,7 @@ private void InitializeComponent() { this.groupBox_Misc.Controls.Add(this.checkBox_ShowDriverVersionWarning); this.groupBox_Misc.Location = new System.Drawing.Point(357, 6); this.groupBox_Misc.Name = "groupBox_Misc"; - this.groupBox_Misc.Size = new System.Drawing.Size(229, 345); + this.groupBox_Misc.Size = new System.Drawing.Size(244, 345); this.groupBox_Misc.TabIndex = 391; this.groupBox_Misc.TabStop = false; this.groupBox_Misc.Text = "Misc:"; @@ -299,7 +304,7 @@ private void InitializeComponent() { // pictureBox_DisableDefaultOptimizations // this.pictureBox_DisableDefaultOptimizations.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(205, 267); + this.pictureBox_DisableDefaultOptimizations.Location = new System.Drawing.Point(221, 267); this.pictureBox_DisableDefaultOptimizations.Name = "pictureBox_DisableDefaultOptimizations"; this.pictureBox_DisableDefaultOptimizations.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDefaultOptimizations.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -309,7 +314,7 @@ private void InitializeComponent() { // pictureBox_AMD_DisableAMDTempControl // this.pictureBox_AMD_DisableAMDTempControl.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(205, 246); + this.pictureBox_AMD_DisableAMDTempControl.Location = new System.Drawing.Point(221, 246); this.pictureBox_AMD_DisableAMDTempControl.Name = "pictureBox_AMD_DisableAMDTempControl"; this.pictureBox_AMD_DisableAMDTempControl.Size = new System.Drawing.Size(18, 18); this.pictureBox_AMD_DisableAMDTempControl.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -319,7 +324,7 @@ private void InitializeComponent() { // pictureBox_NVIDIAP0State // this.pictureBox_NVIDIAP0State.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_NVIDIAP0State.Location = new System.Drawing.Point(205, 225); + this.pictureBox_NVIDIAP0State.Location = new System.Drawing.Point(221, 225); this.pictureBox_NVIDIAP0State.Name = "pictureBox_NVIDIAP0State"; this.pictureBox_NVIDIAP0State.Size = new System.Drawing.Size(18, 18); this.pictureBox_NVIDIAP0State.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -329,7 +334,7 @@ private void InitializeComponent() { // pictureBox_DisableWindowsErrorReporting // this.pictureBox_DisableWindowsErrorReporting.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(205, 204); + this.pictureBox_DisableWindowsErrorReporting.Location = new System.Drawing.Point(221, 204); this.pictureBox_DisableWindowsErrorReporting.Name = "pictureBox_DisableWindowsErrorReporting"; this.pictureBox_DisableWindowsErrorReporting.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableWindowsErrorReporting.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -339,7 +344,7 @@ private void InitializeComponent() { // pictureBox_ShowDriverVersionWarning // this.pictureBox_ShowDriverVersionWarning.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(205, 183); + this.pictureBox_ShowDriverVersionWarning.Location = new System.Drawing.Point(221, 183); this.pictureBox_ShowDriverVersionWarning.Name = "pictureBox_ShowDriverVersionWarning"; this.pictureBox_ShowDriverVersionWarning.Size = new System.Drawing.Size(18, 18); this.pictureBox_ShowDriverVersionWarning.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -349,7 +354,7 @@ private void InitializeComponent() { // pictureBox_StartMiningWhenIdle // this.pictureBox_StartMiningWhenIdle.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_StartMiningWhenIdle.Location = new System.Drawing.Point(205, 162); + this.pictureBox_StartMiningWhenIdle.Location = new System.Drawing.Point(221, 162); this.pictureBox_StartMiningWhenIdle.Name = "pictureBox_StartMiningWhenIdle"; this.pictureBox_StartMiningWhenIdle.Size = new System.Drawing.Size(18, 18); this.pictureBox_StartMiningWhenIdle.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -359,7 +364,7 @@ private void InitializeComponent() { // pictureBox_AutoScaleBTCValues // this.pictureBox_AutoScaleBTCValues.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AutoScaleBTCValues.Location = new System.Drawing.Point(205, 141); + this.pictureBox_AutoScaleBTCValues.Location = new System.Drawing.Point(221, 141); this.pictureBox_AutoScaleBTCValues.Name = "pictureBox_AutoScaleBTCValues"; this.pictureBox_AutoScaleBTCValues.Size = new System.Drawing.Size(18, 18); this.pictureBox_AutoScaleBTCValues.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -369,7 +374,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionAMD // this.pictureBox_DisableDetectionAMD.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionAMD.Location = new System.Drawing.Point(205, 120); + this.pictureBox_DisableDetectionAMD.Location = new System.Drawing.Point(221, 120); this.pictureBox_DisableDetectionAMD.Name = "pictureBox_DisableDetectionAMD"; this.pictureBox_DisableDetectionAMD.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionAMD.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -379,7 +384,7 @@ private void InitializeComponent() { // pictureBox_Use3rdPartyMiners // this.pictureBox_Use3rdPartyMiners.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_Use3rdPartyMiners.Location = new System.Drawing.Point(205, 79); + this.pictureBox_Use3rdPartyMiners.Location = new System.Drawing.Point(221, 79); this.pictureBox_Use3rdPartyMiners.Name = "pictureBox_Use3rdPartyMiners"; this.pictureBox_Use3rdPartyMiners.Size = new System.Drawing.Size(18, 18); this.pictureBox_Use3rdPartyMiners.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -389,7 +394,7 @@ private void InitializeComponent() { // pictureBox_DisableDetectionNVIDIA // this.pictureBox_DisableDetectionNVIDIA.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_DisableDetectionNVIDIA.Location = new System.Drawing.Point(205, 99); + this.pictureBox_DisableDetectionNVIDIA.Location = new System.Drawing.Point(221, 99); this.pictureBox_DisableDetectionNVIDIA.Name = "pictureBox_DisableDetectionNVIDIA"; this.pictureBox_DisableDetectionNVIDIA.Size = new System.Drawing.Size(18, 18); this.pictureBox_DisableDetectionNVIDIA.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -399,7 +404,7 @@ private void InitializeComponent() { // pictureBox_AutoStartMining // this.pictureBox_AutoStartMining.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(205, 18); + this.pictureBox_AutoStartMining.Location = new System.Drawing.Point(221, 18); this.pictureBox_AutoStartMining.Name = "pictureBox_AutoStartMining"; this.pictureBox_AutoStartMining.Size = new System.Drawing.Size(18, 18); this.pictureBox_AutoStartMining.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -409,7 +414,7 @@ private void InitializeComponent() { // pictureBox_MinimizeToTray // this.pictureBox_MinimizeToTray.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_MinimizeToTray.Location = new System.Drawing.Point(205, 60); + this.pictureBox_MinimizeToTray.Location = new System.Drawing.Point(221, 60); this.pictureBox_MinimizeToTray.Name = "pictureBox_MinimizeToTray"; this.pictureBox_MinimizeToTray.Size = new System.Drawing.Size(18, 18); this.pictureBox_MinimizeToTray.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -419,7 +424,7 @@ private void InitializeComponent() { // pictureBox_HideMiningWindows // this.pictureBox_HideMiningWindows.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_HideMiningWindows.Location = new System.Drawing.Point(205, 39); + this.pictureBox_HideMiningWindows.Location = new System.Drawing.Point(221, 39); this.pictureBox_HideMiningWindows.Name = "pictureBox_HideMiningWindows"; this.pictureBox_HideMiningWindows.Size = new System.Drawing.Size(18, 18); this.pictureBox_HideMiningWindows.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; @@ -1280,6 +1285,27 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // + // pictureBox_AllowMultipleInstances + // + this.pictureBox_AllowMultipleInstances.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_AllowMultipleInstances.Location = new System.Drawing.Point(221, 288); + this.pictureBox_AllowMultipleInstances.Name = "pictureBox_AllowMultipleInstances"; + this.pictureBox_AllowMultipleInstances.Size = new System.Drawing.Size(18, 18); + this.pictureBox_AllowMultipleInstances.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_AllowMultipleInstances.TabIndex = 364; + this.pictureBox_AllowMultipleInstances.TabStop = false; + // + // checkBox_AllowMultipleInstances + // + this.checkBox_AllowMultipleInstances.AutoSize = true; + this.checkBox_AllowMultipleInstances.Location = new System.Drawing.Point(6, 289); + this.checkBox_AllowMultipleInstances.Name = "checkBox_AllowMultipleInstances"; + this.checkBox_AllowMultipleInstances.Size = new System.Drawing.Size(139, 17); + this.checkBox_AllowMultipleInstances.TabIndex = 365; + this.checkBox_AllowMultipleInstances.Text = "Allow Multiple Instances"; + this.checkBox_AllowMultipleInstances.UseVisualStyleBackColor = true; + this.checkBox_AllowMultipleInstances.CheckedChanged += new System.EventHandler(this.checkBox_DisableDefaultOptimizations_CheckedChanged); + // // benchmarkLimitControlNVIDIA // this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; @@ -1404,6 +1430,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AllowMultipleInstances)).EndInit(); this.ResumeLayout(false); } @@ -1517,6 +1544,8 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_ContinueMiningIfNoInternetAccess; private System.Windows.Forms.PictureBox pictureBox_Use3rdPartyMiners; private System.Windows.Forms.CheckBox checkBox_Use3rdPartyMiners; + private System.Windows.Forms.CheckBox checkBox_AllowMultipleInstances; + private System.Windows.Forms.PictureBox pictureBox_AllowMultipleInstances; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 4394efe..7460fff 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -107,6 +107,9 @@ private void InitializeToolTip() { toolTip1.SetToolTip(this.checkBox_Use3rdPartyMiners, International.GetText("Form_Settings_General_3rdparty_ToolTip")); toolTip1.SetToolTip(this.pictureBox_Use3rdPartyMiners, International.GetText("Form_Settings_General_3rdparty_ToolTip")); + + toolTip1.SetToolTip(this.checkBox_AllowMultipleInstances, International.GetText("Form_Settings_General_AllowMultipleInstances_ToolTip")); + toolTip1.SetToolTip(this.pictureBox_AllowMultipleInstances, International.GetText("Form_Settings_General_AllowMultipleInstances_ToolTip")); toolTip1.SetToolTip(this.textBox_SwitchMinSecondsFixed, International.GetText("Form_Settings_ToolTip_SwitchMinSecondsFixed")); @@ -237,6 +240,7 @@ private void InitializeGeneralTabTranslations() { checkBox_NVIDIAP0State.Text = International.GetText("Form_Settings_General_NVIDIAP0State"); checkBox_LogToFile.Text = International.GetText("Form_Settings_General_LogToFile"); checkBox_AMD_DisableAMDTempControl.Text = International.GetText("Form_Settings_General_DisableAMDTempControl"); + checkBox_AllowMultipleInstances.Text = International.GetText("Form_Settings_General_AllowMultipleInstances_Text"); label_Language.Text = International.GetText("Form_Settings_General_Language") + ":"; label_BitcoinAddress.Text = International.GetText("BitcoinAddress") + ":"; @@ -310,6 +314,7 @@ private void InitializeGeneralTabCallbacks() { this.checkBox_NVIDIAP0State.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_LogToFile.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); this.checkBox_AutoStartMining.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); + this.checkBox_AllowMultipleInstances.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); } // Add EventHandler for all the general tab's textboxes { @@ -377,6 +382,7 @@ private void InitializeGeneralTabFieldValuesReferences() { checkBox_DisableDefaultOptimizations.Checked = ConfigManager.GeneralConfig.DisableDefaultOptimizations; checkBox_ContinueMiningIfNoInternetAccess.Checked = ConfigManager.GeneralConfig.ContinueMiningIfNoInternetAccess; this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; + this.checkBox_AllowMultipleInstances.Checked = ConfigManager.GeneralConfig.AllowMultipleInstances; } // Textboxes @@ -469,6 +475,7 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { ConfigManager.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; ConfigManager.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; ConfigManager.GeneralConfig.ContinueMiningIfNoInternetAccess = checkBox_ContinueMiningIfNoInternetAccess.Checked; + ConfigManager.GeneralConfig.AllowMultipleInstances = checkBox_AllowMultipleInstances.Checked; } private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, EventArgs e) { diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index 42d8862..f0559b6 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -8,6 +8,7 @@ using Newtonsoft.Json; using System.Globalization; using System.Threading; +using System.Diagnostics; namespace NiceHashMiner { @@ -34,38 +35,52 @@ static void Main(string[] argv) // #1 first initialize config ConfigManager.InitializeConfig(); - if (ConfigManager.GeneralConfig.LogToFile) { - Logger.ConfigureWithFile(); + // #2 check if multiple instances are allowed + bool startProgram = true; + if (ConfigManager.GeneralConfig.AllowMultipleInstances == false) { + try { + Process current = Process.GetCurrentProcess(); + foreach (Process process in Process.GetProcessesByName(current.ProcessName)) { + if (process.Id != current.Id) { + startProgram = false; + } + } + } catch { } } - if (ConfigManager.GeneralConfig.DebugConsole) { - Helpers.AllocConsole(); - } + if (startProgram) { + if (ConfigManager.GeneralConfig.LogToFile) { + Logger.ConfigureWithFile(); + } - // init active display currency after config load - CurrencyConverter.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; + if (ConfigManager.GeneralConfig.DebugConsole) { + Helpers.AllocConsole(); + } - // #2 then parse args - var commandLineArgs = new CommandLineParser(argv); + // init active display currency after config load + CurrencyConverter.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; - Helpers.ConsolePrint("NICEHASH", "Starting up NiceHashMiner v" + Application.ProductVersion); + // #2 then parse args + var commandLineArgs = new CommandLineParser(argv); - if (!ConfigManager.GeneralConfigIsFileExist() && !commandLineArgs.IsLang) - { - Helpers.ConsolePrint("NICEHASH", "No config file found. Running NiceHash Miner for the first time. Choosing a default language."); - Application.Run(new Form_ChooseLanguage()); - } + Helpers.ConsolePrint("NICEHASH", "Starting up NiceHashMiner v" + Application.ProductVersion); + + if (!ConfigManager.GeneralConfigIsFileExist() && !commandLineArgs.IsLang) { + Helpers.ConsolePrint("NICEHASH", "No config file found. Running NiceHash Miner for the first time. Choosing a default language."); + Application.Run(new Form_ChooseLanguage()); + } + + // Init languages + International.Initialize(ConfigManager.GeneralConfig.Language); - // Init languages - International.Initialize(ConfigManager.GeneralConfig.Language); + if (commandLineArgs.IsLang) { + Helpers.ConsolePrint("NICEHASH", "Language is overwritten by command line parameter (-lang)."); + International.Initialize(commandLineArgs.LangValue); + ConfigManager.GeneralConfig.Language = commandLineArgs.LangValue; + } - if (commandLineArgs.IsLang) { - Helpers.ConsolePrint("NICEHASH", "Language is overwritten by command line parameter (-lang)."); - International.Initialize(commandLineArgs.LangValue); - ConfigManager.GeneralConfig.Language = commandLineArgs.LangValue; + Application.Run(new Form_Main()); } - - Application.Run(new Form_Main()); } } diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index ccbcc96..b87d3b0 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -329,6 +329,8 @@ "Form_Main_3rdParty_Button_Agree_Text": "I agree", "Form_Main_3rdParty_Button_Refuse_Text": "I refuse", "Form_Settings_General_3rdparty_Text": "Enable3rdPartyMiners", - "Form_Settings_General_3rdparty_ToolTip": "Use 3rd party closed-source mining software for higher profitability. Usage is on your own responsibility." + "Form_Settings_General_3rdparty_ToolTip": "Use 3rd party closed-source mining software for higher profitability. Usage is on your own responsibility.", + "Form_Settings_General_AllowMultipleInstances_Text": "Allow Multiple Instances", + "Form_Settings_General_AllowMultipleInstances_ToolTip": "When unchecked NiceHash Miner will allow only one instance running (it will close a new started instance if there is an opened instance running).", } } diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 762349e..4002513 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -329,6 +329,8 @@ "Form_Main_3rdParty_Button_Agree_Text": "Я соглашаюсь", "Form_Main_3rdParty_Button_Refuse_Text": "Я отказываюсь", "Form_Settings_General_3rdparty_Text": "Включить сторонние майнеры", - "Form_Settings_General_3rdparty_ToolTip": "Используйте закрытое стороннее программное обеспечение для майнинга для высшей прибыльности. Использование на вашей собственной ответственности." + "Form_Settings_General_3rdparty_ToolTip": "Используйте закрытое стороннее программное обеспечение для майнинга для высшей прибыльности. Использование на вашей собственной ответственности.", + "Form_Settings_General_AllowMultipleInstances_Text": "Разрешить несколько экземпляров", +"Form_Settings_General_AllowMultipleInstances_ToolTip": "Когда не отмечено, NiceHash Miner разрешит работу только одного экземпляра (он закроет новый запущенный экземпляр, если один экземпляр уже работает).", } } \ No newline at end of file From e25c1b2252ac4c98d9834a0f27390156d11c47e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 1 Dec 2016 12:54:03 +0100 Subject: [PATCH 146/366] shrink double format print --- NiceHashMiner/Forms/Form_Main.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 42d8dd8..1b75fc3 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -508,12 +508,12 @@ private void UpdateGlobalRate() if (ConfigManager.GeneralConfig.AutoScaleBTCValues && TotalRate < 0.1) { toolStripStatusLabelBTCDayText.Text = "mBTC/" + International.GetText("Day"); - toolStripStatusLabelGlobalRateValue.Text = (TotalRate * 1000).ToString("F7", CultureInfo.InvariantCulture); + toolStripStatusLabelGlobalRateValue.Text = (TotalRate * 1000).ToString("F5", CultureInfo.InvariantCulture); } else { toolStripStatusLabelBTCDayText.Text = "BTC/" + International.GetText("Day"); - toolStripStatusLabelGlobalRateValue.Text = (TotalRate).ToString("F8", CultureInfo.InvariantCulture); + toolStripStatusLabelGlobalRateValue.Text = (TotalRate).ToString("F6", CultureInfo.InvariantCulture); } toolStripStatusLabelBTCDayValue.Text = CurrencyConverter.ConvertToActiveCurrency((TotalRate * Globals.BitcoinRate)).ToString("F2", CultureInfo.InvariantCulture); @@ -531,12 +531,12 @@ void BalanceCheck_Tick(object sender, EventArgs e) if (ConfigManager.GeneralConfig.AutoScaleBTCValues && Balance < 0.1) { toolStripStatusLabelBalanceBTCCode.Text = "mBTC"; - toolStripStatusLabelBalanceBTCValue.Text = (Balance * 1000).ToString("F7", CultureInfo.InvariantCulture); + toolStripStatusLabelBalanceBTCValue.Text = (Balance * 1000).ToString("F5", CultureInfo.InvariantCulture); } else { toolStripStatusLabelBalanceBTCCode.Text = "BTC"; - toolStripStatusLabelBalanceBTCValue.Text = Balance.ToString("F8", CultureInfo.InvariantCulture); + toolStripStatusLabelBalanceBTCValue.Text = Balance.ToString("F6", CultureInfo.InvariantCulture); } //Helpers.ConsolePrint("CurrencyConverter", "Using CurrencyConverter" + ConfigManager.Instance.GeneralConfig.DisplayCurrency); @@ -746,9 +746,9 @@ private string FormatPayingOutput(double paying) string ret = ""; if (ConfigManager.GeneralConfig.AutoScaleBTCValues && paying < 0.1) - ret = (paying * 1000).ToString("F7", CultureInfo.InvariantCulture) + " mBTC/" + International.GetText("Day"); + ret = (paying * 1000).ToString("F5", CultureInfo.InvariantCulture) + " mBTC/" + International.GetText("Day"); else - ret = paying.ToString("F8", CultureInfo.InvariantCulture) + " BTC/" + International.GetText("Day"); + ret = paying.ToString("F6", CultureInfo.InvariantCulture) + " BTC/" + International.GetText("Day"); return ret; } From 58ab586fc9ca85b2f4b590a7915f5804da8b41c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 1 Dec 2016 15:09:23 +0100 Subject: [PATCH 147/366] bus number checking fix --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index e45731e..9f111a1 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -568,7 +568,7 @@ static public void QueryAMD() { { HashSet bus_ids = new HashSet(); foreach (var amdOclDev in amdGpus) { - if (amdOclDev.AMD_BUS_ID == -1) { + if (amdOclDev.AMD_BUS_ID < 0) { isBusID_OK = false; break; } From 881a8741652e67feac4bf07433722ba394d084b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 1 Dec 2016 15:57:04 +0100 Subject: [PATCH 148/366] disable ZCash for AMD GPUs with less RAM than 2GB --- NiceHashMiner/Devices/GroupAlgorithms.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 91acefa..4a21cc2 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -71,6 +71,10 @@ public static Dictionary CreateForDevice(ComputeDevice if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto) && device.IsEtherumCapale == false) { algoSettings.Remove(AlgorithmType.DaggerHashimoto); } + // also check for Equihash as it needs 2GB GPU + if (algoSettings.ContainsKey(AlgorithmType.Equihash) && device.IsEtherumCapale == false) { + algoSettings.Remove(AlgorithmType.Equihash); + } } return algoSettings; } From 8587b87999e4022e3849a68a992bb3f39219b0e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 1 Dec 2016 16:05:43 +0100 Subject: [PATCH 149/366] ignore prev commit changes --- NiceHashMiner/Devices/GroupAlgorithms.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 4a21cc2..9c455da 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -71,10 +71,10 @@ public static Dictionary CreateForDevice(ComputeDevice if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto) && device.IsEtherumCapale == false) { algoSettings.Remove(AlgorithmType.DaggerHashimoto); } - // also check for Equihash as it needs 2GB GPU - if (algoSettings.ContainsKey(AlgorithmType.Equihash) && device.IsEtherumCapale == false) { - algoSettings.Remove(AlgorithmType.Equihash); - } + //// also check for Equihash as it needs 2GB GPU + //if (algoSettings.ContainsKey(AlgorithmType.Equihash) && device.IsEtherumCapale == false) { + // algoSettings.Remove(AlgorithmType.Equihash); + //} } return algoSettings; } From 45473180d36405599e05074a05cf0fa759d65309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 1 Dec 2016 18:33:25 +0100 Subject: [PATCH 150/366] remove pending suffix --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 1b75fc3..570b61a 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -49,7 +49,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "_PENDING"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; From 7189fc93d9052e86cf61ec924793a42d90f9f32e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 2 Dec 2016 09:49:22 +0100 Subject: [PATCH 151/366] restore NVIDIA CrytoNight for SM30+ --- NiceHashMiner/Devices/GroupAlgorithms.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 9c455da..4e9b29f 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -142,7 +142,7 @@ private static Dictionary CreateDefaultsForGroup(Devic //{ AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") }, - //{ AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, + { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") }, { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; @@ -167,6 +167,9 @@ private static Dictionary CreateDefaultsForGroup(Devic if (ret.ContainsKey(AlgorithmType.DaggerHashimoto)) { ret.Remove(AlgorithmType.DaggerHashimoto); } + if (ret.ContainsKey(AlgorithmType.CryptoNight)) { + ret.Remove(AlgorithmType.CryptoNight); + } } return ret; } From a31df1bc3e69408250f6248d4350ba175b9418b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 2 Dec 2016 10:06:42 +0100 Subject: [PATCH 152/366] eqm benchmark parsing update --- NiceHashMiner/Miners/Equihash/eqm.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 0a43673..d003447 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -48,13 +48,14 @@ protected override string GetDevicesCommandString() { } // benchmark stuff + const string TOTAL_MES = "Total measured:"; protected override bool BenchmarkParseLine(string outdata) { - if (outdata.Contains(Iter_PER_SEC)) { - curSpeed = getNumber(outdata, "Measured: ", Iter_PER_SEC) * SolMultFactor; + if (outdata.Contains(TOTAL_MES) && outdata.Contains(Iter_PER_SEC)) { + curSpeed = getNumber(outdata, TOTAL_MES, Iter_PER_SEC) * SolMultFactor; } - if (outdata.Contains(Sols_PER_SEC)) { - var sols = getNumber(outdata, "Measured: ", Sols_PER_SEC); + if (outdata.Contains(TOTAL_MES) && outdata.Contains(Sols_PER_SEC)) { + var sols = getNumber(outdata, TOTAL_MES, Sols_PER_SEC); if (sols > 0) { BenchmarkAlgorithm.BenchmarkSpeed = curSpeed; return true; From fc73dc7e89a55f4f3a7dd82471fe82ec2bb87c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 2 Dec 2016 12:14:58 +0100 Subject: [PATCH 153/366] update bins dl-link --- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 43eb290..1fbc5d7 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -17,7 +17,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_6.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_8.zip", "bins.zip", "bin"); From 1ee28da498977b20e90fa1efb32035e16839a267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 2 Dec 2016 16:22:58 +0100 Subject: [PATCH 154/366] Check AMD Polaris for neoscrypt exception --- NiceHashMiner/Devices/AmdGpuDevice.cs | 4 +++- NiceHashMiner/Devices/ComputeDevice.cs | 2 ++ NiceHashMiner/Devices/ComputeDeviceManager.cs | 21 ++++++++++++++----- NiceHashMiner/Devices/GroupAlgorithms.cs | 4 ++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/NiceHashMiner/Devices/AmdGpuDevice.cs b/NiceHashMiner/Devices/AmdGpuDevice.cs index 1598023..9da41a2 100644 --- a/NiceHashMiner/Devices/AmdGpuDevice.cs +++ b/NiceHashMiner/Devices/AmdGpuDevice.cs @@ -18,10 +18,12 @@ public class AmdGpuDevice { public ulong DeviceGlobalMemory { get { return _openClSubset._CL_DEVICE_GLOBAL_MEM_SIZE; } } public bool UseOptimizedVersion { get; private set; } private OpenCLDevice _openClSubset; + public readonly string InfSection; // has arhitecture string public string Codename { get { return _openClSubset._CL_DEVICE_NAME; } } - public AmdGpuDevice(OpenCLDevice openClSubset, bool isOldDriver) { + public AmdGpuDevice(OpenCLDevice openClSubset, bool isOldDriver, string infSection) { + InfSection = infSection; _openClSubset = openClSubset; // Check for optimized version // first if not optimized diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 03f6f94..b440464 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -38,6 +38,7 @@ public class ComputeDevice // sgminer extra quickfix public bool IsOptimizedVersion { get; private set; } public string Codename { get; private set; } + public string InfSection { get; private set; } //public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } public Dictionary AlgorithmSettings { get; set; } @@ -104,6 +105,7 @@ public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount, bool isDetectionFallb // sgminer extra IsOptimizedVersion = amdDevice.UseOptimizedVersion; Codename = amdDevice.Codename; + InfSection = amdDevice.InfSection; AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); } diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 9f111a1..b7978cc 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -207,7 +207,7 @@ private class VideoControllerData { public string PNPDeviceID { get; set; } public string DriverVersion { get; set; } public string Status { get; set; } - public string InfSection { get; set; } // get codename for fallback not reliable + public string InfSection { get; set; } // get arhitecture public ulong AdapterRAM { get; set; } } private static List AvaliableVideoControllers = new List(); @@ -237,6 +237,8 @@ public static void QueryVideoControllers() { stringBuilder.AppendLine(String.Format("\t\tPNPDeviceID {0}", vidController.PNPDeviceID)); stringBuilder.AppendLine(String.Format("\t\tDriverVersion {0}", vidController.DriverVersion)); stringBuilder.AppendLine(String.Format("\t\tStatus {0}", vidController.Status)); + stringBuilder.AppendLine(String.Format("\t\tInfSection {0}", vidController.InfSection)); + stringBuilder.AppendLine(String.Format("\t\tAdapterRAM {0}", vidController.AdapterRAM)); // check if controller ok if (allVideoContollersOK && !vidController.Status.ToLower().Equals("ok")) { @@ -594,7 +596,7 @@ static public void QueryAMD() { bool isAdlInit = true; // ADL does not get devices in order map devices by bus number // bus id, - Dictionary> _busIdsInfo = new Dictionary>(); + Dictionary> _busIdsInfo = new Dictionary>(); List _amdDeviceName = new List(); List _amdDeviceUUID = new List(); try { @@ -642,6 +644,14 @@ static public void QueryAMD() { || devName.ToLower().Contains("firepro")) { string PNPStr = OSAdapterInfoData.ADLAdapterInfo[i].PNPString; + // find vi controller pnp + string infSection = ""; + foreach (var v_ctrl in AvaliableVideoControllers) { + if(v_ctrl.PNPDeviceID == PNPStr) { + infSection = v_ctrl.InfSection; + } + } + var backSlashLast = PNPStr.LastIndexOf('\\'); var serial = PNPStr.Substring(backSlashLast, PNPStr.Length - backSlashLast); var end_0 = serial.IndexOf('&'); @@ -665,7 +675,7 @@ static public void QueryAMD() { //_busIds.Add(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber); _amdDeviceName.Add(devName); if (!_busIdsInfo.ContainsKey(budId)) { - var nameUuid = new Tuple(devName, uuid); + var nameUuid = new Tuple(devName, uuid, infSection); _busIdsInfo.Add(budId, nameUuid); } } @@ -713,7 +723,7 @@ static public void QueryAMD() { int busID = amdGpus[i_id].AMD_BUS_ID; if (busID != -1 && _busIdsInfo.ContainsKey(busID)) { var deviceName = _busIdsInfo[busID].Item1; - var newAmdDev = new AmdGpuDevice(amdGpus[i_id], deviceDriverOld[deviceName]); + var newAmdDev = new AmdGpuDevice(amdGpus[i_id], deviceDriverOld[deviceName], _busIdsInfo[busID].Item3); newAmdDev.DeviceName = deviceName; newAmdDev.UUID = _busIdsInfo[busID].Item2; bool isDisabledGroup = ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD; @@ -763,7 +773,8 @@ static public void QueryAMD() { Avaliable.HasAMD = true; var deviceName = AMDVideoControllers[i].Name; - var newAmdDev = new AmdGpuDevice(amdGpus[i], deviceDriverOld[deviceName]); + if(AMDVideoControllers[i].InfSection == null) AMDVideoControllers[i].InfSection = ""; + var newAmdDev = new AmdGpuDevice(amdGpus[i], deviceDriverOld[deviceName], AMDVideoControllers[i].InfSection); newAmdDev.DeviceName = deviceName; newAmdDev.UUID = "UNUSED"; bool isDisabledGroup = ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 4e9b29f..af5b0c4 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -48,7 +48,7 @@ public static Dictionary CreateForDevice(ComputeDevice // Ellesmere, Polaris // Ellesmere sgminer workaround, keep this until sgminer is fixed to work with Ellesmere - if (device.Codename.Contains("Ellesmere") && Globals.IsEllesmereSgminerIgnore) { + if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris")) && Globals.IsEllesmereSgminerIgnore) { // remove all algos except equi and dagger List toRemove = new List(); foreach (var key in algoSettings.Keys) { @@ -60,7 +60,7 @@ public static Dictionary CreateForDevice(ComputeDevice foreach (var key in toRemove) { algoSettings.Remove(key); } - } else if (device.Codename.Contains("Ellesmere")) { + } else if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris"))) { if (algoSettings.ContainsKey(AlgorithmType.NeoScrypt)) { algoSettings.Remove(AlgorithmType.NeoScrypt); } From fc0bed30179eb008b94f565ca408e0623d2daab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 2 Dec 2016 22:38:40 +0100 Subject: [PATCH 155/366] 2 critical errors fixed, config path checking, video controller potential null string handling --- .../Configs/ConfigJsonFile/ConfigFile.cs | 1 + NiceHashMiner/Devices/ComputeDeviceManager.cs | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs index 1e6ddd7..ca936fb 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs @@ -58,6 +58,7 @@ public T ReadFile() { } public void Commit(T file) { + CheckAndCreateConfigsFolder(); if (file == null) { Helpers.ConsolePrint(TAG, String.Format("Commit for FILE {0} IGNORED. Passed null object", _filePath)); return; diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index b7978cc..8df728c 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -212,6 +212,18 @@ private class VideoControllerData { } private static List AvaliableVideoControllers = new List(); static class WindowsDisplayAdapters { + + private static string SafeGetProperty(ManagementBaseObject mbo, string key) { + try { + object o = mbo.GetPropertyValue(key); + if(o != null) { + return o.ToString(); + } + } catch {} + + return "key is null"; + } + public static void QueryVideoControllers() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(""); @@ -221,14 +233,14 @@ public static void QueryVideoControllers() { foreach (var manObj in moc) { ulong memTmp = 0; //Int16 ram_Str = manObj["ProtocolSupported"] as Int16; manObj["AdapterRAM"] as string - UInt64.TryParse(manObj.GetPropertyValue("AdapterRAM").ToString(), out memTmp); + UInt64.TryParse(SafeGetProperty(manObj, "AdapterRAM"), out memTmp); var vidController = new VideoControllerData() { - Name = manObj["Name"] as string, - Description = manObj["Description"] as string, - PNPDeviceID = manObj["PNPDeviceID"] as string, - DriverVersion = manObj["DriverVersion"] as string, - Status = manObj["Status"] as string, - InfSection = manObj["InfSection"] as string, + Name = SafeGetProperty(manObj, "Name"), + Description = SafeGetProperty(manObj, "Description"), + PNPDeviceID = SafeGetProperty(manObj, "PNPDeviceID"), + DriverVersion = SafeGetProperty(manObj, "DriverVersion"), + Status = SafeGetProperty(manObj, "Status"), + InfSection = SafeGetProperty(manObj, "InfSection"), AdapterRAM = memTmp }; stringBuilder.AppendLine("\tWin32_VideoController detected:"); From d4bb889d6bac9a299d4445ba7949c2f422b87cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 2 Dec 2016 22:55:51 +0100 Subject: [PATCH 156/366] version bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 08dda19..b9c3fd0 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.8")] -[assembly: AssemblyFileVersion("1.7.3.8")] +[assembly: AssemblyVersion("1.7.3.9")] +[assembly: AssemblyFileVersion("1.7.3.9")] From e821905aebc2b164bda020621047e444fadd93d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 2 Dec 2016 23:31:02 +0100 Subject: [PATCH 157/366] change default labels --- .../Forms/Components/GroupProfitControl.Designer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Forms/Components/GroupProfitControl.Designer.cs b/NiceHashMiner/Forms/Components/GroupProfitControl.Designer.cs index fdfeb25..6f0330b 100644 --- a/NiceHashMiner/Forms/Components/GroupProfitControl.Designer.cs +++ b/NiceHashMiner/Forms/Components/GroupProfitControl.Designer.cs @@ -45,7 +45,7 @@ private void InitializeComponent() { this.groupBoxMinerGroup.Size = new System.Drawing.Size(525, 32); this.groupBoxMinerGroup.TabIndex = 108; this.groupBoxMinerGroup.TabStop = false; - this.groupBoxMinerGroup.Text = "GPU NVIDIA5.x: Devices { 1 * GTX 970, 1 x GTX 990 } "; + this.groupBoxMinerGroup.Text = "Mining Devices { N/A } "; // // labelSpeedIndicator // @@ -91,9 +91,9 @@ private void InitializeComponent() { this.labelSpeedValue.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); this.labelSpeedValue.Location = new System.Drawing.Point(81, 16); this.labelSpeedValue.Name = "labelSpeedValue"; - this.labelSpeedValue.Size = new System.Drawing.Size(71, 13); + this.labelSpeedValue.Size = new System.Drawing.Size(30, 13); this.labelSpeedValue.TabIndex = 107; - this.labelSpeedValue.Text = "0.000 kH/s"; + this.labelSpeedValue.Text = "N/A"; // // GroupProfitControl // From 7484aa818581c6e52d9bfec7f907437d0f885256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 5 Dec 2016 10:49:17 +0100 Subject: [PATCH 158/366] bug fixes and feature added feature start mining after benchmark. bug fixes, lower internet conectivity check interval, resume correctly when internet is avaliable, show notification when cannot start mining (benchmark needed, no algorithms have been selected and no devices selected, and a general fallback msg is mining session returns false --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 6 +- .../Forms/Form_Benchmark.Designer.cs | 16 +- NiceHashMiner/Forms/Form_Benchmark.cs | 15 +- NiceHashMiner/Forms/Form_Main.cs | 113 +++++---- NiceHashMiner/Forms/Form_Settings.Designer.cs | 230 +++++++++--------- NiceHashMiner/Forms/Form_Settings.cs | 10 +- NiceHashMiner/Miners/MiningSession.cs | 22 +- NiceHashMiner/langs/en.lang | 7 +- NiceHashMiner/langs/ru.lang | 4 +- 9 files changed, 235 insertions(+), 188 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index a6dc90a..892ca1a 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -53,7 +53,8 @@ public class GeneralConfig { public DagGenerationType EthminerDagGenerationType = DagGenerationType.SingleKeep; public int ApiBindPortPoolStart = 5100; public double MinimumProfit = 0; - public bool ContinueMiningIfNoInternetAccess = false; + //public bool ContinueMiningIfNoInternetAccess = false; + public bool IdleWhenNoInternetAccess = true; public bool DownloadInit = false; // 3rd party miners public Use3rdPartyMiners Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; @@ -101,7 +102,8 @@ public void SetDefaults() { MinimumProfit = 0; EthminerDagGenerationType = DagGenerationType.SingleKeep; DownloadInit = false; - ContinueMiningIfNoInternetAccess = false; + //ContinueMiningIfNoInternetAccess = false; + IdleWhenNoInternetAccess = true; Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; DownloadInit3rdParty = false; AllowMultipleInstances = true; diff --git a/NiceHashMiner/Forms/Form_Benchmark.Designer.cs b/NiceHashMiner/Forms/Form_Benchmark.Designer.cs index af59d0e..04eea90 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.Designer.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.Designer.cs @@ -23,7 +23,6 @@ protected override void Dispose(bool disposing) { /// the contents of this method with the code editor. /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form_Benchmark)); this.StartStopBtn = new System.Windows.Forms.Button(); this.CloseBtn = new System.Windows.Forms.Button(); this.groupBoxBenchmarkProgress = new System.Windows.Forms.GroupBox(); @@ -31,6 +30,7 @@ private void InitializeComponent() { this.progressBarBenchmarkSteps = new System.Windows.Forms.ProgressBar(); this.radioButton_SelectedUnbenchmarked = new System.Windows.Forms.RadioButton(); this.radioButton_RE_SelectedUnbenchmarked = new System.Windows.Forms.RadioButton(); + this.checkBox_StartMiningAfterBenchmark = new System.Windows.Forms.CheckBox(); this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.benchmarkOptions1 = new NiceHashMiner.Forms.Components.BenchmarkOptions(); this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); @@ -108,6 +108,17 @@ private void InitializeComponent() { this.radioButton_RE_SelectedUnbenchmarked.UseVisualStyleBackColor = true; this.radioButton_RE_SelectedUnbenchmarked.CheckedChanged += new System.EventHandler(this.radioButton_RE_SelectedUnbenchmarked_CheckedChanged); // + // checkBox_StartMiningAfterBenchmark + // + this.checkBox_StartMiningAfterBenchmark.AutoSize = true; + this.checkBox_StartMiningAfterBenchmark.Location = new System.Drawing.Point(350, 318); + this.checkBox_StartMiningAfterBenchmark.Name = "checkBox_StartMiningAfterBenchmark"; + this.checkBox_StartMiningAfterBenchmark.Size = new System.Drawing.Size(161, 17); + this.checkBox_StartMiningAfterBenchmark.TabIndex = 111; + this.checkBox_StartMiningAfterBenchmark.Text = "Start mining after benchmark"; + this.checkBox_StartMiningAfterBenchmark.UseVisualStyleBackColor = true; + this.checkBox_StartMiningAfterBenchmark.CheckedChanged += new System.EventHandler(this.checkBox_StartMiningAfterBenchmark_CheckedChanged); + // // algorithmsListView1 // this.algorithmsListView1.BenchmarkCalculation = null; @@ -142,6 +153,7 @@ private void InitializeComponent() { this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(604, 401); + this.Controls.Add(this.checkBox_StartMiningAfterBenchmark); this.Controls.Add(this.radioButton_RE_SelectedUnbenchmarked); this.Controls.Add(this.radioButton_SelectedUnbenchmarked); this.Controls.Add(this.algorithmsListView1); @@ -151,7 +163,6 @@ private void InitializeComponent() { this.Controls.Add(this.CloseBtn); this.Controls.Add(this.devicesListViewEnableControl1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form_Benchmark"; @@ -176,6 +187,7 @@ private void InitializeComponent() { private Components.AlgorithmsListView algorithmsListView1; private System.Windows.Forms.RadioButton radioButton_SelectedUnbenchmarked; private System.Windows.Forms.RadioButton radioButton_RE_SelectedUnbenchmarked; + private System.Windows.Forms.CheckBox checkBox_StartMiningAfterBenchmark; } diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 492c842..d3dfef4 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -31,6 +31,8 @@ public partial class Form_Benchmark : Form, IListItemCheckColorSetter, IBenchmar private Timer _benchmarkingTimer; private int dotCount = 0; + public bool StartMining { get; private set; } + private struct DeviceAlgo { public string Device { get; set; } public string Algorithm { get; set; } @@ -101,6 +103,7 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm InitializeComponent(); this.Icon = NiceHashMiner.Properties.Resources.logo; + StartMining = false; _singleBenchmarkType = singleBenchmarkType; benchmarkOptions1.SetPerformanceType(benchmarkPerformanceType); @@ -201,6 +204,7 @@ private void InitLocale() { groupBoxBenchmarkProgress.Text = International.GetText("FormBenchmark_Benchmark_GroupBoxStatus"); radioButton_SelectedUnbenchmarked.Text = International.GetText("FormBenchmark_Benchmark_All_Selected_Unbenchmarked"); radioButton_RE_SelectedUnbenchmarked.Text = International.GetText("FormBenchmark_Benchmark_All_Selected_ReUnbenchmarked"); + checkBox_StartMiningAfterBenchmark.Text = International.GetText("Form_Benchmark_checkbox_StartMiningAfterBenchmark"); } private void StartStopBtn_Click(object sender, EventArgs e) { @@ -441,12 +445,12 @@ void EndBenchmark() { BenchmarkStoppedGUISettings(); // check if all ok - if(_benchmarkFailedAlgoPerDev.Count == 0) { + if(_benchmarkFailedAlgoPerDev.Count == 0 && StartMining == false) { MessageBox.Show( International.GetText("FormBenchmark_Benchmark_Finish_Succes_MsgBox_Msg"), International.GetText("FormBenchmark_Benchmark_Finish_MsgBox_Title"), MessageBoxButtons.OK); - } else { + } else if (StartMining == false) { var result = MessageBox.Show( International.GetText("FormBenchmark_Benchmark_Finish_Fail_MsgBox_Msg"), International.GetText("FormBenchmark_Benchmark_Finish_MsgBox_Title"), @@ -465,7 +469,7 @@ void EndBenchmark() { } } } - if (ExitWhenFinished) { + if (ExitWhenFinished || StartMining) { this.Close(); } } @@ -473,7 +477,6 @@ void EndBenchmark() { public void SetCurrentStatus(string status) { this.Invoke((MethodInvoker)delegate { - //algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, status); algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, getDotsWaitString()); }); } @@ -598,5 +601,9 @@ private void radioButton_RE_SelectedUnbenchmarked_CheckedChanged(object sender, algorithmsListView1.ResetListItemColors(); } + private void checkBox_StartMiningAfterBenchmark_CheckedChanged(object sender, EventArgs e) { + this.StartMining = this.checkBox_StartMiningAfterBenchmark.Checked; + } + } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 570b61a..c8c0e96 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -44,7 +44,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, private Random R; private Form_Loading LoadingScreen; - private Form BenchmarkForm; + private Form_Benchmark BenchmarkForm; int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; @@ -699,9 +699,13 @@ private void buttonBenchmark_Click(object sender, EventArgs e) BenchmarkForm = new Form_Benchmark(); SetChildFormCenter(BenchmarkForm); BenchmarkForm.ShowDialog(); + bool startMining = BenchmarkForm.StartMining; BenchmarkForm = null; InitMainConfigGUIData(); + if (startMining) { + buttonStartMining_Click(null, null); + } } @@ -732,6 +736,9 @@ private void buttonStartMining_Click(object sender, EventArgs e) { if (StartMining(true) == false) { IsManuallyStarted = false; StopMining(); + MessageBox.Show(International.GetText("Form_Main_StartMiningReturnedFalse"), + International.GetText("Error_with_Exclamation"), + MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -837,48 +844,60 @@ private bool StartMining(bool showWarnings) { return false; } - //// TODO - //// first value is a boolean if initialized or not - //var tuplePair = DeviceBenchmarkConfigManager.Instance.IsEnabledBenchmarksInitialized(); - //bool isBenchInit = tuplePair.Item1; - //Dictionary> nonBenchmarkedPerDevice = tuplePair.Item2; - //// Check if the user has run benchmark first - //if (!isBenchInit) { - // DialogResult result = MessageBox.Show(International.GetText("EnabledUnbenchmarkedAlgorithmsWarning"), - // International.GetText("Warning_with_Exclamation"), - // MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); - // if (result == System.Windows.Forms.DialogResult.Yes) { - // List enabledDevices = new List(); - // HashSet deviceNames = new HashSet(); - // foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // if (cdev.Enabled && !deviceNames.Contains(cdev.Name)) { - // deviceNames.Add(cdev.Name); - // enabledDevices.Add(cdev); - // } - // } - // BenchmarkForm = new Form_Benchmark( - // BenchmarkPerformanceType.Standard, - // true); - // SetChildFormCenter(BenchmarkForm); - // BenchmarkForm.ShowDialog(); - // BenchmarkForm = null; - // InitMainConfigGUIData(); - // } else if (result == System.Windows.Forms.DialogResult.No) { - // // check devices without benchmarks - // foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // bool Enabled = false; - // foreach (var algo in cdev.AlgorithmSettings) { - // if (algo.Value.BenchmarkSpeed > 0) { - // Enabled = true; - // break; - // } - // } - // cdev.Enabled = Enabled; - // } - // } else { - // return; - // } - //} + + // Check if there are unbenchmakred algorithms + bool isBenchInit = true; + bool hasAnyAlgoEnabled = false; + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + if (cdev.Enabled) { + foreach (var algo in cdev.AlgorithmSettings.Values) { + if (algo.Skip == false) { + hasAnyAlgoEnabled = true; + if (algo.BenchmarkSpeed == 0) { + isBenchInit = false; + break; + } + } + } + } + } + // Check if the user has run benchmark first + if (!isBenchInit) { + DialogResult result = MessageBox.Show(International.GetText("EnabledUnbenchmarkedAlgorithmsWarning"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); + if (result == System.Windows.Forms.DialogResult.Yes) { + List enabledDevices = new List(); + HashSet deviceNames = new HashSet(); + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + if (cdev.Enabled && !deviceNames.Contains(cdev.Name)) { + deviceNames.Add(cdev.Name); + enabledDevices.Add(cdev); + } + } + BenchmarkForm = new Form_Benchmark( + BenchmarkPerformanceType.Standard, + true); + SetChildFormCenter(BenchmarkForm); + BenchmarkForm.ShowDialog(); + BenchmarkForm = null; + InitMainConfigGUIData(); + } else if (result == System.Windows.Forms.DialogResult.No) { + // check devices without benchmarks + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + bool Enabled = false; + foreach (var algo in cdev.AlgorithmSettings) { + if (algo.Value.BenchmarkSpeed > 0) { + Enabled = true; + break; + } + } + cdev.Enabled = Enabled; + } + } else { + return false; + } + } // check if any device enabled // check devices without benchmarks @@ -897,6 +916,14 @@ private bool StartMining(bool showWarnings) { } return false; } + if (!hasAnyAlgoEnabled) { + if (showWarnings) { + DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_Algorithms_For_Mining"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + return false; + } textBoxBTCAddress.Enabled = false; textBoxWorkerName.Enabled = false; diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index d319559..09d9481 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -28,10 +28,12 @@ private void InitializeComponent() { this.tabControlGeneral = new System.Windows.Forms.TabControl(); this.tabPageGeneral = new System.Windows.Forms.TabPage(); this.groupBox_Misc = new System.Windows.Forms.GroupBox(); + this.checkBox_AllowMultipleInstances = new System.Windows.Forms.CheckBox(); this.checkBox_DisableDefaultOptimizations = new System.Windows.Forms.CheckBox(); this.checkBox_AMD_DisableAMDTempControl = new System.Windows.Forms.CheckBox(); this.checkBox_AutoStartMining = new System.Windows.Forms.CheckBox(); this.checkBox_HideMiningWindows = new System.Windows.Forms.CheckBox(); + this.pictureBox_AllowMultipleInstances = new System.Windows.Forms.PictureBox(); this.checkBox_MinimizeToTray = new System.Windows.Forms.CheckBox(); this.pictureBox_DisableDefaultOptimizations = new System.Windows.Forms.PictureBox(); this.pictureBox_AMD_DisableAMDTempControl = new System.Windows.Forms.PictureBox(); @@ -63,13 +65,13 @@ private void InitializeComponent() { this.pictureBox_LogToFile = new System.Windows.Forms.PictureBox(); this.checkBox_DebugConsole = new System.Windows.Forms.CheckBox(); this.groupBox_Main = new System.Windows.Forms.GroupBox(); - this.checkBox_ContinueMiningIfNoInternetAccess = new System.Windows.Forms.CheckBox(); + this.checkBox_IdleWhenNoInternetAccess = new System.Windows.Forms.CheckBox(); this.pictureBox_WorkerName = new System.Windows.Forms.PictureBox(); this.pictureBox_MinProfit = new System.Windows.Forms.PictureBox(); this.pictureBox_ServiceLocation = new System.Windows.Forms.PictureBox(); this.pictureBox_Info_BitcoinAddress = new System.Windows.Forms.PictureBox(); this.textBox_MinProfit = new System.Windows.Forms.TextBox(); - this.pictureBox_ContinueMiningIfNoInternetAccess = new System.Windows.Forms.PictureBox(); + this.pictureBox_IdleWhenNoInternetAccess = new System.Windows.Forms.PictureBox(); this.label_BitcoinAddress = new System.Windows.Forms.Label(); this.label_MinProfit = new System.Windows.Forms.Label(); this.label_WorkerName = new System.Windows.Forms.Label(); @@ -118,24 +120,23 @@ private void InitializeComponent() { this.textBox_MinerRestartDelayMS = new System.Windows.Forms.TextBox(); this.textBox_MinerAPIQueryInterval = new System.Windows.Forms.TextBox(); this.groupBoxBenchmarkTimeLimits = new System.Windows.Forms.GroupBox(); + this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); + this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); this.tabPageDevicesAlgos = new System.Windows.Forms.TabPage(); + this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); + this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); this.groupBoxAlgorithmSettings = new System.Windows.Forms.GroupBox(); + this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.buttonAllProfit = new System.Windows.Forms.Button(); this.buttonSelectedProfit = new System.Windows.Forms.Button(); this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.pictureBox_AllowMultipleInstances = new System.Windows.Forms.PictureBox(); - this.checkBox_AllowMultipleInstances = new System.Windows.Forms.CheckBox(); - this.benchmarkLimitControlNVIDIA = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlCPU = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.benchmarkLimitControlAMD = new NiceHashMiner.Forms.Components.BenchmarkLimitControl(); - this.devicesListViewEnableControl1 = new NiceHashMiner.Forms.Components.DevicesListViewEnableControl(); - this.algorithmSettingsControl1 = new NiceHashMiner.Forms.Components.AlgorithmSettingsControl(); - this.algorithmsListView1 = new NiceHashMiner.Forms.Components.AlgorithmsListView(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AllowMultipleInstances)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDefaultOptimizations)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_NVIDIAP0State)).BeginInit(); @@ -158,7 +159,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinProfit)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ServiceLocation)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Info_BitcoinAddress)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ContinueMiningIfNoInternetAccess)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_IdleWhenNoInternetAccess)).BeginInit(); this.groupBox_Localization.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_displayCurrency)).BeginInit(); @@ -178,7 +179,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AllowMultipleInstances)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -249,6 +249,17 @@ private void InitializeComponent() { this.groupBox_Misc.TabStop = false; this.groupBox_Misc.Text = "Misc:"; // + // checkBox_AllowMultipleInstances + // + this.checkBox_AllowMultipleInstances.AutoSize = true; + this.checkBox_AllowMultipleInstances.Location = new System.Drawing.Point(6, 289); + this.checkBox_AllowMultipleInstances.Name = "checkBox_AllowMultipleInstances"; + this.checkBox_AllowMultipleInstances.Size = new System.Drawing.Size(139, 17); + this.checkBox_AllowMultipleInstances.TabIndex = 365; + this.checkBox_AllowMultipleInstances.Text = "Allow Multiple Instances"; + this.checkBox_AllowMultipleInstances.UseVisualStyleBackColor = true; + this.checkBox_AllowMultipleInstances.CheckedChanged += new System.EventHandler(this.checkBox_DisableDefaultOptimizations_CheckedChanged); + // // checkBox_DisableDefaultOptimizations // this.checkBox_DisableDefaultOptimizations.AutoSize = true; @@ -291,6 +302,16 @@ private void InitializeComponent() { this.checkBox_HideMiningWindows.Text = "HideMiningWindows"; this.checkBox_HideMiningWindows.UseVisualStyleBackColor = true; // + // pictureBox_AllowMultipleInstances + // + this.pictureBox_AllowMultipleInstances.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_AllowMultipleInstances.Location = new System.Drawing.Point(221, 288); + this.pictureBox_AllowMultipleInstances.Name = "pictureBox_AllowMultipleInstances"; + this.pictureBox_AllowMultipleInstances.Size = new System.Drawing.Size(18, 18); + this.pictureBox_AllowMultipleInstances.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_AllowMultipleInstances.TabIndex = 364; + this.pictureBox_AllowMultipleInstances.TabStop = false; + // // checkBox_MinimizeToTray // this.checkBox_MinimizeToTray.AutoSize = true; @@ -596,13 +617,13 @@ private void InitializeComponent() { // // groupBox_Main // - this.groupBox_Main.Controls.Add(this.checkBox_ContinueMiningIfNoInternetAccess); + this.groupBox_Main.Controls.Add(this.checkBox_IdleWhenNoInternetAccess); this.groupBox_Main.Controls.Add(this.pictureBox_WorkerName); this.groupBox_Main.Controls.Add(this.pictureBox_MinProfit); this.groupBox_Main.Controls.Add(this.pictureBox_ServiceLocation); this.groupBox_Main.Controls.Add(this.pictureBox_Info_BitcoinAddress); this.groupBox_Main.Controls.Add(this.textBox_MinProfit); - this.groupBox_Main.Controls.Add(this.pictureBox_ContinueMiningIfNoInternetAccess); + this.groupBox_Main.Controls.Add(this.pictureBox_IdleWhenNoInternetAccess); this.groupBox_Main.Controls.Add(this.label_BitcoinAddress); this.groupBox_Main.Controls.Add(this.label_MinProfit); this.groupBox_Main.Controls.Add(this.label_WorkerName); @@ -617,16 +638,16 @@ private void InitializeComponent() { this.groupBox_Main.TabStop = false; this.groupBox_Main.Text = "Main:"; // - // checkBox_ContinueMiningIfNoInternetAccess + // checkBox_IdleWhenNoInternetAccess // - this.checkBox_ContinueMiningIfNoInternetAccess.AutoSize = true; - this.checkBox_ContinueMiningIfNoInternetAccess.Location = new System.Drawing.Point(10, 149); - this.checkBox_ContinueMiningIfNoInternetAccess.Name = "checkBox_ContinueMiningIfNoInternetAccess"; - this.checkBox_ContinueMiningIfNoInternetAccess.Size = new System.Drawing.Size(205, 17); - this.checkBox_ContinueMiningIfNoInternetAccess.TabIndex = 365; - this.checkBox_ContinueMiningIfNoInternetAccess.Text = "Continue Mining If No Internet Access"; - this.checkBox_ContinueMiningIfNoInternetAccess.UseVisualStyleBackColor = true; - this.checkBox_ContinueMiningIfNoInternetAccess.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); + this.checkBox_IdleWhenNoInternetAccess.AutoSize = true; + this.checkBox_IdleWhenNoInternetAccess.Location = new System.Drawing.Point(10, 149); + this.checkBox_IdleWhenNoInternetAccess.Name = "checkBox_IdleWhenNoInternetAccess"; + this.checkBox_IdleWhenNoInternetAccess.Size = new System.Drawing.Size(205, 17); + this.checkBox_IdleWhenNoInternetAccess.TabIndex = 365; + this.checkBox_IdleWhenNoInternetAccess.Text = "Continue Mining If No Internet Access"; + this.checkBox_IdleWhenNoInternetAccess.UseVisualStyleBackColor = true; + this.checkBox_IdleWhenNoInternetAccess.CheckedChanged += new System.EventHandler(this.GeneralCheckBoxes_CheckedChanged); // // pictureBox_WorkerName // @@ -675,15 +696,15 @@ private void InitializeComponent() { this.textBox_MinProfit.Size = new System.Drawing.Size(237, 20); this.textBox_MinProfit.TabIndex = 334; // - // pictureBox_ContinueMiningIfNoInternetAccess + // pictureBox_IdleWhenNoInternetAccess // - this.pictureBox_ContinueMiningIfNoInternetAccess.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_ContinueMiningIfNoInternetAccess.Location = new System.Drawing.Point(302, 149); - this.pictureBox_ContinueMiningIfNoInternetAccess.Name = "pictureBox_ContinueMiningIfNoInternetAccess"; - this.pictureBox_ContinueMiningIfNoInternetAccess.Size = new System.Drawing.Size(18, 18); - this.pictureBox_ContinueMiningIfNoInternetAccess.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_ContinueMiningIfNoInternetAccess.TabIndex = 364; - this.pictureBox_ContinueMiningIfNoInternetAccess.TabStop = false; + this.pictureBox_IdleWhenNoInternetAccess.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_IdleWhenNoInternetAccess.Location = new System.Drawing.Point(302, 149); + this.pictureBox_IdleWhenNoInternetAccess.Name = "pictureBox_IdleWhenNoInternetAccess"; + this.pictureBox_IdleWhenNoInternetAccess.Size = new System.Drawing.Size(18, 18); + this.pictureBox_IdleWhenNoInternetAccess.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_IdleWhenNoInternetAccess.TabIndex = 364; + this.pictureBox_IdleWhenNoInternetAccess.TabStop = false; // // label_BitcoinAddress // @@ -1207,6 +1228,36 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.TabStop = false; this.groupBoxBenchmarkTimeLimits.Text = "Benchmark Time Limits:"; // + // benchmarkLimitControlNVIDIA + // + this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; + this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); + this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; + this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlNVIDIA.TabIndex = 4; + this.benchmarkLimitControlNVIDIA.TimeLimits = null; + // + // benchmarkLimitControlCPU + // + this.benchmarkLimitControlCPU.GroupName = "CPU"; + this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); + this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; + this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlCPU.TabIndex = 3; + this.benchmarkLimitControlCPU.TimeLimits = null; + // + // benchmarkLimitControlAMD + // + this.benchmarkLimitControlAMD.GroupName = "AMD"; + this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); + this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); + this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; + this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); + this.benchmarkLimitControlAMD.TabIndex = 5; + this.benchmarkLimitControlAMD.TimeLimits = null; + // // tabPageDevicesAlgos // this.tabPageDevicesAlgos.Controls.Add(this.devicesListViewEnableControl1); @@ -1222,6 +1273,25 @@ private void InitializeComponent() { this.tabPageDevicesAlgos.Text = "Devices/Algorithms"; this.tabPageDevicesAlgos.UseVisualStyleBackColor = true; // + // devicesListViewEnableControl1 + // + this.devicesListViewEnableControl1.BenchmarkCalculation = null; + this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; + this.devicesListViewEnableControl1.IsInBenchmark = false; + this.devicesListViewEnableControl1.IsMining = false; + this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); + this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; + this.devicesListViewEnableControl1.SaveToGeneralConfig = false; + this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); + this.devicesListViewEnableControl1.TabIndex = 397; + // + // algorithmSettingsControl1 + // + this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); + this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; + this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); + this.algorithmSettingsControl1.TabIndex = 396; + // // groupBoxAlgorithmSettings // this.groupBoxAlgorithmSettings.Controls.Add(this.algorithmsListView1); @@ -1232,6 +1302,16 @@ private void InitializeComponent() { this.groupBoxAlgorithmSettings.TabStop = false; this.groupBoxAlgorithmSettings.Text = "Algorithm settings for selected device:"; // + // algorithmsListView1 + // + this.algorithmsListView1.BenchmarkCalculation = null; + this.algorithmsListView1.ComunicationInterface = null; + this.algorithmsListView1.IsInBenchmark = false; + this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); + this.algorithmsListView1.Name = "algorithmsListView1"; + this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); + this.algorithmsListView1.TabIndex = 2; + // // buttonAllProfit // this.buttonAllProfit.Location = new System.Drawing.Point(364, 6); @@ -1285,86 +1365,6 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // pictureBox_AllowMultipleInstances - // - this.pictureBox_AllowMultipleInstances.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_AllowMultipleInstances.Location = new System.Drawing.Point(221, 288); - this.pictureBox_AllowMultipleInstances.Name = "pictureBox_AllowMultipleInstances"; - this.pictureBox_AllowMultipleInstances.Size = new System.Drawing.Size(18, 18); - this.pictureBox_AllowMultipleInstances.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_AllowMultipleInstances.TabIndex = 364; - this.pictureBox_AllowMultipleInstances.TabStop = false; - // - // checkBox_AllowMultipleInstances - // - this.checkBox_AllowMultipleInstances.AutoSize = true; - this.checkBox_AllowMultipleInstances.Location = new System.Drawing.Point(6, 289); - this.checkBox_AllowMultipleInstances.Name = "checkBox_AllowMultipleInstances"; - this.checkBox_AllowMultipleInstances.Size = new System.Drawing.Size(139, 17); - this.checkBox_AllowMultipleInstances.TabIndex = 365; - this.checkBox_AllowMultipleInstances.Text = "Allow Multiple Instances"; - this.checkBox_AllowMultipleInstances.UseVisualStyleBackColor = true; - this.checkBox_AllowMultipleInstances.CheckedChanged += new System.EventHandler(this.checkBox_DisableDefaultOptimizations_CheckedChanged); - // - // benchmarkLimitControlNVIDIA - // - this.benchmarkLimitControlNVIDIA.GroupName = "NVIDIA"; - this.benchmarkLimitControlNVIDIA.Location = new System.Drawing.Point(9, 17); - this.benchmarkLimitControlNVIDIA.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlNVIDIA.Name = "benchmarkLimitControlNVIDIA"; - this.benchmarkLimitControlNVIDIA.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlNVIDIA.TabIndex = 4; - this.benchmarkLimitControlNVIDIA.TimeLimits = null; - // - // benchmarkLimitControlCPU - // - this.benchmarkLimitControlCPU.GroupName = "CPU"; - this.benchmarkLimitControlCPU.Location = new System.Drawing.Point(209, 17); - this.benchmarkLimitControlCPU.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlCPU.Name = "benchmarkLimitControlCPU"; - this.benchmarkLimitControlCPU.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlCPU.TabIndex = 3; - this.benchmarkLimitControlCPU.TimeLimits = null; - // - // benchmarkLimitControlAMD - // - this.benchmarkLimitControlAMD.GroupName = "AMD"; - this.benchmarkLimitControlAMD.Location = new System.Drawing.Point(409, 17); - this.benchmarkLimitControlAMD.Margin = new System.Windows.Forms.Padding(3, 1, 3, 1); - this.benchmarkLimitControlAMD.Name = "benchmarkLimitControlAMD"; - this.benchmarkLimitControlAMD.Size = new System.Drawing.Size(177, 121); - this.benchmarkLimitControlAMD.TabIndex = 5; - this.benchmarkLimitControlAMD.TimeLimits = null; - // - // devicesListViewEnableControl1 - // - this.devicesListViewEnableControl1.BenchmarkCalculation = null; - this.devicesListViewEnableControl1.FirstColumnText = "Enabled"; - this.devicesListViewEnableControl1.IsInBenchmark = false; - this.devicesListViewEnableControl1.IsMining = false; - this.devicesListViewEnableControl1.Location = new System.Drawing.Point(6, 6); - this.devicesListViewEnableControl1.Name = "devicesListViewEnableControl1"; - this.devicesListViewEnableControl1.SaveToGeneralConfig = false; - this.devicesListViewEnableControl1.Size = new System.Drawing.Size(352, 130); - this.devicesListViewEnableControl1.TabIndex = 397; - // - // algorithmSettingsControl1 - // - this.algorithmSettingsControl1.Location = new System.Drawing.Point(363, 64); - this.algorithmSettingsControl1.Name = "algorithmSettingsControl1"; - this.algorithmSettingsControl1.Size = new System.Drawing.Size(238, 278); - this.algorithmSettingsControl1.TabIndex = 396; - // - // algorithmsListView1 - // - this.algorithmsListView1.BenchmarkCalculation = null; - this.algorithmsListView1.ComunicationInterface = null; - this.algorithmsListView1.IsInBenchmark = false; - this.algorithmsListView1.Location = new System.Drawing.Point(6, 15); - this.algorithmsListView1.Name = "algorithmsListView1"; - this.algorithmsListView1.Size = new System.Drawing.Size(339, 191); - this.algorithmsListView1.TabIndex = 2; - // // Form_Settings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1384,6 +1384,7 @@ private void InitializeComponent() { this.tabPageGeneral.ResumeLayout(false); this.groupBox_Misc.ResumeLayout(false); this.groupBox_Misc.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AllowMultipleInstances)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DisableDefaultOptimizations)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AMD_DisableAMDTempControl)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_NVIDIAP0State)).EndInit(); @@ -1408,7 +1409,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinProfit)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ServiceLocation)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Info_BitcoinAddress)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ContinueMiningIfNoInternetAccess)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_IdleWhenNoInternetAccess)).EndInit(); this.groupBox_Localization.ResumeLayout(false); this.groupBox_Localization.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); @@ -1430,7 +1431,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_AllowMultipleInstances)).EndInit(); this.ResumeLayout(false); } @@ -1540,8 +1540,8 @@ private void InitializeComponent() { private System.Windows.Forms.PictureBox pictureBox_AMD_DisableAMDTempControl; private System.Windows.Forms.CheckBox checkBox_DisableDefaultOptimizations; private System.Windows.Forms.PictureBox pictureBox_DisableDefaultOptimizations; - private System.Windows.Forms.CheckBox checkBox_ContinueMiningIfNoInternetAccess; - private System.Windows.Forms.PictureBox pictureBox_ContinueMiningIfNoInternetAccess; + private System.Windows.Forms.CheckBox checkBox_IdleWhenNoInternetAccess; + private System.Windows.Forms.PictureBox pictureBox_IdleWhenNoInternetAccess; private System.Windows.Forms.PictureBox pictureBox_Use3rdPartyMiners; private System.Windows.Forms.CheckBox checkBox_Use3rdPartyMiners; private System.Windows.Forms.CheckBox checkBox_AllowMultipleInstances; diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 7460fff..91489b3 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -207,8 +207,8 @@ private void InitializeToolTip() { toolTip1.SetToolTip(pictureBox_DisableDefaultOptimizations, International.GetText("Form_Settings_ToolTip_DisableDefaultOptimizations")); // internet connection mining check - toolTip1.SetToolTip(checkBox_ContinueMiningIfNoInternetAccess, International.GetText("Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess")); - toolTip1.SetToolTip(pictureBox_ContinueMiningIfNoInternetAccess, International.GetText("Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess")); + toolTip1.SetToolTip(checkBox_IdleWhenNoInternetAccess, International.GetText("Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess")); + toolTip1.SetToolTip(pictureBox_IdleWhenNoInternetAccess, International.GetText("Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess")); this.Text = International.GetText("Form_Settings_Title"); @@ -296,7 +296,7 @@ private void InitializeGeneralTabTranslations() { buttonSelectedProfit.Text = International.GetText("FormSettings_Tab_Devices_Algorithms_Check_SingleProfitability"); checkBox_DisableDefaultOptimizations.Text = International.GetText("Form_Settings_Text_DisableDefaultOptimizations"); - checkBox_ContinueMiningIfNoInternetAccess.Text = International.GetText("Form_Settings_Text_ContinueMiningIfNoInternetAccess"); + checkBox_IdleWhenNoInternetAccess.Text = International.GetText("Form_Settings_Text_ContinueMiningIfNoInternetAccess"); } private void InitializeGeneralTabCallbacks() { @@ -380,7 +380,7 @@ private void InitializeGeneralTabFieldValuesReferences() { checkBox_LogToFile.Checked = ConfigManager.GeneralConfig.LogToFile; checkBox_AMD_DisableAMDTempControl.Checked = ConfigManager.GeneralConfig.DisableAMDTempControl; checkBox_DisableDefaultOptimizations.Checked = ConfigManager.GeneralConfig.DisableDefaultOptimizations; - checkBox_ContinueMiningIfNoInternetAccess.Checked = ConfigManager.GeneralConfig.ContinueMiningIfNoInternetAccess; + checkBox_IdleWhenNoInternetAccess.Checked = ConfigManager.GeneralConfig.IdleWhenNoInternetAccess; this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; this.checkBox_AllowMultipleInstances.Checked = ConfigManager.GeneralConfig.AllowMultipleInstances; } @@ -474,7 +474,7 @@ private void GeneralCheckBoxes_CheckedChanged(object sender, EventArgs e) { ConfigManager.GeneralConfig.DisableWindowsErrorReporting = checkBox_DisableWindowsErrorReporting.Checked; ConfigManager.GeneralConfig.NVIDIAP0State = checkBox_NVIDIAP0State.Checked; ConfigManager.GeneralConfig.LogToFile = checkBox_LogToFile.Checked; - ConfigManager.GeneralConfig.ContinueMiningIfNoInternetAccess = checkBox_ContinueMiningIfNoInternetAccess.Checked; + ConfigManager.GeneralConfig.IdleWhenNoInternetAccess = checkBox_IdleWhenNoInternetAccess.Checked; ConfigManager.GeneralConfig.AllowMultipleInstances = checkBox_AllowMultipleInstances.Checked; } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index ab06d6b..9a9e3c8 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -44,9 +44,6 @@ public class MiningSession { // check internet connection private Timer _internetCheckTimer; - //// - //private Timer _miningStatusCheckTimer; - //bool CheckStatus = false; public bool IsMiningEnabled { get { @@ -86,11 +83,7 @@ public MiningSession(List devices, // set internet checking _internetCheckTimer = new Timer(); _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; - _internetCheckTimer.Interval = 1000 * 30 * 1; // every minute or 5?? // 1000 * 60 * 1 - - //_miningStatusCheckTimer = new Timer(); - //_miningStatusCheckTimer.Elapsed += MiningStatusCheckTimer_Tick; - //_miningStatusCheckTimer.Interval = 1000 * 30; + _internetCheckTimer.Interval = 1000 * 1; // every minute // assume profitable IsProfitable = true; @@ -100,7 +93,6 @@ public MiningSession(List devices, if (IsMiningEnabled) { _preventSleepTimer.Start(); _internetCheckTimer.Start(); - //_miningStatusCheckTimer.Start(); } IsMiningRegardlesOfProfit = ConfigManager.GeneralConfig.MinimumProfit == 0; @@ -108,7 +100,7 @@ public MiningSession(List devices, #region Timers stuff private void InternetCheckTimer_Tick(object sender, EventArgs e) { - if (ConfigManager.GeneralConfig.ContinueMiningIfNoInternetAccess == false) { + if (ConfigManager.GeneralConfig.IdleWhenNoInternetAccess) { IsConnectedToInternet = Helpers.IsConnectedToInternet(); } } @@ -118,9 +110,6 @@ private void PreventSleepTimer_Tick(object sender, ElapsedEventArgs e) { Helpers.PreventSleep(); } - //private void MiningStatusCheckTimer_Tick(object sender, ElapsedEventArgs e) { - // CheckStatus = true; - //} #endregion #region Start/Stop @@ -129,12 +118,15 @@ public void StopAllMiners() { foreach (var groupMiner in _runningGroupMiners.Values) { groupMiner.End(); } + _runningGroupMiners = new Dictionary(); } if (_ethminerNVIDIAPaused != null) { _ethminerNVIDIAPaused.End(); + _ethminerNVIDIAPaused = null; } if (_ethminerAMDPaused != null) { _ethminerAMDPaused.End(); + _ethminerAMDPaused = null; } if (_mainFormRatesComunication != null) { _mainFormRatesComunication.ClearRatesALL(); @@ -143,7 +135,6 @@ public void StopAllMiners() { // restroe/enable sleep _preventSleepTimer.Stop(); _internetCheckTimer.Stop(); - //_miningStatusCheckTimer.Stop(); Helpers.AllowMonitorPowerdownAndSleep(); // delete generated bin files @@ -169,12 +160,15 @@ public void StopAllMinersNonProfitable() { foreach (var groupMiner in _runningGroupMiners.Values) { groupMiner.End(); } + _runningGroupMiners = new Dictionary(); } if (_ethminerNVIDIAPaused != null) { _ethminerNVIDIAPaused.End(); + _ethminerNVIDIAPaused = null; } if (_ethminerAMDPaused != null) { _ethminerAMDPaused.End(); + _ethminerAMDPaused = null; } if (_mainFormRatesComunication != null) { _mainFormRatesComunication.ClearRates(-1); diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index b87d3b0..4195ca3 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -233,8 +233,8 @@ "Form_Settings_ToolTip_AlgoBenchmarkSpeed": "Fine tune algorithm ratios by manually setting benchmark speeds for each algorithm.", "Form_Settings_ToolTip_AlgoDisabledDevices": "Any devices that are checked will be skipped by NiceHashMiner (only for this algorithm).", "Form_Settings_ToolTip_AlgoExtraLaunchParameters": "Additional launch parameters when launching miner and this algorithm.", - "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Continue Mining If No Internet Access", - "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess" : "If enabled NiceHashMiner will continue mining regardless of internet connectivity", + "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Idle When No Internet Access", + "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess" : "If enabled NiceHashMiner will stop mining without internet connectivity", "Form_Settings_DisplayCurrency": "Display Currency", "Form_Settings_ToolTip_DisplayCurrency": "Choose what Currency to Display mining protif.", "Form_Settings_APIBindPortStart": "API Bind port pool start", @@ -332,5 +332,8 @@ "Form_Settings_General_3rdparty_ToolTip": "Use 3rd party closed-source mining software for higher profitability. Usage is on your own responsibility.", "Form_Settings_General_AllowMultipleInstances_Text": "Allow Multiple Instances", "Form_Settings_General_AllowMultipleInstances_ToolTip": "When unchecked NiceHash Miner will allow only one instance running (it will close a new started instance if there is an opened instance running).", + "Form_Main_No_Device_Enabled_Algorithms_For_Mining": "There are no enabled algorithms for selected devices. Go to Settings or Benchmarks and enable at least 1 Algorithm.", + "Form_Benchmark_checkbox_StartMiningAfterBenchmark": "Start mining after benchmark", + "Form_Main_StartMiningReturnedFalse": "NiceHash Miner cannot start mining. Make sure you have at least one enabled device that has at least one enabled and benchmarked algorithm." } } diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 4002513..5cee68d 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -331,6 +331,8 @@ "Form_Settings_General_3rdparty_Text": "Включить сторонние майнеры", "Form_Settings_General_3rdparty_ToolTip": "Используйте закрытое стороннее программное обеспечение для майнинга для высшей прибыльности. Использование на вашей собственной ответственности.", "Form_Settings_General_AllowMultipleInstances_Text": "Разрешить несколько экземпляров", -"Form_Settings_General_AllowMultipleInstances_ToolTip": "Когда не отмечено, NiceHash Miner разрешит работу только одного экземпляра (он закроет новый запущенный экземпляр, если один экземпляр уже работает).", + "Form_Settings_General_AllowMultipleInstances_ToolTip": "Когда не отмечено, NiceHash Miner разрешит работу только одного экземпляра (он закроет новый запущенный экземпляр, если один экземпляр уже работает).", + "Form_Main_No_Device_Enabled_Algorithms_For_Mining": "Для выбранных устройств нет включенных алгоритмов. Перейдите в Настройки или Бенчмарк и включите хотя-бы 1 алгоритм.", + "Form_Benchmark_checkbox_StartMiningAfterBenchmark": "Запустить майнинг после бенчмарка", } } \ No newline at end of file From a1f2a7f937d2d7d6178b00b976301a5b2641815e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 5 Dec 2016 14:28:18 +0100 Subject: [PATCH 159/366] revert .NET2.0, TODO zip module --- MessageBoxManager/MessageBoxManager.csproj | 2 +- NiceHashMiner/BaseLazySingleton.cs | 28 ------- .../Configs/ConfigJsonFile/ConfigFile.cs | 2 - .../DeviceBenchmarkConfigFile.cs | 2 - .../ConfigJsonFile/GeneralConfigFile.cs | 2 - NiceHashMiner/Configs/ConfigManager.cs | 2 - NiceHashMiner/Configs/Data/AlgorithmConfig.cs | 2 - .../Configs/Data/ComputeDeviceConfig.cs | 2 - .../Configs/Data/DeviceBenchmarkConfig.cs | 2 - NiceHashMiner/Configs/Data/GeneralConfig.cs | 5 +- NiceHashMiner/Devices/AmdGpuDevice.cs | 2 - NiceHashMiner/Devices/CPUUtils.cs | 2 - NiceHashMiner/Devices/CUDA_Unsupported.cs | 2 - NiceHashMiner/Devices/ComputeDeviceManager.cs | 5 +- NiceHashMiner/Devices/CudaDevice.cs | 2 - NiceHashMiner/Devices/OpenCLDevice.cs | 2 - .../Enums/AlgorithmBenchmarkSettingsType.cs | 2 - NiceHashMiner/Enums/BenchmarkProcessStatus.cs | 2 - NiceHashMiner/Enums/ComputePlatformType.cs | 2 - NiceHashMiner/Enums/DagGenerationType.cs | 2 - NiceHashMiner/Enums/DeviceMiningStatus.cs | 2 - NiceHashMiner/Enums/DeviceType.cs | 2 - NiceHashMiner/Enums/MinerAPIReadStatus.cs | 2 - NiceHashMiner/Enums/MinerOptionFlagType.cs | 2 - NiceHashMiner/Enums/MinerOptionType.cs | 2 - NiceHashMiner/Enums/MinerStopType.cs | 2 - NiceHashMiner/Enums/Use3rdPartyMiners.cs | 2 - .../Forms/Components/GroupProfitControl.cs | 2 - NiceHashMiner/Forms/Form_Benchmark.cs | 1 + NiceHashMiner/Forms/Form_ChooseLanguage.cs | 2 - NiceHashMiner/Forms/Form_ClaymoreTOS.cs | 2 - NiceHashMiner/Forms/Form_Main.cs | 42 +++++----- NiceHashMiner/Helpers.cs | 64 +++++++-------- .../Interfaces/IBenchmarkCalculation.cs | 2 - .../Interfaces/IBenchmarkComunicator.cs | 2 - .../Interfaces/IListItemCheckColorSetter.cs | 2 - .../Interfaces/IMainFormRatesComunication.cs | 2 - .../Interfaces/IMinerUpdateIndicator.cs | 2 - NiceHashMiner/Links.cs | 2 - NiceHashMiner/MemoryHelper.cs | 2 - .../Miners/Equihash/ClaymoreZcashMiner.cs | 9 +-- NiceHashMiner/Miners/Equihash/eqm.cs | 2 - NiceHashMiner/Miners/Equihash/nheqBase.cs | 2 - NiceHashMiner/Miners/Equihash/nheqminer.cs | 2 - NiceHashMiner/Miners/Grouping/GroupMiner.cs | 5 +- .../Miners/Grouping/GroupSetupUtils.cs | 3 +- .../Miners/Grouping/GroupingLogic.cs | 2 - .../Miners/Grouping/MiningAlgorithm.cs | 2 - NiceHashMiner/Miners/Grouping/MiningDevice.cs | 2 - NiceHashMiner/Miners/Grouping/MiningPair.cs | 2 - NiceHashMiner/Miners/Grouping/MiningSetup.cs | 2 - NiceHashMiner/Miners/Miner.cs | 19 ++--- NiceHashMiner/Miners/MinersApiPortsManager.cs | 22 +++--- NiceHashMiner/Miners/MinersManager.cs | 20 +++-- NiceHashMiner/Miners/MiningSession.cs | 7 +- .../Parsing/ExtraLaunchParametersParser.cs | 71 +++++++++-------- NiceHashMiner/Miners/Parsing/MinerOption.cs | 2 - NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 5 +- .../Miners/ethminer/MinerEtherumCUDA.cs | 2 - .../Miners/ethminer/MinerEtherumOCL.cs | 2 - NiceHashMiner/Net20_backport/HashSet.cs | 21 +++++ NiceHashMiner/Net20_backport/SortedSet.cs | 14 ++++ NiceHashMiner/Net20_backport/StringHelper.cs | 32 ++++++++ NiceHashMiner/Net20_backport/Tuple.cs | 15 ++++ NiceHashMiner/Net20_backport/Tuple3.cs | 17 ++++ NiceHashMiner/NiceHashMiner.csproj | 10 ++- NiceHashMiner/NiceHashStats.cs | 2 +- NiceHashMiner/PInvoke/PInvokeHelpers.cs | 2 - NiceHashMiner/ProfitabilityCalculator.cs | 2 - NiceHashMiner/TextBoxKeyPressEvents.cs | 4 +- NiceHashMiner/Utils/DownloadSetup.cs | 2 - NiceHashMiner/Utils/MinersDownloadManager.cs | 2 - NiceHashMiner/Utils/MinersDownloader.cs | 77 +++++++++---------- NiceHashMiner/Utils/MinersExistanceChecker.cs | 2 - NiceHashMiner/app.config | 2 +- nvidiasetp0state/App.config | 2 +- nvidiasetp0state/nvidiasetp0state.csproj | 2 +- 77 files changed, 285 insertions(+), 319 deletions(-) delete mode 100644 NiceHashMiner/BaseLazySingleton.cs create mode 100644 NiceHashMiner/Net20_backport/HashSet.cs create mode 100644 NiceHashMiner/Net20_backport/SortedSet.cs create mode 100644 NiceHashMiner/Net20_backport/StringHelper.cs create mode 100644 NiceHashMiner/Net20_backport/Tuple.cs create mode 100644 NiceHashMiner/Net20_backport/Tuple3.cs diff --git a/MessageBoxManager/MessageBoxManager.csproj b/MessageBoxManager/MessageBoxManager.csproj index c8d2821..9679e34 100644 --- a/MessageBoxManager/MessageBoxManager.csproj +++ b/MessageBoxManager/MessageBoxManager.csproj @@ -10,7 +10,7 @@ Properties MessageBoxManager MessageBoxManager - v4.5 + v2.0 diff --git a/NiceHashMiner/BaseLazySingleton.cs b/NiceHashMiner/BaseLazySingleton.cs deleted file mode 100644 index 7a6fa69..0000000 --- a/NiceHashMiner/BaseLazySingleton.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace NiceHashMiner { - public abstract class BaseLazySingleton where T : class { - private static readonly Lazy LazyInstance = - new Lazy(CreateInstanceOfT, LazyThreadSafetyMode.ExecutionAndPublication); - - #region Properties - public static T Instance { - get { return LazyInstance.Value; } - } - #endregion - - #region Methods - private static T CreateInstanceOfT() { - return Activator.CreateInstance(typeof(T), true) as T; - } - - protected BaseLazySingleton() { } - - #endregion - } -} diff --git a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs index ca936fb..d0635b8 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Configs.ConfigJsonFile { public abstract class ConfigFile where T : class { diff --git a/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs index bb29f8f..b974ff5 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Configs.Data; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Configs.ConfigJsonFile { public class DeviceBenchmarkConfigFile : ConfigFile { diff --git a/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs index 74ef5a2..d624041 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Configs.Data; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Configs.ConfigJsonFile { public class GeneralConfigFile : ConfigFile { diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index ff186a4..e8996c7 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -4,9 +4,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Configs { public static class ConfigManager { diff --git a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs index 77dbe9a..e07082a 100644 --- a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs +++ b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Configs.Data { [Serializable] diff --git a/NiceHashMiner/Configs/Data/ComputeDeviceConfig.cs b/NiceHashMiner/Configs/Data/ComputeDeviceConfig.cs index c61dc1b..0b7ba12 100644 --- a/NiceHashMiner/Configs/Data/ComputeDeviceConfig.cs +++ b/NiceHashMiner/Configs/Data/ComputeDeviceConfig.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Configs.Data { [Serializable] diff --git a/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs b/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs index 6091e2b..30fc67b 100644 --- a/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs +++ b/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Configs.Data { [Serializable] diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index 892ca1a..f8db2e4 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -1,9 +1,8 @@ using NiceHashMiner.Enums; +using NiceHashMiner.Net20_backport; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Configs.Data { [Serializable] @@ -112,7 +111,7 @@ public void SetDefaults() { public void FixSettingBounds() { this.ConfigFileVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; if (string.IsNullOrEmpty(this.DisplayCurrency) - || string.IsNullOrWhiteSpace(this.DisplayCurrency)) { + || StringHelper.IsNullOrWhiteSpace(this.DisplayCurrency)) { this.DisplayCurrency = "USD"; } if (this.SwitchMinSecondsFixed <= 0) { diff --git a/NiceHashMiner/Devices/AmdGpuDevice.cs b/NiceHashMiner/Devices/AmdGpuDevice.cs index 9da41a2..1dd06bb 100644 --- a/NiceHashMiner/Devices/AmdGpuDevice.cs +++ b/NiceHashMiner/Devices/AmdGpuDevice.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Devices { [Serializable] diff --git a/NiceHashMiner/Devices/CPUUtils.cs b/NiceHashMiner/Devices/CPUUtils.cs index 9bd1cb4..b5d3a33 100644 --- a/NiceHashMiner/Devices/CPUUtils.cs +++ b/NiceHashMiner/Devices/CPUUtils.cs @@ -3,9 +3,7 @@ using NiceHashMiner.Miners; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Devices { public static class CPUUtils { diff --git a/NiceHashMiner/Devices/CUDA_Unsupported.cs b/NiceHashMiner/Devices/CUDA_Unsupported.cs index 6974382..1e699f7 100644 --- a/NiceHashMiner/Devices/CUDA_Unsupported.cs +++ b/NiceHashMiner/Devices/CUDA_Unsupported.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Devices { public static class CUDA_Unsupported { diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 8df728c..f667556 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -15,6 +15,7 @@ using System.Globalization; using NiceHashMiner.Utils; using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Net20_backport; namespace NiceHashMiner.Devices { @@ -608,7 +609,7 @@ static public void QueryAMD() { bool isAdlInit = true; // ADL does not get devices in order map devices by bus number // bus id, - Dictionary> _busIdsInfo = new Dictionary>(); + Dictionary> _busIdsInfo = new Dictionary>(); List _amdDeviceName = new List(); List _amdDeviceUUID = new List(); try { @@ -687,7 +688,7 @@ static public void QueryAMD() { //_busIds.Add(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber); _amdDeviceName.Add(devName); if (!_busIdsInfo.ContainsKey(budId)) { - var nameUuid = new Tuple(devName, uuid, infSection); + var nameUuid = new Tuple3(devName, uuid, infSection); _busIdsInfo.Add(budId, nameUuid); } } diff --git a/NiceHashMiner/Devices/CudaDevice.cs b/NiceHashMiner/Devices/CudaDevice.cs index 9d0097b..916a70e 100644 --- a/NiceHashMiner/Devices/CudaDevice.cs +++ b/NiceHashMiner/Devices/CudaDevice.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Devices { [Serializable] diff --git a/NiceHashMiner/Devices/OpenCLDevice.cs b/NiceHashMiner/Devices/OpenCLDevice.cs index b4c707d..4fd7593 100644 --- a/NiceHashMiner/Devices/OpenCLDevice.cs +++ b/NiceHashMiner/Devices/OpenCLDevice.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Devices { [Serializable] diff --git a/NiceHashMiner/Enums/AlgorithmBenchmarkSettingsType.cs b/NiceHashMiner/Enums/AlgorithmBenchmarkSettingsType.cs index 96e1c89..f3bb3d4 100644 --- a/NiceHashMiner/Enums/AlgorithmBenchmarkSettingsType.cs +++ b/NiceHashMiner/Enums/AlgorithmBenchmarkSettingsType.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum AlgorithmBenchmarkSettingsType : int { diff --git a/NiceHashMiner/Enums/BenchmarkProcessStatus.cs b/NiceHashMiner/Enums/BenchmarkProcessStatus.cs index 1b77fa9..b712439 100644 --- a/NiceHashMiner/Enums/BenchmarkProcessStatus.cs +++ b/NiceHashMiner/Enums/BenchmarkProcessStatus.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum BenchmarkProcessStatus { diff --git a/NiceHashMiner/Enums/ComputePlatformType.cs b/NiceHashMiner/Enums/ComputePlatformType.cs index ce2db6e..cda799f 100644 --- a/NiceHashMiner/Enums/ComputePlatformType.cs +++ b/NiceHashMiner/Enums/ComputePlatformType.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum ComputePlatformType { diff --git a/NiceHashMiner/Enums/DagGenerationType.cs b/NiceHashMiner/Enums/DagGenerationType.cs index aff3e00..77cf121 100644 --- a/NiceHashMiner/Enums/DagGenerationType.cs +++ b/NiceHashMiner/Enums/DagGenerationType.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { diff --git a/NiceHashMiner/Enums/DeviceMiningStatus.cs b/NiceHashMiner/Enums/DeviceMiningStatus.cs index 024f640..6b191c6 100644 --- a/NiceHashMiner/Enums/DeviceMiningStatus.cs +++ b/NiceHashMiner/Enums/DeviceMiningStatus.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum DeviceMiningStatus { diff --git a/NiceHashMiner/Enums/DeviceType.cs b/NiceHashMiner/Enums/DeviceType.cs index 8a8975f..7c5e158 100644 --- a/NiceHashMiner/Enums/DeviceType.cs +++ b/NiceHashMiner/Enums/DeviceType.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum DeviceType { diff --git a/NiceHashMiner/Enums/MinerAPIReadStatus.cs b/NiceHashMiner/Enums/MinerAPIReadStatus.cs index 8b2ea8e..5eb977a 100644 --- a/NiceHashMiner/Enums/MinerAPIReadStatus.cs +++ b/NiceHashMiner/Enums/MinerAPIReadStatus.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum MinerAPIReadStatus { diff --git a/NiceHashMiner/Enums/MinerOptionFlagType.cs b/NiceHashMiner/Enums/MinerOptionFlagType.cs index 84c18bc..ca735e3 100644 --- a/NiceHashMiner/Enums/MinerOptionFlagType.cs +++ b/NiceHashMiner/Enums/MinerOptionFlagType.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { // indicates if uni flag (no parameter), single param or multi param diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 8556e79..aeb9563 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum MinerOptionType { diff --git a/NiceHashMiner/Enums/MinerStopType.cs b/NiceHashMiner/Enums/MinerStopType.cs index c0729f1..21b2f53 100644 --- a/NiceHashMiner/Enums/MinerStopType.cs +++ b/NiceHashMiner/Enums/MinerStopType.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum MinerStopType { diff --git a/NiceHashMiner/Enums/Use3rdPartyMiners.cs b/NiceHashMiner/Enums/Use3rdPartyMiners.cs index 1471169..9812fd3 100644 --- a/NiceHashMiner/Enums/Use3rdPartyMiners.cs +++ b/NiceHashMiner/Enums/Use3rdPartyMiners.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Enums { public enum Use3rdPartyMiners { diff --git a/NiceHashMiner/Forms/Components/GroupProfitControl.cs b/NiceHashMiner/Forms/Components/GroupProfitControl.cs index 167145e..7dffcb8 100644 --- a/NiceHashMiner/Forms/Components/GroupProfitControl.cs +++ b/NiceHashMiner/Forms/Components/GroupProfitControl.cs @@ -3,9 +3,7 @@ using System.ComponentModel; using System.Drawing; using System.Data; -using System.Linq; using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace NiceHashMiner.Forms.Components { diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index d3dfef4..f270718 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -13,6 +13,7 @@ namespace NiceHashMiner.Forms { using NiceHashMiner.Miners.Grouping; + using NiceHashMiner.Net20_backport; public partial class Form_Benchmark : Form, IListItemCheckColorSetter, IBenchmarkComunicator, IBenchmarkCalculation { private bool _inBenchmark = false; diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.cs index a8c0372..e0d84e2 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.cs +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.cs @@ -5,9 +5,7 @@ using System.ComponentModel; using System.Data; using System.Drawing; -using System.Linq; using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace NiceHashMiner.Forms { diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs b/NiceHashMiner/Forms/Form_ClaymoreTOS.cs index 4979b9c..7579e31 100644 --- a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs +++ b/NiceHashMiner/Forms/Form_ClaymoreTOS.cs @@ -5,9 +5,7 @@ using System.ComponentModel; using System.Data; using System.Drawing; -using System.Linq; using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace NiceHashMiner.Forms { diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index c8c0e96..8f5cdb2 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -25,6 +25,7 @@ namespace NiceHashMiner { using NiceHashMiner.Miners.Grouping; + using NiceHashMiner.Net20_backport; public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, IMainFormRatesComunication { private static string VisitURL = Links.VisitURL; @@ -181,18 +182,19 @@ private void StartupTimer_Tick(object sender, EventArgs e) { StartupTimer.Stop(); StartupTimer = null; - if (!Helpers.Is45NetOrHigher()) { - MessageBox.Show(International.GetText("NET45_Not_Intsalled_msg"), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.OK); + // reverted to .NET 2.0 + //if (!Helpers.Is45NetOrHigher()) { + // MessageBox.Show(International.GetText("NET45_Not_Intsalled_msg"), + // International.GetText("Warning_with_Exclamation"), + // MessageBoxButtons.OK); - this.Close(); - return; - } + // this.Close(); + // return; + //} - // - CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture; - CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; + // reverted to .NET 2.0 + //CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + //CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; if (!Helpers.InternalCheckIsWow64()) { MessageBox.Show(International.GetText("Form_Main_x64_Support_Only"), @@ -419,12 +421,12 @@ private void SMAMinerCheck_Tick(object sender, EventArgs e) #if (SWITCH_TESTING) SMAMinerCheck.Interval = MiningDevice.SMAMinerCheckInterval; #endif - MinersManager.Instance.SwichMostProfitableGroupUpMethod(Globals.NiceHashData); + MinersManager.SwichMostProfitableGroupUpMethod(Globals.NiceHashData); } private void MinerStatsCheck_Tick(object sender, EventArgs e) { - MinersManager.Instance.MinerStatsCheck(Globals.NiceHashData); + MinersManager.MinerStatsCheck(Globals.NiceHashData); } private void InitFlowPanelStart() { @@ -503,7 +505,7 @@ public void HideNotProfitable() { private void UpdateGlobalRate() { - double TotalRate = MinersManager.Instance.GetTotalRate(); + double TotalRate = MinersManager.GetTotalRate(); if (ConfigManager.GeneralConfig.AutoScaleBTCValues && TotalRate < 0.1) { @@ -687,7 +689,7 @@ private void linkLabelChooseBTCWallet_LinkClicked(object sender, LinkLabelLinkCl private void Form1_FormClosing(object sender, FormClosingEventArgs e) { - MinersManager.Instance.StopAllMiners(); + MinersManager.StopAllMiners(); MessageBoxManager.Unregister(); } @@ -867,14 +869,6 @@ private bool StartMining(bool showWarnings) { International.GetText("Warning_with_Exclamation"), MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); if (result == System.Windows.Forms.DialogResult.Yes) { - List enabledDevices = new List(); - HashSet deviceNames = new HashSet(); - foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cdev.Enabled && !deviceNames.Contains(cdev.Name)) { - deviceNames.Add(cdev.Name); - enabledDevices.Add(cdev); - } - } BenchmarkForm = new Form_Benchmark( BenchmarkPerformanceType.Standard, true); @@ -942,7 +936,7 @@ private bool StartMining(bool showWarnings) { ClearRatesALL(); var btcAdress = DemoMode ? Globals.DemoUser : textBoxBTCAddress.Text.Trim(); - var isMining = MinersManager.Instance.StartInitialize(this, Globals.MiningLocation[comboBoxLocation.SelectedIndex], textBoxWorkerName.Text.Trim(), btcAdress); + var isMining = MinersManager.StartInitialize(this, Globals.MiningLocation[comboBoxLocation.SelectedIndex], textBoxWorkerName.Text.Trim(), btcAdress); if (!DemoMode) ConfigManager.GeneralConfigFileCommit(); @@ -957,7 +951,7 @@ private void StopMining() { MinerStatsCheck.Stop(); SMAMinerCheck.Stop(); - MinersManager.Instance.StopAllMiners(); + MinersManager.StopAllMiners(); textBoxBTCAddress.Enabled = true; textBoxWorkerName.Enabled = true; diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index e01fa7f..42b8d6d 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -179,38 +179,38 @@ public static bool WebRequestTestGoogle() { // Checking the version using >= will enable forward compatibility, // however you should always compile your code on newer versions of // the framework to ensure your app works the same. - private static bool Is45DotVersion(int releaseKey) { - if (releaseKey >= 393295) { - //return "4.6 or later"; - return true; - } - if ((releaseKey >= 379893)) { - //return "4.5.2 or later"; - return true; - } - if ((releaseKey >= 378675)) { - //return "4.5.1 or later"; - return true; - } - if ((releaseKey >= 378389)) { - //return "4.5 or later"; - return true; - } - // This line should never execute. A non-null release key should mean - // that 4.5 or later is installed. - //return "No 4.5 or later version detected"; - return false; - } - - public static bool Is45NetOrHigher() { - using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) { - if (ndpKey != null && ndpKey.GetValue("Release") != null) { - return Is45DotVersion((int)ndpKey.GetValue("Release")); - } else { - return false; - } - } - } + //private static bool Is45DotVersion(int releaseKey) { + // if (releaseKey >= 393295) { + // //return "4.6 or later"; + // return true; + // } + // if ((releaseKey >= 379893)) { + // //return "4.5.2 or later"; + // return true; + // } + // if ((releaseKey >= 378675)) { + // //return "4.5.1 or later"; + // return true; + // } + // if ((releaseKey >= 378389)) { + // //return "4.5 or later"; + // return true; + // } + // // This line should never execute. A non-null release key should mean + // // that 4.5 or later is installed. + // //return "No 4.5 or later version detected"; + // return false; + //} + + //public static bool Is45NetOrHigher() { + // using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) { + // if (ndpKey != null && ndpKey.GetValue("Release") != null) { + // return Is45DotVersion((int)ndpKey.GetValue("Release")); + // } else { + // return false; + // } + // } + //} public static bool IsConnectedToInternet() { bool returnValue = false; diff --git a/NiceHashMiner/Interfaces/IBenchmarkCalculation.cs b/NiceHashMiner/Interfaces/IBenchmarkCalculation.cs index c713941..11e135b 100644 --- a/NiceHashMiner/Interfaces/IBenchmarkCalculation.cs +++ b/NiceHashMiner/Interfaces/IBenchmarkCalculation.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Interfaces { public interface IBenchmarkCalculation { diff --git a/NiceHashMiner/Interfaces/IBenchmarkComunicator.cs b/NiceHashMiner/Interfaces/IBenchmarkComunicator.cs index 62dcd99..3845872 100644 --- a/NiceHashMiner/Interfaces/IBenchmarkComunicator.cs +++ b/NiceHashMiner/Interfaces/IBenchmarkComunicator.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Interfaces { public interface IBenchmarkComunicator { diff --git a/NiceHashMiner/Interfaces/IListItemCheckColorSetter.cs b/NiceHashMiner/Interfaces/IListItemCheckColorSetter.cs index dc0987b..ad96b0d 100644 --- a/NiceHashMiner/Interfaces/IListItemCheckColorSetter.cs +++ b/NiceHashMiner/Interfaces/IListItemCheckColorSetter.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace NiceHashMiner.Interfaces { diff --git a/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs b/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs index e3b54c9..33b0d0b 100644 --- a/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs +++ b/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Interfaces { public interface IMainFormRatesComunication { diff --git a/NiceHashMiner/Interfaces/IMinerUpdateIndicator.cs b/NiceHashMiner/Interfaces/IMinerUpdateIndicator.cs index 144507b..9bc6b08 100644 --- a/NiceHashMiner/Interfaces/IMinerUpdateIndicator.cs +++ b/NiceHashMiner/Interfaces/IMinerUpdateIndicator.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Interfaces { public interface IMinerUpdateIndicator { diff --git a/NiceHashMiner/Links.cs b/NiceHashMiner/Links.cs index 2ec201b..731c7f2 100644 --- a/NiceHashMiner/Links.cs +++ b/NiceHashMiner/Links.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner { public static class Links { diff --git a/NiceHashMiner/MemoryHelper.cs b/NiceHashMiner/MemoryHelper.cs index 1994843..34911bb 100644 --- a/NiceHashMiner/MemoryHelper.cs +++ b/NiceHashMiner/MemoryHelper.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner { static class MemoryHelper { diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 655ef78..272201d 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -3,16 +3,15 @@ using NiceHashMiner.Enums; using NiceHashMiner.Miners.Grouping; using NiceHashMiner.Miners.Parsing; +using NiceHashMiner.Net20_backport; using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; -using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading; -using System.Threading.Tasks; namespace NiceHashMiner.Miners { public class ClaymoreZcashMiner : Miner { @@ -119,11 +118,11 @@ public override APIData GetSummary() { protected override string GetDevicesCommandString() { string extraParams = ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); string deviceStringCommand = " -di "; - List ids = new List(); + List ids = new List(); foreach (var mPair in MiningSetup.MiningPairs) { - ids.Add(mPair.Device.ID); + ids.Add(mPair.Device.ID.ToString()); } - deviceStringCommand += string.Join("", ids); + deviceStringCommand += StringHelper.Join("", ids); return deviceStringCommand + extraParams; } diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index d003447..9e8775a 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using NiceHashMiner.Miners.Grouping; using NiceHashMiner.Miners.Parsing; diff --git a/NiceHashMiner/Miners/Equihash/nheqBase.cs b/NiceHashMiner/Miners/Equihash/nheqBase.cs index 063f5bd..e7de406 100644 --- a/NiceHashMiner/Miners/Equihash/nheqBase.cs +++ b/NiceHashMiner/Miners/Equihash/nheqBase.cs @@ -5,10 +5,8 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.Linq; using System.Net.Sockets; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners { public abstract class nheqBase : Miner { diff --git a/NiceHashMiner/Miners/Equihash/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs index 72a60b6..26a44eb 100644 --- a/NiceHashMiner/Miners/Equihash/nheqminer.cs +++ b/NiceHashMiner/Miners/Equihash/nheqminer.cs @@ -5,10 +5,8 @@ using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; using System.Net.Sockets; using System.Text; -using System.Threading.Tasks; using NiceHashMiner.Miners.Grouping; using System.Diagnostics; using NiceHashMiner.Miners.Parsing; diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index 16b737e..8dcdd92 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using NiceHashMiner.Enums; using NiceHashMiner.Devices; using NiceHashMiner.Configs; +using NiceHashMiner.Net20_backport; namespace NiceHashMiner.Miners.Grouping { public class GroupMiner { @@ -32,7 +31,7 @@ public GroupMiner(List miningPairs, string key) { foreach (var pair in miningPairs) { deviceNames.Add(pair.Device.NameCount); } - DevicesInfoString = "{ " + string.Join(", ", deviceNames) + " }"; + DevicesInfoString = "{ " + StringHelper.Join(", ", deviceNames) + " }"; } // init miner { diff --git a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs index 7bd878b..2d26ef2 100644 --- a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs +++ b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs @@ -1,10 +1,9 @@ using NiceHashMiner.Devices; using NiceHashMiner.Enums; +using NiceHashMiner.Net20_backport; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners.Grouping { public static class GroupSetupUtils { diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index 26ef7bd..c89c884 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -2,9 +2,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners.Grouping { public static class GroupingLogic { diff --git a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs index 149a63f..a41c61b 100644 --- a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs +++ b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Devices; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners.Grouping { public class MiningAlgorithm { diff --git a/NiceHashMiner/Miners/Grouping/MiningDevice.cs b/NiceHashMiner/Miners/Grouping/MiningDevice.cs index 26599e5..912bce2 100644 --- a/NiceHashMiner/Miners/Grouping/MiningDevice.cs +++ b/NiceHashMiner/Miners/Grouping/MiningDevice.cs @@ -2,9 +2,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners.Grouping { public class MiningDevice { diff --git a/NiceHashMiner/Miners/Grouping/MiningPair.cs b/NiceHashMiner/Miners/Grouping/MiningPair.cs index 9649c3b..26543ab 100644 --- a/NiceHashMiner/Miners/Grouping/MiningPair.cs +++ b/NiceHashMiner/Miners/Grouping/MiningPair.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Devices; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners.Grouping { public class MiningPair { diff --git a/NiceHashMiner/Miners/Grouping/MiningSetup.cs b/NiceHashMiner/Miners/Grouping/MiningSetup.cs index 43e2782..99c878a 100644 --- a/NiceHashMiner/Miners/Grouping/MiningSetup.cs +++ b/NiceHashMiner/Miners/Grouping/MiningSetup.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners.Grouping { public class MiningSetup { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 9a71503..11d79e9 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -17,6 +17,7 @@ using Timer = System.Timers.Timer; using System.Timers; +using NiceHashMiner.Net20_backport; namespace NiceHashMiner { @@ -120,7 +121,7 @@ public Miner(string minerDeviceName) LastCommandLine = ""; - APIPort = MinersApiPortsManager.Instance.GetAvaliablePort(); + APIPort = MinersApiPortsManager.GetAvaliablePort(); IsAPIReadException = false; IsNHLocked = false; IsKillAllUsedMinerProcs = false; @@ -131,7 +132,7 @@ public Miner(string minerDeviceName) ~Miner() { // free the port - MinersApiPortsManager.Instance.RemovePort(APIPort); + MinersApiPortsManager.RemovePort(APIPort); Helpers.ConsolePrint(MinerTAG(), "MINER DESTROYED"); } @@ -156,9 +157,9 @@ public string MinerTAG() { return String.Format(MASK, MinerDeviceName, MINER_ID, "NOT_SET"); } // contains ids - List ids = new List(); - foreach (var cdevs in MiningSetup.MiningPairs) ids.Add(cdevs.Device.ID); - _minetTag = String.Format(MASK, MinerDeviceName, MINER_ID, string.Join(",", ids)); + List ids = new List(); + foreach (var cdevs in MiningSetup.MiningPairs) ids.Add(cdevs.Device.ID.ToString()); + _minetTag = String.Format(MASK, MinerDeviceName, MINER_ID, StringHelper.Join(",", ids)); } return _minetTag; } @@ -221,17 +222,17 @@ public void End() { protected void ChangeToNextAvaliablePort() { // change to new port var oldApiPort = APIPort; - var newApiPort = MinersApiPortsManager.Instance.GetAvaliablePort(); + var newApiPort = MinersApiPortsManager.GetAvaliablePort(); // check if update last command port if (UpdateBindPortCommand(oldApiPort, newApiPort)) { Helpers.ConsolePrint(MinerTAG(), String.Format("Changing miner port from {0} to {1}", oldApiPort.ToString(), newApiPort.ToString())); // free old set new - MinersApiPortsManager.Instance.RemovePort(oldApiPort); + MinersApiPortsManager.RemovePort(oldApiPort); APIPort = newApiPort; } else { // release new - MinersApiPortsManager.Instance.RemovePort(newApiPort); + MinersApiPortsManager.RemovePort(newApiPort); } } @@ -257,7 +258,7 @@ virtual protected string GetDevicesCommandString() { foreach (var mPair in MiningSetup.MiningPairs) { ids.Add(mPair.Device.ID.ToString()); } - deviceStringCommand += string.Join(",", ids); + deviceStringCommand += StringHelper.Join(",", ids); return deviceStringCommand; } diff --git a/NiceHashMiner/Miners/MinersApiPortsManager.cs b/NiceHashMiner/Miners/MinersApiPortsManager.cs index bfcb2b2..4d04d94 100644 --- a/NiceHashMiner/Miners/MinersApiPortsManager.cs +++ b/NiceHashMiner/Miners/MinersApiPortsManager.cs @@ -2,20 +2,18 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Net.NetworkInformation; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners { - public class MinersApiPortsManager : BaseLazySingleton { - private HashSet _usedPorts; + public static class MinersApiPortsManager { + //private static HashSet _usedPorts; - protected MinersApiPortsManager() { - _usedPorts = new HashSet(); - } + //static MinersApiPortsManager() { + // _usedPorts = new HashSet(); + //} - private bool IsPortAvaliable(int port) { + private static bool IsPortAvaliable(int port) { bool isAvailable = true; IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties(); @@ -42,19 +40,19 @@ private bool IsPortAvaliable(int port) { return isAvailable; } - public int GetAvaliablePort() { + public static int GetAvaliablePort() { int port = ConfigManager.GeneralConfig.ApiBindPortPoolStart; int newPortEnd = port + 3000; for (; port < newPortEnd; ++port) { - if (IsPortAvaliable(port) && _usedPorts.Add(port)) { + if (IsPortAvaliable(port) /*&& _usedPorts.Add(port)*/) { break; } } return port; } - public void RemovePort(int port) { - _usedPorts.Remove(port); + public static void RemovePort(int port) { + //_usedPorts.Remove(port); } } } diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 0a82587..81b7ff4 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using System.IO; using NiceHashMiner.Interfaces; @@ -12,19 +10,19 @@ namespace NiceHashMiner.Miners { using NiceHashMiner.Miners.Grouping; - public class MinersManager : BaseLazySingleton { + public static class MinersManager { - private MiningSession CurMiningSession; + private static MiningSession CurMiningSession; - public void StopAllMiners() { + public static void StopAllMiners() { if (CurMiningSession != null) CurMiningSession.StopAllMiners(); } - public void StopAllMinersNonProfitable() { + public static void StopAllMinersNonProfitable() { if (CurMiningSession != null) CurMiningSession.StopAllMinersNonProfitable(); } - public string GetActiveMinersGroup() { + public static string GetActiveMinersGroup() { if (CurMiningSession != null) { return CurMiningSession.GetActiveMinersGroup(); } @@ -73,12 +71,12 @@ public static Miner CreateMiner(DeviceType deviceType, string minerPath) { return null; } - public double GetTotalRate() { + public static double GetTotalRate() { if (CurMiningSession != null) return CurMiningSession.GetTotalRate(); return 0; } - public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication, + public static bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication, string miningLocation, string worker, string btcAdress) { CurMiningSession = new MiningSession(ComputeDeviceManager.Avaliable.AllAvaliableDevices, @@ -94,11 +92,11 @@ public bool StartInitialize(IMainFormRatesComunication mainFormRatesComunication /// Calculate profit for each supported algorithm per device and group. /// /// - public void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData) { + public static void SwichMostProfitableGroupUpMethod(Dictionary NiceHashData) { if (CurMiningSession != null) CurMiningSession.SwichMostProfitableGroupUpMethod(NiceHashData); } - public void MinerStatsCheck(Dictionary NiceHashData) { + public static void MinerStatsCheck(Dictionary NiceHashData) { if (CurMiningSession != null) CurMiningSession.MinerStatsCheck(NiceHashData); } } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 9a9e3c8..89741f7 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -3,12 +3,11 @@ using NiceHashMiner.Interfaces; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using NiceHashMiner.Miners.Grouping; using NiceHashMiner.Configs; using System.IO; +using NiceHashMiner.Net20_backport; using Timer = System.Timers.Timer; using System.Timers; @@ -177,7 +176,7 @@ public void StopAllMinersNonProfitable() { #endregion Start/Stop private string CalcGroupedDevicesKey(GroupedDevices group) { - return string.Join(", ", group); + return StringHelper.Join(", ", group); } public string GetActiveMinersGroup() { @@ -195,7 +194,7 @@ public string GetActiveMinersGroup() { //} } if (UniqueMinerGroups.Count > 0 && IsProfitable) { - ActiveMinersGroup = string.Join("/", UniqueMinerGroups); + ActiveMinersGroup = StringHelper.Join("/", UniqueMinerGroups); } return ActiveMinersGroup; diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 9830a8e..6a58f66 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -2,11 +2,10 @@ using NiceHashMiner.Devices; using NiceHashMiner.Enums; using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Net20_backport; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners.Parsing { static class ExtraLaunchParametersParser { @@ -132,6 +131,37 @@ public static int GetEqmCudaThreadCount(MiningPair pair) { return 1; // default } + private static bool prevHasIgnoreParam = false; + private static int logCount = 0; + + private static void IgnorePrintLogIbnit() { + prevHasIgnoreParam = false; + logCount = 0; + } + + private static void IgnorePrintLog(string param, string IGNORE_PARAM, List ignoreLogOpions = null) { + // AMD temp controll is separated and logs stuff that is ignored + bool printIgnore = true; + if (ignoreLogOpions != null) { + foreach (var ignoreOption in ignoreLogOpions) { + if (param.Equals(ignoreOption.ShortName) || param.Equals(ignoreOption.LongName)) { + printIgnore = false; + prevHasIgnoreParam = true; + logCount = 0; + break; + } + } + } + if (printIgnore && !prevHasIgnoreParam) { + LogParser(String.Format(IGNORE_PARAM, param)); + } + if (logCount == 1) { + prevHasIgnoreParam = false; + logCount = 0; + } + ++logCount; + } + private static string Parse(List MiningPairs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); @@ -159,31 +189,8 @@ private static string Parse(List MiningPairs, List opti LogParser(String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", pair.CurrentExtraLaunchParameters, pair.Device.UUID)); var parameters = pair.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' '); - bool prevHasIgnoreParam = false; - int logCount = 0; - Func ignorePrintLog = (string param) => { - // AMD temp controll is separated and logs stuff that is ignored - bool printIgnore = true; - if (ignoreLogOpions != null) { - foreach (var ignoreOption in ignoreLogOpions) { - if (param.Equals(ignoreOption.ShortName) || param.Equals(ignoreOption.LongName)) { - printIgnore = false; - prevHasIgnoreParam = true; - logCount = 0; - break; - } - } - } - if (printIgnore && !prevHasIgnoreParam) { - LogParser(String.Format(IGNORE_PARAM, param)); - } - if (logCount == 1) { - prevHasIgnoreParam = false; - logCount = 0; - } - ++logCount; - return ""; // fake crappy C# crap - }; + IgnorePrintLogIbnit(); + MinerOptionType currentFlag = MinerOptionType.NONE; foreach (var param in parameters) { @@ -203,14 +210,14 @@ private static string Parse(List MiningPairs, List opti } } if (isIngored) { // ignored - ignorePrintLog(param); + IgnorePrintLog(param, IGNORE_PARAM, ignoreLogOpions); } } else if (currentFlag != MinerOptionType.NONE) { isOptionExist[currentFlag] = true; cdevOptions[pair.Device.UUID][currentFlag] = param; currentFlag = MinerOptionType.NONE; } else { // problem - ignorePrintLog(param); + IgnorePrintLog(param, IGNORE_PARAM, ignoreLogOpions); } } } @@ -249,10 +256,10 @@ private static string Parse(List MiningPairs, List opti values.Add(cdevOptions[pair.Device.UUID][option.Type]); } string MASK = " {0} {1}"; - if(option.LongName.Contains('=')) { + if(option.LongName.Contains("=")) { MASK = " {0}{1}"; } - retVal += String.Format(MASK, option.LongName, string.Join(option.Separator, values)); + retVal += String.Format(MASK, option.LongName, StringHelper.Join(option.Separator, values)); } else if (option.FlagType == MinerOptionFlagType.SingleParam) { HashSet values = new HashSet(); foreach (var pair in MiningPairs) { @@ -264,7 +271,7 @@ private static string Parse(List MiningPairs, List opti setValue = values.First(); } string MASK = " {0} {1}"; - if (option.LongName.Contains('=')) { + if (option.LongName.Contains("=")) { MASK = " {0}{1}"; } retVal += String.Format(MASK, option.LongName, setValue); diff --git a/NiceHashMiner/Miners/Parsing/MinerOption.cs b/NiceHashMiner/Miners/Parsing/MinerOption.cs index bd222c4..8289592 100644 --- a/NiceHashMiner/Miners/Parsing/MinerOption.cs +++ b/NiceHashMiner/Miners/Parsing/MinerOption.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Miners.Parsing { public class MinerOption { diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index 91e2d48..07da344 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -3,12 +3,11 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using System.Net.Sockets; using System.Net; using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Net20_backport; namespace NiceHashMiner.Miners { @@ -47,7 +46,7 @@ protected override string GetDevicesCommandString() { foreach (var mPair in MiningSetup.MiningPairs) { ids.Add(mPair.Device.ID.ToString()); } - deviceStringCommand += string.Join(" ", ids); + deviceStringCommand += StringHelper.Join(" ", ids); // set dag load mode deviceStringCommand += String.Format(" --dag-load-mode {0} ", GetDagGenerationString(DagGenerationType)); if (DagGenerationType == DagGenerationType.Single diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs index 836b41d..ab1ffc9 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs @@ -3,9 +3,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using NiceHashMiner.Miners.Grouping; using NiceHashMiner.Miners.Parsing; diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs index 772e3e9..efffeed 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs @@ -3,9 +3,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using NiceHashMiner.Miners.Grouping; using NiceHashMiner.Miners.Parsing; diff --git a/NiceHashMiner/Net20_backport/HashSet.cs b/NiceHashMiner/Net20_backport/HashSet.cs new file mode 100644 index 0000000..6564b83 --- /dev/null +++ b/NiceHashMiner/Net20_backport/HashSet.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Net20_backport { + public class HashSet : List { + + public new void Add(T item) { + if (this.Contains(item) == false) { + base.Add(item); + } + } + + public T First() { + if(this.Count >= 1) { + return this[0]; + } + throw new IndexOutOfRangeException(); + } + } +} diff --git a/NiceHashMiner/Net20_backport/SortedSet.cs b/NiceHashMiner/Net20_backport/SortedSet.cs new file mode 100644 index 0000000..3823a71 --- /dev/null +++ b/NiceHashMiner/Net20_backport/SortedSet.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Net20_backport { + public class SortedSet : List { + public new void Add(T item) { + if (this.Contains(item) == false) { + base.Add(item); + base.Sort(); + } + } + } +} diff --git a/NiceHashMiner/Net20_backport/StringHelper.cs b/NiceHashMiner/Net20_backport/StringHelper.cs new file mode 100644 index 0000000..9d585e2 --- /dev/null +++ b/NiceHashMiner/Net20_backport/StringHelper.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Net20_backport { + public static class StringHelper { + public static string Join(string delim, IList values) { + if (values.Count == 1) { + return values[0]; + } + string ret = ""; + if (values.Count > 1) { + for (int i = 0; i < values.Count - 1; ++i) { + ret += values[i] + delim; + } + // append last + ret += values[values.Count - 1]; + } + return ret; + } + + public static bool IsNullOrWhiteSpace(string check) { + if (check == null) { + return true; + } + if (check == " ") { + return true; + } + return false; + } + } +} diff --git a/NiceHashMiner/Net20_backport/Tuple.cs b/NiceHashMiner/Net20_backport/Tuple.cs new file mode 100644 index 0000000..f92d41f --- /dev/null +++ b/NiceHashMiner/Net20_backport/Tuple.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Net20_backport { + public class Tuple { + public T1 Item1 { get; set; } + public T2 Item2 { get; set; } + + public Tuple(T1 i1, T2 i2) { + Item1 = i1; + Item2 = i2; + } + } +} diff --git a/NiceHashMiner/Net20_backport/Tuple3.cs b/NiceHashMiner/Net20_backport/Tuple3.cs new file mode 100644 index 0000000..12d8e07 --- /dev/null +++ b/NiceHashMiner/Net20_backport/Tuple3.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Net20_backport { + public class Tuple3 { + public T1 Item1 { get; set; } + public T2 Item2 { get; set; } + public T3 Item3 { get; set; } + + public Tuple3(T1 i1, T2 i2, T3 i3) { + Item1 = i1; + Item2 = i2; + Item3 = i3; + } + } +} diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 6325e5a..567892e 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -9,7 +9,7 @@ Properties NiceHashMiner NiceHashMiner - v4.5 + v2.0 512 true @@ -67,8 +67,6 @@ - - @@ -77,7 +75,6 @@ - @@ -210,6 +207,11 @@ + + + + + diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index 34988a2..8189ff4 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -183,7 +183,7 @@ public static string GetNiceHashAPIData(string URL, string worker) string ResponseFromServer; try { - string ActiveMinersGroup = MinersManager.Instance.GetActiveMinersGroup(); + string ActiveMinersGroup = MinersManager.GetActiveMinersGroup(); HttpWebRequest WR = (HttpWebRequest)WebRequest.Create(URL); WR.UserAgent = "NiceHashMiner/" + Application.ProductVersion; diff --git a/NiceHashMiner/PInvoke/PInvokeHelpers.cs b/NiceHashMiner/PInvoke/PInvokeHelpers.cs index b624fbc..89f2364 100644 --- a/NiceHashMiner/PInvoke/PInvokeHelpers.cs +++ b/NiceHashMiner/PInvoke/PInvokeHelpers.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.InteropServices; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.PInvoke { class PInvokeHelpers { diff --git a/NiceHashMiner/ProfitabilityCalculator.cs b/NiceHashMiner/ProfitabilityCalculator.cs index c96ef70..66346a0 100644 --- a/NiceHashMiner/ProfitabilityCalculator.cs +++ b/NiceHashMiner/ProfitabilityCalculator.cs @@ -1,9 +1,7 @@ using NiceHashMiner.Enums; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner { // this class mirrors the web profitability, chech what https://www.nicehash.com/?p=calc is using for each algo diff --git a/NiceHashMiner/TextBoxKeyPressEvents.cs b/NiceHashMiner/TextBoxKeyPressEvents.cs index bfdcc17..6d340c5 100644 --- a/NiceHashMiner/TextBoxKeyPressEvents.cs +++ b/NiceHashMiner/TextBoxKeyPressEvents.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace NiceHashMiner { @@ -23,7 +21,7 @@ public static void textBoxDoubleOnly_KeyPress(object sender, KeyPressEventArgs e // allow only one zero var textBox = sender as TextBox; string checkText = textBox.Text; - if (e.KeyChar != '.' && textBox.SelectionLength != textBox.Text.Length && IsHandleZero(e, checkText) && !checkText.Contains('.')) { + if (e.KeyChar != '.' && textBox.SelectionLength != textBox.Text.Length && IsHandleZero(e, checkText) && !checkText.Contains(".")) { e.Handled = true; return; } diff --git a/NiceHashMiner/Utils/DownloadSetup.cs b/NiceHashMiner/Utils/DownloadSetup.cs index 5761bb3..8e737a3 100644 --- a/NiceHashMiner/Utils/DownloadSetup.cs +++ b/NiceHashMiner/Utils/DownloadSetup.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Utils { public class DownloadSetup { diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 1fbc5d7..4d89791 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -3,10 +3,8 @@ using System.ComponentModel; using System.Diagnostics; using System.IO; -using System.Linq; using System.Net; using System.Text; -using System.Threading.Tasks; using System.IO.Compression; using System.Windows.Forms; using NiceHashMiner.Interfaces; diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs index ac6390b..e4e1413 100644 --- a/NiceHashMiner/Utils/MinersDownloader.cs +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -5,11 +5,9 @@ using System.Diagnostics; using System.IO; using System.IO.Compression; -using System.Linq; using System.Net; using System.Text; using System.Threading; -using System.Threading.Tasks; namespace NiceHashMiner.Utils { public class MinersDownloader { @@ -127,43 +125,44 @@ private void UnzipStart() { } private void UnzipThreadRoutine() { - if (File.Exists(_downloadSetup.BinsZipLocation)) { - Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); - Helpers.ConsolePrint(TAG, "unzipping"); - using (ZipArchive archive = ZipFile.Open(_downloadSetup.BinsZipLocation, ZipArchiveMode.Read)) { - //archive.ExtractToDirectory("bin"); - _minerUpdateIndicator.SetMaxProgressValue(archive.Entries.Count); - int prog = 0; - // first create dirs - foreach (ZipArchiveEntry entry in archive.Entries) { - if (entry.Length == 0) { - Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); - Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); - Directory.CreateDirectory(entry.FullName); - _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); - } - } - // unzip files - foreach (ZipArchiveEntry entry in archive.Entries) { - if (entry.Length > 0) { - Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); - Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); - entry.ExtractToFile(entry.FullName); - _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); - } - } - } - // after unzip stuff - _minerUpdateIndicator.FinishMsg(true); - // remove bins zip - try { - if (File.Exists(_downloadSetup.BinsZipLocation)) { - File.Delete(_downloadSetup.BinsZipLocation); - } - } catch { } - } else { - Helpers.ConsolePrint(TAG, "UnzipThreadRoutine bin.zip file not found"); - } + // TODO fix zip stuff + //if (File.Exists(_downloadSetup.BinsZipLocation)) { + // Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); + // Helpers.ConsolePrint(TAG, "unzipping"); + // using (ZipArchive archive = ZipFile.Open(_downloadSetup.BinsZipLocation, ZipArchiveMode.Read)) { + // //archive.ExtractToDirectory("bin"); + // _minerUpdateIndicator.SetMaxProgressValue(archive.Entries.Count); + // int prog = 0; + // // first create dirs + // foreach (ZipArchiveEntry entry in archive.Entries) { + // if (entry.Length == 0) { + // Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); + // Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); + // Directory.CreateDirectory(entry.FullName); + // _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); + // } + // } + // // unzip files + // foreach (ZipArchiveEntry entry in archive.Entries) { + // if (entry.Length > 0) { + // Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); + // Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); + // entry.ExtractToFile(entry.FullName); + // _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); + // } + // } + // } + // // after unzip stuff + // _minerUpdateIndicator.FinishMsg(true); + // // remove bins zip + // try { + // if (File.Exists(_downloadSetup.BinsZipLocation)) { + // File.Delete(_downloadSetup.BinsZipLocation); + // } + // } catch { } + //} else { + // Helpers.ConsolePrint(TAG, "UnzipThreadRoutine bin.zip file not found"); + //} } } } diff --git a/NiceHashMiner/Utils/MinersExistanceChecker.cs b/NiceHashMiner/Utils/MinersExistanceChecker.cs index b3f6df9..a56e731 100644 --- a/NiceHashMiner/Utils/MinersExistanceChecker.cs +++ b/NiceHashMiner/Utils/MinersExistanceChecker.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace NiceHashMiner.Utils { public static class MinersExistanceChecker { diff --git a/NiceHashMiner/app.config b/NiceHashMiner/app.config index 51278a4..2fa6e95 100644 --- a/NiceHashMiner/app.config +++ b/NiceHashMiner/app.config @@ -1,3 +1,3 @@ - + diff --git a/nvidiasetp0state/App.config b/nvidiasetp0state/App.config index e707b32..343984d 100644 --- a/nvidiasetp0state/App.config +++ b/nvidiasetp0state/App.config @@ -2,5 +2,5 @@ - + diff --git a/nvidiasetp0state/nvidiasetp0state.csproj b/nvidiasetp0state/nvidiasetp0state.csproj index 3cf1e02..1945ac0 100644 --- a/nvidiasetp0state/nvidiasetp0state.csproj +++ b/nvidiasetp0state/nvidiasetp0state.csproj @@ -9,7 +9,7 @@ Properties nvidiasetp0state nvidiasetp0state - v4.5 + v2.0 512 From 11df41ac595e6ac141f14082dd998078e531fec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 5 Dec 2016 18:26:40 +0100 Subject: [PATCH 160/366] use 7zr.exe for uncompressing, TODO fix unziping progressbar --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/MinersApiPortsManager.cs | 11 +-- NiceHashMiner/Net20_backport/HashSet.cs | 4 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- NiceHashMiner/Utils/MinersDownloadManager.cs | 8 +- NiceHashMiner/Utils/MinersDownloader.cs | 79 +++++++++++++++++++ 6 files changed, 93 insertions(+), 15 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 8f5cdb2..5df2d52 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -50,7 +50,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = "_NET20_backport"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/MinersApiPortsManager.cs b/NiceHashMiner/Miners/MinersApiPortsManager.cs index 4d04d94..ae6cb1c 100644 --- a/NiceHashMiner/Miners/MinersApiPortsManager.cs +++ b/NiceHashMiner/Miners/MinersApiPortsManager.cs @@ -1,5 +1,6 @@ using NiceHashMiner.Configs; using NiceHashMiner.Enums; +using NiceHashMiner.Net20_backport; using System; using System.Collections.Generic; using System.Net.NetworkInformation; @@ -7,11 +8,7 @@ namespace NiceHashMiner.Miners { public static class MinersApiPortsManager { - //private static HashSet _usedPorts; - - //static MinersApiPortsManager() { - // _usedPorts = new HashSet(); - //} + private static HashSet _usedPorts = new HashSet(); private static bool IsPortAvaliable(int port) { bool isAvailable = true; @@ -44,7 +41,7 @@ public static int GetAvaliablePort() { int port = ConfigManager.GeneralConfig.ApiBindPortPoolStart; int newPortEnd = port + 3000; for (; port < newPortEnd; ++port) { - if (IsPortAvaliable(port) /*&& _usedPorts.Add(port)*/) { + if (IsPortAvaliable(port) && _usedPorts.Add(port)) { break; } } @@ -52,7 +49,7 @@ public static int GetAvaliablePort() { } public static void RemovePort(int port) { - //_usedPorts.Remove(port); + _usedPorts.Remove(port); } } } diff --git a/NiceHashMiner/Net20_backport/HashSet.cs b/NiceHashMiner/Net20_backport/HashSet.cs index 6564b83..079cf72 100644 --- a/NiceHashMiner/Net20_backport/HashSet.cs +++ b/NiceHashMiner/Net20_backport/HashSet.cs @@ -5,10 +5,12 @@ namespace NiceHashMiner.Net20_backport { public class HashSet : List { - public new void Add(T item) { + public new bool Add(T item) { if (this.Contains(item) == false) { base.Add(item); + return true; } + return false; } public T First() { diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index b9c3fd0..879d943 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.9")] -[assembly: AssemblyFileVersion("1.7.3.9")] +[assembly: AssemblyVersion("1.7.3.10")] +[assembly: AssemblyFileVersion("1.7.3.10")] diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 4d89791..9284e21 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,13 +15,13 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_8.zip", - "bins.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_v1.7.3.10.7z", + "bins.7z", "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_3_6.zip", - "bins_3rdparty.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_v1.7.3.10.7z", + "bins_3rdparty.7z", "bin_3rdparty"); // #1 check if miners exits diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs index e4e1413..1c387b1 100644 --- a/NiceHashMiner/Utils/MinersDownloader.cs +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -125,6 +125,7 @@ private void UnzipStart() { } private void UnzipThreadRoutine() { + // TODO fix zip stuff //if (File.Exists(_downloadSetup.BinsZipLocation)) { // Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); @@ -163,6 +164,84 @@ private void UnzipThreadRoutine() { //} else { // Helpers.ConsolePrint(TAG, "UnzipThreadRoutine bin.zip file not found"); //} + + try { + if (File.Exists(_downloadSetup.BinsZipLocation)) { + Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); + Helpers.ConsolePrint(TAG, "unzipping"); + using (Process p_7zr = new Process()) { + // set to 100% + _minerUpdateIndicator.SetMaxProgressValue(100); + double prog = 0; + // set proc + p_7zr.StartInfo.FileName = "7zr.exe"; + p_7zr.StartInfo.Arguments = String.Format("-y x {0}", _downloadSetup.BinsZipLocation); + p_7zr.StartInfo.UseShellExecute = false; + p_7zr.StartInfo.RedirectStandardError = true; + p_7zr.StartInfo.RedirectStandardOutput = true; + p_7zr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + p_7zr.StartInfo.CreateNoWindow = true; + + if (p_7zr.Start()) { + string readLine = ""; + bool isOk = false; + do { + readLine = p_7zr.StandardOutput.ReadLine(); + Helpers.ConsolePrint("ZipArchiveEntry_7zr.exe", readLine); + if (readLine != null && readLine.Contains("%")) { + Helpers.ConsolePrint("ZipArchiveEntry_7zr.exe", readLine); + string parseNumStr = readLine.Substring(0, readLine.IndexOf("%") + 1).Trim(); + double progTmp = Helpers.ParseDouble(parseNumStr); + if (progTmp > 0) { + prog = progTmp; + if (prog > 100) prog = 100; + _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); + } + } + if (readLine != null && readLine.Contains("Ok")) { + isOk = true; + prog = 100; + _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); + } + } while (!p_7zr.StandardOutput.EndOfStream); + } else { + Helpers.ConsolePrint(TAG, "Cannot start 7zr.exe"); + } + + //// first create dirs + //foreach (ZipArchiveEntry entry in archive.Entries) { + // if (entry.Length == 0) { + // Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); + // Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); + // Directory.CreateDirectory(entry.FullName); + // _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); + // } + //} + //// unzip files + //foreach (ZipArchiveEntry entry in archive.Entries) { + // if (entry.Length > 0) { + // Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); + // Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); + // entry.ExtractToFile(entry.FullName); + // _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); + // } + //} + } + // after unzip stuff + _minerUpdateIndicator.FinishMsg(true); + // remove bins zip + try { + if (File.Exists(_downloadSetup.BinsZipLocation)) { + File.Delete(_downloadSetup.BinsZipLocation); + } + } catch { } + } else { + Helpers.ConsolePrint(TAG, String.Format("UnzipThreadRoutine {0} file not found", _downloadSetup.BinsZipLocation)); + } + } catch (Exception ) { + Helpers.ConsolePrint(TAG, "UnzipThreadRoutine has encountered an error while"); + // TODO show notification to the user to download and extract manually + } } } } From b3f8b6ff28b97f9e3f9c17dfd18e5920052cbc91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 5 Dec 2016 19:00:16 +0100 Subject: [PATCH 161/366] use copy instead of move for backup --- .../Configs/ConfigJsonFile/ConfigFile.cs | 2 +- NiceHashMiner/Utils/MinersDownloader.cs | 19 ------------------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs index d0635b8..77d6832 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs @@ -73,7 +73,7 @@ public void CreateBackup() { try { if (File.Exists(_filePathOld)) File.Delete(_filePathOld); - File.Move(_filePath, _filePathOld); + File.Copy(_filePath, _filePathOld, true); } catch { } } } diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs index 1c387b1..b9865de 100644 --- a/NiceHashMiner/Utils/MinersDownloader.cs +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -207,25 +207,6 @@ private void UnzipThreadRoutine() { } else { Helpers.ConsolePrint(TAG, "Cannot start 7zr.exe"); } - - //// first create dirs - //foreach (ZipArchiveEntry entry in archive.Entries) { - // if (entry.Length == 0) { - // Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); - // Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); - // Directory.CreateDirectory(entry.FullName); - // _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); - // } - //} - //// unzip files - //foreach (ZipArchiveEntry entry in archive.Entries) { - // if (entry.Length > 0) { - // Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); - // Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); - // entry.ExtractToFile(entry.FullName); - // _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); - // } - //} } // after unzip stuff _minerUpdateIndicator.FinishMsg(true); From 0a13fa6f8d2cdbd0161e49c5a86029ab46911c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 5 Dec 2016 19:05:41 +0100 Subject: [PATCH 162/366] update russian translations --- NiceHashMiner/langs/ru.lang | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 5cee68d..9871848 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -322,8 +322,8 @@ "NET45_Not_Intsalled_msg" : "Для корректной работы NiceHash Miner требуется .NET Framework 4.5 или выше. Установите, пожалуйста, Microsoft .NET Framework 4.5", "Form_Settings_ToolTip_DisableDefaultOptimizations": "Если отмечено, отключает все настройки оптимизации по умолчанию, делая майнинг потенциально более стабильным, но значительно медленнее (особенно для карт AMD).", "Form_Settings_Text_DisableDefaultOptimizations": "Отключить оптимизацию", - "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Продолжить майнинг без доступа к интернету", - "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess": "Если отмечено, NiceHashMiner продолжит майнинг вне зависимости от подключения к интернету.", + "Form_Settings_Text_ContinueMiningIfNoInternetAccess" : "Простаивать, когда нет интернета", + "Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess": "Если включено, NiceHashMiner будет останавливать майнинг, при отсутствии доступа к интернету", "Form_Main_3rdParty_Title": "Дисклеймер от использования стороннего ПО", "Form_Main_3rdParty_Text": "Мы интегрировали стороннее программное обеспечение (разработанное Claymore), которое должно поднять скорость вашего майнинга и дать вам более стабильный опыт майнинга — это потенциально может привести к большему заработку за короткий период времени, даже после вычета комиссии разработчика. Однако, поскольку это стороннее программное обеспечение является полностью закрытым, у нас нет никакой возможности исследовать его. NiceHash не может ручаться за использование этого ПО и отказывается брать на себя ответственность за любой причиненный ущерб - нарушение безопасности, потерю данных или средств и другие проблемы. Соглашением с этим дисклеймером, вы берете полную ответственность за использование этих майнеров с закрытым исходным кодом от Claymore.", "Form_Main_3rdParty_Button_Agree_Text": "Я соглашаюсь", @@ -334,5 +334,6 @@ "Form_Settings_General_AllowMultipleInstances_ToolTip": "Когда не отмечено, NiceHash Miner разрешит работу только одного экземпляра (он закроет новый запущенный экземпляр, если один экземпляр уже работает).", "Form_Main_No_Device_Enabled_Algorithms_For_Mining": "Для выбранных устройств нет включенных алгоритмов. Перейдите в Настройки или Бенчмарк и включите хотя-бы 1 алгоритм.", "Form_Benchmark_checkbox_StartMiningAfterBenchmark": "Запустить майнинг после бенчмарка", + "Form_Main_StartMiningReturnedFalse": "NiceHashMiner не может начать майнинг. Убедитесь, что хотя-бы одно устройство включено с хотя-бы одним включенным и прошедшим бенчмарк алгоритмом" } } \ No newline at end of file From 07673ad9845a55b59dd5de25a90c3231a69687c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 5 Dec 2016 19:21:00 +0100 Subject: [PATCH 163/366] increase DaggerHashimoto GPU RAM limit --- NiceHashMiner/Devices/AmdGpuDevice.cs | 2 +- NiceHashMiner/Devices/ComputeDevice.cs | 2 +- NiceHashMiner/Devices/CudaDevice.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Devices/AmdGpuDevice.cs b/NiceHashMiner/Devices/AmdGpuDevice.cs index 1dd06bb..d7a0f03 100644 --- a/NiceHashMiner/Devices/AmdGpuDevice.cs +++ b/NiceHashMiner/Devices/AmdGpuDevice.cs @@ -49,7 +49,7 @@ public bool IsEtherumCapable() { if (!_isEtherumCapableInit) { _isEtherumCapableInit = true; // check if 2GB device memory - _isEtherumCapable = _openClSubset._CL_DEVICE_GLOBAL_MEM_SIZE >= ComputeDevice.MEMORY_2GB; + _isEtherumCapable = _openClSubset._CL_DEVICE_GLOBAL_MEM_SIZE >= ComputeDevice.MEMORY_3GB; } return _isEtherumCapable; } diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index b440464..f0f635f 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -31,7 +31,7 @@ public class ComputeDevice // GPU extras public readonly bool IsEtherumCapale; - public static readonly ulong MEMORY_2GB = 2147483648; + public static readonly ulong MEMORY_3GB = 3221225472; //CudaDevice _cudaDevice = null; //AmdGpuDevice _amdDevice = null; diff --git a/NiceHashMiner/Devices/CudaDevice.cs b/NiceHashMiner/Devices/CudaDevice.cs index 916a70e..08f75d5 100644 --- a/NiceHashMiner/Devices/CudaDevice.cs +++ b/NiceHashMiner/Devices/CudaDevice.cs @@ -33,7 +33,7 @@ public bool IsEtherumCapable() { _isEtherumCapableInit = true; _isEtherumCapable = SM_major == 3 || SM_major == 5 || SM_major == 6; // check if 2GB device memory - _isEtherumCapable = _isEtherumCapable && DeviceGlobalMemory >= ComputeDevice.MEMORY_2GB; + _isEtherumCapable = _isEtherumCapable && DeviceGlobalMemory >= ComputeDevice.MEMORY_3GB; // exception devices if (DeviceName.Contains("750") && DeviceName.Contains("Ti")) { From 9e61ee5e93f673aa8ab89f497360222dfba71246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 5 Dec 2016 22:19:06 +0100 Subject: [PATCH 164/366] increase timeout, fix NVIDIA driver comparison --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 2 +- NiceHashMiner/NiceHashStats.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index f667556..5ea2c37 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -38,7 +38,7 @@ public bool IsLesserVersionThan(NVIDIA_SMI_DRIVER b) { if(leftPart < b.leftPart) { return true; } - if (getRightVal(rightPart) < getRightVal(b.rightPart)) { + if (leftPart == b.leftPart && getRightVal(rightPart) < getRightVal(b.rightPart)) { return true; } return false; diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index 8189ff4..5722199 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -190,10 +190,10 @@ public static string GetNiceHashAPIData(string URL, string worker) if (worker.Length > 64) worker = worker.Substring(0, 64); WR.Headers.Add("NiceHash-Worker-ID", worker); WR.Headers.Add("NHM-Active-Miners-Group", ActiveMinersGroup); - WR.Timeout = 10000; + WR.Timeout = 30 * 1000; WebResponse Response = WR.GetResponse(); Stream SS = Response.GetResponseStream(); - SS.ReadTimeout = 10000; + SS.ReadTimeout = 20 * 1000; StreamReader Reader = new StreamReader(SS); ResponseFromServer = Reader.ReadToEnd(); if (ResponseFromServer.Length == 0 || ResponseFromServer[0] != '{') From be0e1f6d991eb1aa6b2db90f237b0a6769b9d9a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 6 Dec 2016 13:24:01 +0100 Subject: [PATCH 165/366] Add WMI detection --- NiceHashMiner/Helpers.cs | 12 ++++++++++++ NiceHashMiner/Program.cs | 10 +++++++++- NiceHashMiner/langs/en.lang | 4 +++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index 42b8d6d..64feb12 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -246,5 +246,17 @@ public static double ParseDouble(string text) { } } + // IsWMI enabled + public static bool IsWMIEnabled() { + try { + ManagementObjectCollection moc = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_OperatingSystem").Get(); + ConsolePrint("NICEHASH", "WMI service seems to be running, ManagementObjectSearcher returned success."); + return true; + } + catch { + ConsolePrint("NICEHASH", "ManagementObjectSearcher not working need WMI service to be running"); + } + return false; + } } } diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index f0559b6..d5bde55 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -79,7 +79,15 @@ static void Main(string[] argv) ConfigManager.GeneralConfig.Language = commandLineArgs.LangValue; } - Application.Run(new Form_Main()); + // check WMI + if (Helpers.IsWMIEnabled()) { + Application.Run(new Form_Main()); + } + else { + MessageBox.Show(International.GetText("Program_WMI_Error_Text"), + International.GetText("Program_WMI_Error_Title"), + MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 4195ca3..735b314 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -334,6 +334,8 @@ "Form_Settings_General_AllowMultipleInstances_ToolTip": "When unchecked NiceHash Miner will allow only one instance running (it will close a new started instance if there is an opened instance running).", "Form_Main_No_Device_Enabled_Algorithms_For_Mining": "There are no enabled algorithms for selected devices. Go to Settings or Benchmarks and enable at least 1 Algorithm.", "Form_Benchmark_checkbox_StartMiningAfterBenchmark": "Start mining after benchmark", - "Form_Main_StartMiningReturnedFalse": "NiceHash Miner cannot start mining. Make sure you have at least one enabled device that has at least one enabled and benchmarked algorithm." + "Form_Main_StartMiningReturnedFalse": "NiceHash Miner cannot start mining. Make sure you have at least one enabled device that has at least one enabled and benchmarked algorithm.", + "Program_WMI_Error_Text": "NiceHash Miner cannot run needed components. It seems that your system has Windows Management Instrumentation service Disabled. In order for NiceHash Miner to work properly Windows Management Instrumentation service needs to be Enabled. This service is needed to detect RAM usage and Avaliable Video controler information. Enable Windows Management Instrumentation service manually and start NiceHash Miner.", + "Program_WMI_Error_Title": "Windows Management Instrumentation Error", } } From 0e27cd8da60c0d3aa8fc33738ba0f0a1ef87bfaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 6 Dec 2016 15:37:44 +0100 Subject: [PATCH 166/366] charpcompress WIP --- 3rdparty/sharpcompress-0.11/LinqBridge.dll | Bin 0 -> 62976 bytes 3rdparty/sharpcompress-0.11/SharpCompress.dll | Bin 0 -> 477696 bytes NiceHashMiner/NiceHashMiner.csproj | 8 ++ NiceHashMiner/Utils/MinersDownloader.cs | 114 ++++++++++++------ 4 files changed, 83 insertions(+), 39 deletions(-) create mode 100644 3rdparty/sharpcompress-0.11/LinqBridge.dll create mode 100644 3rdparty/sharpcompress-0.11/SharpCompress.dll diff --git a/3rdparty/sharpcompress-0.11/LinqBridge.dll b/3rdparty/sharpcompress-0.11/LinqBridge.dll new file mode 100644 index 0000000000000000000000000000000000000000..b7955c089b592316e1ec24ac95e66a90261c4306 GIT binary patch literal 62976 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 J@Bg0${tMbkHu(Sm literal 0 HcmV?d00001 diff --git a/3rdparty/sharpcompress-0.11/SharpCompress.dll b/3rdparty/sharpcompress-0.11/SharpCompress.dll new file mode 100644 index 0000000000000000000000000000000000000000..b351b036f2981af97c79a1538225efdb76dd1163 GIT binary patch literal 477696 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�A$7X(OdZXe4&Z{NLHp9+87~6)AW&2!nT@5qofM^bu-t=YChVtFZO)qrSxpDnH zrSbi0C+Dt^-)nk(vr_Uo{QgFMB;zY&A<3|B_7VyvX<4&oY)#!;M%JuttQZTn(KYKD z(mGd&PJgKFl@nDt6Ye~lw+D{`Hu60lmPx}pQ4XAEqU zvun0BI=`Wqvt6XQ&eH%~&=$Yi>zoDn!sItd0e8u0qiMCUFkCEB1KB=6`*A4a5iJjh z^PGY^fydjQ23w{7q-lp&gQOR8+Im``Za=$nY8=ulvO~!RtmQK1>4o8nA-r<9FX#3e za{8}at+0*8HX4?6EV=vW2RaE2Mr;&UR8)YU~1G z4-O$E#A@=V1}n_T7>;+fo_b&`oH*8VBOH1V?m`0oJ-mS7g`GTmI?=*{tGwVb)V~lH zlQQza&4V=p{|VJgrNz0`{{A6CYU{p^<_ z6HI1Z`aPeoxZX1)f5r7W9?a!q=UwI4Zb9l()#4K-hAXeDR$!fCs#m$qp2y^SWcGOD zGkNO}@^e7CJeq|)oN9fs_{Fort|T>IDl38~xl=j$ptUd2Q4R*b^#P9f7Rx0qW?wl~ z-}!`zem|m%szXkoZ~Pv@_kbid5xP>nJ1^k!OIt_CgCs^}cVd{mU9QMiwZH6AsG-!D z=;d5xr?BsI`;U)+K07B+Lr&BBcDB&f&(==roqhC2ruT#eaQEzWycO!0mj4xAP7CiQn=+@ki!#9@{KO}=qB9exAu0vb${Zw{!jcY{|h{CUanO7`uh8ooysz0 zi&(qDe^vjj^xv@m#JBhp592TJGw6Y@L0`h&eXL8^y^r-anUCk~vEPaSKkARGFHYyo z`thOft$w%q+Ui^DOr++mSD|z_jqcGLM>SDLqb5cupMFS`V^6W4tp8xFi2 z=W&tfef~D{Suh{s_dXxYd|n|`VZiaB%=wja4g-$A%bZ_@^M-K2D7Lx$rLm_HoVtqF9gyO@86X zAWIJJ-V7F|1)C%{*o`OSn#N9kV2cLJDEKLb`<|0Fthe;sL78s5n~=nVd~zgoQJl5E z`?m5WyHiSwIw4&_7asLB?nrqG7o{Oy#Ggx!MgO}md^5sOR@WAGk!|Ox69}u-YawSP^-3?n0~#i<2S)phv2QU7u*`! z`^?;Zi?n?AP10)JcS&o$8MKFyBkB)sCw|`K6))e2rye>rpj!7D7vv4n?1blEV=8yw zEqh1!5CB$dc*
m>)&rtakmCsQA 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\logo.ico + + ..\3rdparty\sharpcompress-0.11\LinqBridge.dll + False ..\3rdparty\log4net\log4net.dll @@ -62,6 +65,9 @@ ..\3rdparty\json\Newtonsoft.Json.dll + + ..\3rdparty\sharpcompress-0.11\SharpCompress.dll + @@ -338,9 +344,11 @@ + + diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs index b9865de..d053120 100644 --- a/NiceHashMiner/Utils/MinersDownloader.cs +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -1,4 +1,7 @@ using NiceHashMiner.Interfaces; +using SharpCompress.Archive.SevenZip; +using SharpCompress.Common; +using SharpCompress.Reader; using System; using System.Collections.Generic; using System.ComponentModel; @@ -165,47 +168,81 @@ private void UnzipThreadRoutine() { // Helpers.ConsolePrint(TAG, "UnzipThreadRoutine bin.zip file not found"); //} + /////////////////////// + //try { + // if (File.Exists(_downloadSetup.BinsZipLocation)) { + // Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); + // Helpers.ConsolePrint(TAG, "unzipping"); + // using (Process p_7zr = new Process()) { + // // set to 100% + // _minerUpdateIndicator.SetMaxProgressValue(100); + // double prog = 0; + // // set proc + // p_7zr.StartInfo.FileName = "7zr.exe"; + // p_7zr.StartInfo.Arguments = String.Format("-y x {0}", _downloadSetup.BinsZipLocation); + // p_7zr.StartInfo.UseShellExecute = false; + // p_7zr.StartInfo.RedirectStandardError = true; + // p_7zr.StartInfo.RedirectStandardOutput = true; + // p_7zr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + // p_7zr.StartInfo.CreateNoWindow = true; + + // if (p_7zr.Start()) { + // string readLine = ""; + // bool isOk = false; + // do { + // readLine = p_7zr.StandardOutput.ReadLine(); + // Helpers.ConsolePrint("ZipArchiveEntry_7zr.exe", readLine); + // if (readLine != null && readLine.Contains("%")) { + // Helpers.ConsolePrint("ZipArchiveEntry_7zr.exe", readLine); + // string parseNumStr = readLine.Substring(0, readLine.IndexOf("%") + 1).Trim(); + // double progTmp = Helpers.ParseDouble(parseNumStr); + // if (progTmp > 0) { + // prog = progTmp; + // if (prog > 100) prog = 100; + // _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); + // } + // } + // if (readLine != null && readLine.Contains("Ok")) { + // isOk = true; + // prog = 100; + // _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); + // } + // } while (!p_7zr.StandardOutput.EndOfStream); + // } else { + // Helpers.ConsolePrint(TAG, "Cannot start 7zr.exe"); + // } + // } + // // after unzip stuff + // _minerUpdateIndicator.FinishMsg(true); + // // remove bins zip + // try { + // if (File.Exists(_downloadSetup.BinsZipLocation)) { + // File.Delete(_downloadSetup.BinsZipLocation); + // } + // } catch { } + // } else { + // Helpers.ConsolePrint(TAG, String.Format("UnzipThreadRoutine {0} file not found", _downloadSetup.BinsZipLocation)); + // } + //} catch (Exception) { + // Helpers.ConsolePrint(TAG, "UnzipThreadRoutine has encountered an error while"); + // // TODO show notification to the user to download and extract manually + //} + try { if (File.Exists(_downloadSetup.BinsZipLocation)) { + Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); Helpers.ConsolePrint(TAG, "unzipping"); - using (Process p_7zr = new Process()) { - // set to 100% - _minerUpdateIndicator.SetMaxProgressValue(100); - double prog = 0; - // set proc - p_7zr.StartInfo.FileName = "7zr.exe"; - p_7zr.StartInfo.Arguments = String.Format("-y x {0}", _downloadSetup.BinsZipLocation); - p_7zr.StartInfo.UseShellExecute = false; - p_7zr.StartInfo.RedirectStandardError = true; - p_7zr.StartInfo.RedirectStandardOutput = true; - p_7zr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; - p_7zr.StartInfo.CreateNoWindow = true; - - if (p_7zr.Start()) { - string readLine = ""; - bool isOk = false; - do { - readLine = p_7zr.StandardOutput.ReadLine(); - Helpers.ConsolePrint("ZipArchiveEntry_7zr.exe", readLine); - if (readLine != null && readLine.Contains("%")) { - Helpers.ConsolePrint("ZipArchiveEntry_7zr.exe", readLine); - string parseNumStr = readLine.Substring(0, readLine.IndexOf("%") + 1).Trim(); - double progTmp = Helpers.ParseDouble(parseNumStr); - if (progTmp > 0) { - prog = progTmp; - if (prog > 100) prog = 100; - _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); - } - } - if (readLine != null && readLine.Contains("Ok")) { - isOk = true; - prog = 100; - _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); + using (var archive = SevenZipArchive.Open(_downloadSetup.BinsZipLocation)) { + var reader = archive.ExtractAllEntries(); + //var openedStream = reader.OpenEntryStream(); + while (reader.MoveToNextEntry()) { + try { + if (!reader.Entry.IsDirectory) { + Helpers.ConsolePrint(TAG, reader.Entry.Key); + reader.WriteEntryToDirectory("", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite); } - } while (!p_7zr.StandardOutput.EndOfStream); - } else { - Helpers.ConsolePrint(TAG, "Cannot start 7zr.exe"); + } catch { } } } // after unzip stuff @@ -219,9 +256,8 @@ private void UnzipThreadRoutine() { } else { Helpers.ConsolePrint(TAG, String.Format("UnzipThreadRoutine {0} file not found", _downloadSetup.BinsZipLocation)); } - } catch (Exception ) { - Helpers.ConsolePrint(TAG, "UnzipThreadRoutine has encountered an error while"); - // TODO show notification to the user to download and extract manually + } catch (Exception e) { + Helpers.ConsolePrint(TAG, "UnzipThreadRoutine has encountered an error: " + e.Message); } } } From d7733dde3ecb6b17f50ced81d70eace56211b293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 6 Dec 2016 15:40:20 +0100 Subject: [PATCH 167/366] update russian translations --- NiceHashMiner/langs/ru.lang | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 9871848..b5e7ec0 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -334,6 +334,8 @@ "Form_Settings_General_AllowMultipleInstances_ToolTip": "Когда не отмечено, NiceHash Miner разрешит работу только одного экземпляра (он закроет новый запущенный экземпляр, если один экземпляр уже работает).", "Form_Main_No_Device_Enabled_Algorithms_For_Mining": "Для выбранных устройств нет включенных алгоритмов. Перейдите в Настройки или Бенчмарк и включите хотя-бы 1 алгоритм.", "Form_Benchmark_checkbox_StartMiningAfterBenchmark": "Запустить майнинг после бенчмарка", - "Form_Main_StartMiningReturnedFalse": "NiceHashMiner не может начать майнинг. Убедитесь, что хотя-бы одно устройство включено с хотя-бы одним включенным и прошедшим бенчмарк алгоритмом" + "Form_Main_StartMiningReturnedFalse": "NiceHashMiner не может начать майнинг. Убедитесь, что хотя-бы одно устройство включено с хотя-бы одним включенным и прошедшим бенчмарк алгоритмом", + "Program_WMI_Error_Text": "NiceHash Miner не может запустить необходимые компоненты. Похоже, что в вашей системе отключен сервис Инструментарий управления Windows. Для корректной работы NiceHash Miner, сервис Инструментарий управления Windows должен быть включен. Этот сервис нужен для определения использования RAM и доступной информации видеоконтроллера. Включите сервис Инструментарий управления Windows вручную и запустите NiceHash Miner.", + "Program_WMI_Error_Title": "Ошибка Инструментария управления Windows", } } \ No newline at end of file From 375d81ab3e38108dd7e03619f04337c738e12e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 6 Dec 2016 18:55:22 +0100 Subject: [PATCH 168/366] revert back to zip format, faster --- NiceHashMiner/NiceHashMiner.csproj | 2 - NiceHashMiner/Utils/MinersDownloadManager.cs | 8 +- NiceHashMiner/Utils/MinersDownloader.cs | 125 +++---------------- 3 files changed, 19 insertions(+), 116 deletions(-) diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 70f49cb..1add196 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -344,11 +344,9 @@ - - diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 9284e21..7055a78 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,13 +15,13 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_v1.7.3.10.7z", - "bins.7z", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_6.zip", + "bins.zip", "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_v1.7.3.10.7z", - "bins_3rdparty.7z", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_3_6.zip", + "bins_3rdparty.zip", "bin_3rdparty"); // #1 check if miners exits diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs index d053120..b8296ea 100644 --- a/NiceHashMiner/Utils/MinersDownloader.cs +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -1,4 +1,5 @@ using NiceHashMiner.Interfaces; +using SharpCompress.Archive; using SharpCompress.Archive.SevenZip; using SharpCompress.Common; using SharpCompress.Reader; @@ -128,121 +129,25 @@ private void UnzipStart() { } private void UnzipThreadRoutine() { - - // TODO fix zip stuff - //if (File.Exists(_downloadSetup.BinsZipLocation)) { - // Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); - // Helpers.ConsolePrint(TAG, "unzipping"); - // using (ZipArchive archive = ZipFile.Open(_downloadSetup.BinsZipLocation, ZipArchiveMode.Read)) { - // //archive.ExtractToDirectory("bin"); - // _minerUpdateIndicator.SetMaxProgressValue(archive.Entries.Count); - // int prog = 0; - // // first create dirs - // foreach (ZipArchiveEntry entry in archive.Entries) { - // if (entry.Length == 0) { - // Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); - // Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); - // Directory.CreateDirectory(entry.FullName); - // _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); - // } - // } - // // unzip files - // foreach (ZipArchiveEntry entry in archive.Entries) { - // if (entry.Length > 0) { - // Helpers.ConsolePrint("ZipArchiveEntry", entry.FullName); - // Helpers.ConsolePrint("ZipArchiveEntry", entry.Length.ToString()); - // entry.ExtractToFile(entry.FullName); - // _minerUpdateIndicator.SetProgressValueAndMsg(prog++, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), ((double)(prog) / (double)(archive.Entries.Count) * 100).ToString("F2"))); - // } - // } - // } - // // after unzip stuff - // _minerUpdateIndicator.FinishMsg(true); - // // remove bins zip - // try { - // if (File.Exists(_downloadSetup.BinsZipLocation)) { - // File.Delete(_downloadSetup.BinsZipLocation); - // } - // } catch { } - //} else { - // Helpers.ConsolePrint(TAG, "UnzipThreadRoutine bin.zip file not found"); - //} - - /////////////////////// - //try { - // if (File.Exists(_downloadSetup.BinsZipLocation)) { - // Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); - // Helpers.ConsolePrint(TAG, "unzipping"); - // using (Process p_7zr = new Process()) { - // // set to 100% - // _minerUpdateIndicator.SetMaxProgressValue(100); - // double prog = 0; - // // set proc - // p_7zr.StartInfo.FileName = "7zr.exe"; - // p_7zr.StartInfo.Arguments = String.Format("-y x {0}", _downloadSetup.BinsZipLocation); - // p_7zr.StartInfo.UseShellExecute = false; - // p_7zr.StartInfo.RedirectStandardError = true; - // p_7zr.StartInfo.RedirectStandardOutput = true; - // p_7zr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; - // p_7zr.StartInfo.CreateNoWindow = true; - - // if (p_7zr.Start()) { - // string readLine = ""; - // bool isOk = false; - // do { - // readLine = p_7zr.StandardOutput.ReadLine(); - // Helpers.ConsolePrint("ZipArchiveEntry_7zr.exe", readLine); - // if (readLine != null && readLine.Contains("%")) { - // Helpers.ConsolePrint("ZipArchiveEntry_7zr.exe", readLine); - // string parseNumStr = readLine.Substring(0, readLine.IndexOf("%") + 1).Trim(); - // double progTmp = Helpers.ParseDouble(parseNumStr); - // if (progTmp > 0) { - // prog = progTmp; - // if (prog > 100) prog = 100; - // _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); - // } - // } - // if (readLine != null && readLine.Contains("Ok")) { - // isOk = true; - // prog = 100; - // _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); - // } - // } while (!p_7zr.StandardOutput.EndOfStream); - // } else { - // Helpers.ConsolePrint(TAG, "Cannot start 7zr.exe"); - // } - // } - // // after unzip stuff - // _minerUpdateIndicator.FinishMsg(true); - // // remove bins zip - // try { - // if (File.Exists(_downloadSetup.BinsZipLocation)) { - // File.Delete(_downloadSetup.BinsZipLocation); - // } - // } catch { } - // } else { - // Helpers.ConsolePrint(TAG, String.Format("UnzipThreadRoutine {0} file not found", _downloadSetup.BinsZipLocation)); - // } - //} catch (Exception) { - // Helpers.ConsolePrint(TAG, "UnzipThreadRoutine has encountered an error while"); - // // TODO show notification to the user to download and extract manually - //} - try { if (File.Exists(_downloadSetup.BinsZipLocation)) { Helpers.ConsolePrint(TAG, _downloadSetup.BinsZipLocation + " already downloaded"); Helpers.ConsolePrint(TAG, "unzipping"); - using (var archive = SevenZipArchive.Open(_downloadSetup.BinsZipLocation)) { - var reader = archive.ExtractAllEntries(); - //var openedStream = reader.OpenEntryStream(); - while (reader.MoveToNextEntry()) { - try { - if (!reader.Entry.IsDirectory) { - Helpers.ConsolePrint(TAG, reader.Entry.Key); - reader.WriteEntryToDirectory("", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite); - } - } catch { } + + // if using other formats as zip are returning 0 + FileInfo fileArchive = new FileInfo(_downloadSetup.BinsZipLocation); + var archive = ArchiveFactory.Open(_downloadSetup.BinsZipLocation); + _minerUpdateIndicator.SetMaxProgressValue(100); + long SizeCount = 0; + foreach (var entry in archive.Entries) { + if (!entry.IsDirectory) { + SizeCount += entry.CompressedSize; + Console.WriteLine(entry.Key); + entry.WriteToDirectory("", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite); + + double prog = ((double)(SizeCount) / (double)(fileArchive.Length) * 100); + _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); } } // after unzip stuff From e1b91dd4b7fcab65efd415866edf0bbfe3fb524a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 7 Dec 2016 11:57:17 +0100 Subject: [PATCH 169/366] disable sgminer for Polaris GPUs --- NiceHashMiner/Globals.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index c68cf90..933b034 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -16,7 +16,7 @@ public class Globals { public static bool IsFirstNetworkCheckTimeout = true; public static int FirstNetworkCheckTimeoutTimeMS = 500; public static int FirstNetworkCheckTimeoutTries = 10; - // sgminer Ellesmere ignore setting - public static bool IsEllesmereSgminerIgnore = false; + // sgminer Ellesmere/Polaris ignore setting (sgminer needs more testing) + public static bool IsEllesmereSgminerIgnore = true; } } \ No newline at end of file From b6c3180fb825279b6c2496dc7eb04f95b081b64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 12 Dec 2016 17:43:35 +0100 Subject: [PATCH 170/366] minor code changes, cpu timeout increase --- NiceHashMiner/Devices/ComputeDevice.cs | 6 +++--- NiceHashMiner/Miners/cpuminer.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index f0f635f..4df87f4 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -36,9 +36,9 @@ public class ComputeDevice //CudaDevice _cudaDevice = null; //AmdGpuDevice _amdDevice = null; // sgminer extra quickfix - public bool IsOptimizedVersion { get; private set; } - public string Codename { get; private set; } - public string InfSection { get; private set; } + public readonly bool IsOptimizedVersion; + public readonly string Codename; + public readonly string InfSection; //public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } public Dictionary AlgorithmSettings { get; set; } diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index fe956df..9015b08 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -16,7 +16,7 @@ public cpuminer() } protected override int GET_MAX_CooldownTimeInMilliseconds() { - return 60 * 1000; // 1 minute max, whole waiting time 75seconds + return 3 * 60 * 1000; // 1 minute max, whole waiting time 75seconds } public override void Start(string url, string btcAdress, string worker) { From 0c0c0c59f03854698792f1b42a14b2904b306050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 12 Dec 2016 17:44:33 +0100 Subject: [PATCH 171/366] remove postfix --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 5df2d52..8f5cdb2 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -50,7 +50,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "_NET20_backport"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; From f24ddb2c3eeb3cfbb8c75bea4283cf8b3e605359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 12 Dec 2016 18:57:39 +0100 Subject: [PATCH 172/366] logging fix, download link update --- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- NiceHashMiner/Utils/MinersDownloader.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 7055a78..cbf1260 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_6.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_10.zip", "bins.zip", "bin"); diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs index b8296ea..848030d 100644 --- a/NiceHashMiner/Utils/MinersDownloader.cs +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -143,7 +143,7 @@ private void UnzipThreadRoutine() { foreach (var entry in archive.Entries) { if (!entry.IsDirectory) { SizeCount += entry.CompressedSize; - Console.WriteLine(entry.Key); + Helpers.ConsolePrint(TAG, entry.Key); entry.WriteToDirectory("", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite); double prog = ((double)(SizeCount) / (double)(fileArchive.Length) * 100); From 275a45b07afc137ebdd1488fa58829ae35d54707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 12 Dec 2016 19:04:25 +0100 Subject: [PATCH 173/366] sharpcompress README, referenced tag version --- 3rdparty/sharpcompress-0.11/README.md | 1 + README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 3rdparty/sharpcompress-0.11/README.md diff --git a/3rdparty/sharpcompress-0.11/README.md b/3rdparty/sharpcompress-0.11/README.md new file mode 100644 index 0000000..0a2a20a --- /dev/null +++ b/3rdparty/sharpcompress-0.11/README.md @@ -0,0 +1 @@ +libraries are built against this [tag version](https://github.com/adamhathcock/sharpcompress/tree/0.11) \ No newline at end of file diff --git a/README.md b/README.md index 3e1f290..3ef1b25 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ NiceHash Miner is essentially the only tool a miner needs. No need to go through All you have to do is download, extract and run the miner (no installation needed), choose the server location that is the **closest to your location**, run built-in benchmark and enter your Bitcoin wallet address where you want to get your coins sent at - and you are ready to start mining and maximizing your profit. -**Note**: .NET Framework 4.5 or higher and Microsoft Visual C++ Redistributable 2013 is required. No additional installations should be needed if you use Windows 7 or later. However, if you encounter any issues when starting application (application would fail to start or errors/warnings about missing DLL files are displayed) you should download and install Microsoft **.NET Framework 4.5** and Microsoft **Visual C++ Redistributable 2013 (vcredist_x64.exe)** (after installation a reboot might be required). +**Note**: .NET Framework 2.0 or higher and Microsoft Visual C++ Redistributable 2013 is required. No additional installations should be needed if you use Windows 7 or later. However, if you encounter any issues when starting application (application would fail to start or errors/warnings about missing DLL files are displayed) you should download and install Microsoft **.NET Framework 2.0** and Microsoft **Visual C++ Redistributable 2013 (vcredist_x64.exe)** (after installation a reboot might be required). Detailed instructions: - Download binaries from here: https://github.com/nicehash/NiceHashMiner/releases From 79b42658a9c1cb48481af60fba219abc3c0ba0ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 12 Dec 2016 19:24:15 +0100 Subject: [PATCH 174/366] eqm use 2 threads per device by default, gives best performance --- NiceHashMiner/Miners/Equihash/eqm.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 9e8775a..227ff3c 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -34,8 +34,14 @@ protected override string GetDevicesCommandString() { if (NVIDIA_Setup.IsInit) { deviceStringCommand += " -cd "; foreach (var nvidia_pair in NVIDIA_Setup.MiningPairs) { - for (int i = 0; i < ExtraLaunchParametersParser.GetEqmCudaThreadCount(nvidia_pair); ++i) { - deviceStringCommand += nvidia_pair.Device.ID + " "; + if (nvidia_pair.CurrentExtraLaunchParameters.Contains("-ct")) { + for (int i = 0; i < ExtraLaunchParametersParser.GetEqmCudaThreadCount(nvidia_pair); ++i) { + deviceStringCommand += nvidia_pair.Device.ID + " "; + } + } else { // use default 2 best performance + for (int i = 0; i < 2; ++i) { + deviceStringCommand += nvidia_pair.Device.ID + " "; + } } } // no extra launch params From 844eb2a17db41762aac755929ab05ee488e62cd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 13 Dec 2016 18:53:50 +0100 Subject: [PATCH 175/366] claymore zcash default intensity value fix --- NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 6a58f66..988c24d 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -89,7 +89,7 @@ static class ExtraLaunchParametersParser { }; // Zcash claymore private static List _ClaymoreZcash_Options = new List() { - new MinerOption(MinerOptionType.ClaymoreZcash_i , "-i", "-i", "4", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_i , "-i", "-i", "6", MinerOptionFlagType.MultiParam, ","), new MinerOption(MinerOptionType.ClaymoreZcash_wd , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), //new MinerOption(MinerOptionType.ClaymoreZcash_r , , , , MinerOptionFlagType.MultiParam, ","), new MinerOption(MinerOptionType.ClaymoreZcash_nofee , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), From 12437632c6263e0033594d2ca149bc9fde64162d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 25 Dec 2016 11:04:04 +0100 Subject: [PATCH 176/366] separate SM50 and SM52 logic regarding to new eqm update --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 9 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- NiceHashMiner/Enums/DeviceGroupType.cs | 3 +- NiceHashMiner/Ethereum.cs | 218 +++++++++--------- NiceHashMiner/Miners/Equihash/eqm.cs | 9 +- .../Miners/Grouping/GroupingLogic.cs | 14 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 13 +- NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/Miners/MinersManager.cs | 2 +- .../Parsing/ExtraLaunchParametersParser.cs | 2 +- 10 files changed, 149 insertions(+), 125 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 5ea2c37..f826583 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -411,7 +411,14 @@ static public void QueryCudaDevices() { group = DeviceGroupType.NVIDIA_3_x; break; case 5: - group = DeviceGroupType.NVIDIA_5_x; + if(cudaDev.SM_minor == 0) { + group = DeviceGroupType.NVIDIA_5_0; + } else if (cudaDev.SM_minor == 2) { + group = DeviceGroupType.NVIDIA_5_2; + } else { + // default fallback should not happen + group = DeviceGroupType.NVIDIA_5_0; + } break; case 6: group = DeviceGroupType.NVIDIA_6_x; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index af5b0c4..01c34e6 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -125,7 +125,7 @@ private static Dictionary CreateDefaultsForGroup(Devic }; } // NVIDIA - if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType || DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { + if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType || DeviceGroupType.NVIDIA_5_0 == deviceGroupType || DeviceGroupType.NVIDIA_5_2 == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { var ret = new Dictionary { //{ AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") }, //{ AlgorithmType.Keccak , new Algorithm(AlgorithmType.Keccak, "keccak") }, diff --git a/NiceHashMiner/Enums/DeviceGroupType.cs b/NiceHashMiner/Enums/DeviceGroupType.cs index 89c89c0..68feafc 100644 --- a/NiceHashMiner/Enums/DeviceGroupType.cs +++ b/NiceHashMiner/Enums/DeviceGroupType.cs @@ -11,7 +11,8 @@ public enum DeviceGroupType : int AMD_OpenCL, NVIDIA_2_1, NVIDIA_3_x, - NVIDIA_5_x, + NVIDIA_5_0, + NVIDIA_5_2, NVIDIA_6_x, LAST } diff --git a/NiceHashMiner/Ethereum.cs b/NiceHashMiner/Ethereum.cs index 4ca527f..c496bc2 100644 --- a/NiceHashMiner/Ethereum.cs +++ b/NiceHashMiner/Ethereum.cs @@ -13,126 +13,126 @@ namespace NiceHashMiner { - public class EthminerReader - { - /// - /// Initialize ethminer instance that listens on certain UDP port for speed and DAG progress reports. You may have multiple instances, - /// but each one must be listening on another port! - /// - /// UDP listening port. - public EthminerReader(int port) - { - bindPort = port; - } + //public class EthminerReader + //{ + // /// + // /// Initialize ethminer instance that listens on certain UDP port for speed and DAG progress reports. You may have multiple instances, + // /// but each one must be listening on another port! + // /// + // /// UDP listening port. + // public EthminerReader(int port) + // { + // bindPort = port; + // } - /// - /// Start listening. - /// - public void Start() - { - isRunning = true; - speed = 0; - DAGprogress = 0; - lastActiveTime = DateTime.Now; - ipep = new IPEndPoint(IPAddress.Loopback, bindPort); - client = new UdpClient(ipep); - workerTimer = new Timer(); - workerTimer.Tick += workerTimer_Tick; - workerTimer.Interval = 50; - workerTimer.Start(); - } + // /// + // /// Start listening. + // /// + // public void Start() + // { + // isRunning = true; + // speed = 0; + // DAGprogress = 0; + // lastActiveTime = DateTime.Now; + // ipep = new IPEndPoint(IPAddress.Loopback, bindPort); + // client = new UdpClient(ipep); + // workerTimer = new Timer(); + // workerTimer.Tick += workerTimer_Tick; + // workerTimer.Interval = 50; + // workerTimer.Start(); + // } - /// - /// Stop listening. Call this before application exits or if you are about to restart ethminer reader. - /// - public void Stop() - { - isRunning = false; - speed = 0; - DAGprogress = 0; - workerTimer.Stop(); - client.Close(); - client = null; - } + // /// + // /// Stop listening. Call this before application exits or if you are about to restart ethminer reader. + // /// + // public void Stop() + // { + // isRunning = false; + // speed = 0; + // DAGprogress = 0; + // workerTimer.Stop(); + // client.Close(); + // client = null; + // } - /// - /// Get if miner is still running. - /// - /// State of miner. - public bool GetIsRunning() - { - return isRunning; - } + // /// + // /// Get if miner is still running. + // /// + // /// State of miner. + // public bool GetIsRunning() + // { + // return isRunning; + // } - /// - /// Get speed of miner in MH/s. - /// - /// Speed of miner in MH/s. - public double GetSpeed() - { - return speed; - } + // /// + // /// Get speed of miner in MH/s. + // /// + // /// Speed of miner in MH/s. + // public double GetSpeed() + // { + // return speed; + // } - /// - /// Get DAG progress in %. It only reports correct progress if ethminer is launched with -D parameter. - /// - /// DAG creation progress in %. When mining, this value is 100. - public uint GetDAGprogress() - { - return DAGprogress; - } + // /// + // /// Get DAG progress in %. It only reports correct progress if ethminer is launched with -D parameter. + // /// + // /// DAG creation progress in %. When mining, this value is 100. + // public uint GetDAGprogress() + // { + // return DAGprogress; + // } - /// - /// Get DateTime when miner sent UDP status packet. - /// - /// DateTime of last active time. - public DateTime GetLastActiveTime() - { - return lastActiveTime; - } + // /// + // /// Get DateTime when miner sent UDP status packet. + // /// + // /// DateTime of last active time. + // public DateTime GetLastActiveTime() + // { + // return lastActiveTime; + // } - public string ByteArrayToString(byte[] ba) - { - StringBuilder hex = new StringBuilder(ba.Length * 2); - foreach (byte b in ba) hex.AppendFormat("{0:x2} ", b); - return hex.ToString(); - } + // public string ByteArrayToString(byte[] ba) + // { + // StringBuilder hex = new StringBuilder(ba.Length * 2); + // foreach (byte b in ba) hex.AppendFormat("{0:x2} ", b); + // return hex.ToString(); + // } - #region PRIVATE_PROPERTIES - private IPEndPoint ipep; - private UdpClient client; - private double speed; - private uint DAGprogress; - private int bindPort; - private bool isRunning; - private Timer workerTimer; - private DateTime lastActiveTime; - #endregion + // #region PRIVATE_PROPERTIES + // private IPEndPoint ipep; + // private UdpClient client; + // private double speed; + // private uint DAGprogress; + // private int bindPort; + // private bool isRunning; + // private Timer workerTimer; + // private DateTime lastActiveTime; + // #endregion - #region PRIVATE_METHODS - private void workerTimer_Tick(object sender, EventArgs e) - { - try - { - client.Client.Blocking = false; + // #region PRIVATE_METHODS + // private void workerTimer_Tick(object sender, EventArgs e) + // { + // try + // { + // client.Client.Blocking = false; - if (isRunning && client.Available > 0) - { - byte[] data = client.Receive(ref ipep); - //Helpers.ConsolePrint("DEBUG", "ByteArray: " + ByteArrayToString(data)); - speed = BitConverter.ToDouble(data, 0); - DAGprogress = BitConverter.ToUInt32(data, 8); - lastActiveTime = DateTime.Now; - } - } - catch (Exception ex) - { - Helpers.ConsolePrint("EthminerReader", "Error: " + ex.Message); - } - } + // if (isRunning && client.Available > 0) + // { + // byte[] data = client.Receive(ref ipep); + // //Helpers.ConsolePrint("DEBUG", "ByteArray: " + ByteArrayToString(data)); + // speed = BitConverter.ToDouble(data, 0); + // DAGprogress = BitConverter.ToUInt32(data, 8); + // lastActiveTime = DateTime.Now; + // } + // } + // catch (Exception ex) + // { + // Helpers.ConsolePrint("EthminerReader", "Error: " + ex.Message); + // } + // } - #endregion - } + // #endregion + //} public static class Ethereum { diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 227ff3c..3701d16 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -9,8 +9,6 @@ namespace NiceHashMiner.Miners { public class eqm : nheqBase { public eqm() : base("eqm") { - Path = MinerPaths.eqm; - WorkingDirectory = MinerPaths.eqm.Replace("eqm.exe", ""); IsNHLocked = true; } @@ -21,6 +19,13 @@ public override void Start(string url, string btcAdress, string worker) { protected override string GetDevicesCommandString() { + //// old + //Path = MinerPaths.eqm; + //WorkingDirectory = MinerPaths.eqm.Replace("eqm.exe", ""); + // 2 paths + Path = this.MiningSetup.MinerPath; + WorkingDirectory = this.MiningSetup.MinerPath.Replace("eqm.exe", ""); + string deviceStringCommand = " "; if (CPU_Setup.IsInit) { diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index c89c884..fd9a253 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -28,7 +28,9 @@ public static bool ShouldGroup(MiningPair a, MiningPair b) { private static class EquihashGroup { public static bool IsEquihashGroupLogic(string minerPath, MiningPair a, MiningPair b) { // eqm - if (MinerPaths.eqm == minerPath) { + if (MinerPaths.eqm_sm50 == minerPath) { + return Is_eqm(a, b); + } else if (MinerPaths.eqm_sm52plus == minerPath) { return Is_eqm(a, b); } // nheqmnier @@ -55,14 +57,18 @@ private static bool Is_eqm(MiningPair a, MiningPair b) { return IsDevice_eqm(a) && IsDevice_eqm(b); } private static bool IsDevice_eqm(MiningPair a) { - return IsCPU_eqm(a) || IsNVIDIA_eqm(a); + return IsCPU_eqm(a) || IsNVIDIA_eqm_sm50(a) || IsNVIDIA_eqm_sm52_plus(a); } private static bool IsCPU_eqm(MiningPair a) { return MinersManager.EquihashCPU_USE_eqm() && a.Device.DeviceType == DeviceType.CPU; } - private static bool IsNVIDIA_eqm(MiningPair a) { + private static bool IsNVIDIA_eqm_sm52_plus(MiningPair a) { + var groupType = a.Device.DeviceGroupType; + return DeviceGroupType.NVIDIA_5_2 == groupType || DeviceGroupType.NVIDIA_6_x == groupType; + } + private static bool IsNVIDIA_eqm_sm50(MiningPair a) { var groupType = a.Device.DeviceGroupType; - return DeviceGroupType.NVIDIA_5_x == groupType || DeviceGroupType.NVIDIA_6_x == groupType; + return DeviceGroupType.NVIDIA_5_0 == groupType; } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 0ecf402..d42ba44 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -53,7 +53,8 @@ public static class MinerPaths /// /// eqm /// - public const string eqm = _bin + @"\eqm\eqm.exe"; + public const string eqm_sm50 = _bin + @"\eqm\eqm.exe"; + public const string eqm_sm52plus = _bin + @"\eqm_sm52plus\eqm.exe"; public const string NONE = ""; @@ -86,9 +87,13 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy } // AlgorithmType.Equihash special shared case if (algorithmType == AlgorithmType.Equihash) { - if (deviceGroupType == DeviceGroupType.NVIDIA_5_x || deviceGroupType == DeviceGroupType.NVIDIA_6_x + if (deviceGroupType == DeviceGroupType.NVIDIA_5_0) { + return MinerPaths.eqm_sm50; + } + // for simplicity sake only new eqm miner groups cpu and gpu, check later + if (deviceGroupType == DeviceGroupType.NVIDIA_5_2 || deviceGroupType == DeviceGroupType.NVIDIA_6_x || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { - return MinerPaths.eqm; + return MinerPaths.eqm_sm52plus; } else if(deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state return MinerPaths.ClaymoreZcashMiner; } @@ -109,7 +114,7 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy return NVIDIA_GROUPS.ccminer_sm21_or_sm3x(algorithmType); } // sm5x and sm6x have same settings - if (nvidiaGroup == DeviceGroupType.NVIDIA_5_x || nvidiaGroup == DeviceGroupType.NVIDIA_6_x) { + if (nvidiaGroup == DeviceGroupType.NVIDIA_5_0 || nvidiaGroup == DeviceGroupType.NVIDIA_5_2 || nvidiaGroup == DeviceGroupType.NVIDIA_6_x) { return NVIDIA_GROUPS.ccminer_sm5x_or_sm6x(algorithmType); } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 11d79e9..f068b48 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -498,7 +498,7 @@ virtual protected NiceHashProcess _Start() P.ExitEvent = Miner_Exited; P.StartInfo.Arguments = LastCommandLine; - if (Path != MinerPaths.eqm) { + if (Path != MinerPaths.eqm_sm50 || Path != MinerPaths.eqm_sm52plus) { P.StartInfo.CreateNoWindow = ConfigManager.GeneralConfig.HideMiningWindows; } else { P.StartInfo.CreateNoWindow = false; diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 81b7ff4..dcbdf05 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -46,7 +46,7 @@ public static Miner CreateMiner(ComputeDevice device, Algorithm algorithm) { } public static Miner CreateMiner(DeviceType deviceType, string minerPath) { - if (minerPath == MinerPaths.eqm && DeviceType.AMD != deviceType) { + if ((minerPath == MinerPaths.eqm_sm50 || minerPath == MinerPaths.eqm_sm52plus) && DeviceType.AMD != deviceType) { return new eqm(); } else if (minerPath == MinerPaths.nheqminer) { return new nheqminer(); diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 988c24d..c2cbf86 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -317,7 +317,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith if (deviceType == DeviceType.AMD) { return Parse(MiningPairs, _nheqminer_AMD_Options); } - } else if (minerPath == MinerPaths.eqm) { + } else if (minerPath == MinerPaths.eqm_sm50 || minerPath == MinerPaths.eqm_sm52plus) { if (deviceType == DeviceType.CPU) { CheckAndSetCPUPairs(MiningPairs); return Parse(MiningPairs, _eqm_CPU_Options); From 1e4543b8d6bdb8259e315ebff49a8ef40c6a47a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 25 Dec 2016 11:08:49 +0100 Subject: [PATCH 177/366] update file detection list --- NiceHashMiner/Utils/BINS_CODEGEN.cs | 316 ++++++++++++++-------------- 1 file changed, 160 insertions(+), 156 deletions(-) diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index 11c5380..8d352b9 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -1,156 +1,160 @@ - -namespace NiceHashMiner.Utils { - public static class Bins_Data { - #region CODE_GEN STUFF // listFiles.py -public static string[] ALL_FILES_BINS = { -@"\ccminer.exe", -@"\ccminer_cryptonight.exe", -@"\ccminer_decred.exe", -@"\ccminer_nanashi.exe", -@"\ccminer_neoscrypt.exe", -@"\ccminer_sp.exe", -@"\ccminer_tpruvot.exe", -@"\cpuminer_opt_AES.exe", -@"\cpuminer_opt_AVX.exe", -@"\cpuminer_opt_AVX2.exe", -@"\cpuminer_opt_AVX2_AES.exe", -@"\cpuminer_opt_AVX_AES.exe", -@"\cpuminer_opt_SSE2.exe", -@"\cudart32_80.dll", -@"\cudart64_80.dll", -@"\ethminer.exe", -@"\libcrypto-1.0.0.dll", -@"\libcurl-4.dll", -@"\libcurl.dll", -@"\libgcc_s_seh-1.dll", -@"\libgmp-10.dll", -@"\libgmpxx-4.dll", -@"\libjansson-4.dll", -@"\libjson-c-2.dll", -@"\libmicrohttpd-dll.dll", -@"\libsigc-2.0-0.dll", -@"\libssl-1.0.0.dll", -@"\libstdc++-6.dll", -@"\libwinpthread-1.dll", -@"\libz-1.dll", -@"\msvcr120.dll", -@"\OpenCL.dll", -@"\zlib1.dll", -@"\eqm\cudart64_80.dll", -@"\eqm\eqm.exe", -@"\eqm\msvcp120.dll", -@"\eqm\msvcr120.dll", -@"\nheqminer_v0.4b\cpu_tromp_AVX.dll", -@"\nheqminer_v0.4b\cpu_tromp_SSE2.dll", -@"\nheqminer_v0.4b\cudart64_75.dll", -@"\nheqminer_v0.4b\cudart64_80.dll", -@"\nheqminer_v0.4b\cuda_tromp.dll", -@"\nheqminer_v0.4b\cuda_tromp_75.dll", -@"\nheqminer_v0.4b\equiw200k9.bin", -@"\nheqminer_v0.4b\msvcp120.dll", -@"\nheqminer_v0.4b\msvcr120.dll", -@"\nheqminer_v0.4b\nheqminer.exe", -@"\sgminer-5-1-0-optimized\darkcoin-modHawaiigw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modTahitigw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modTongagw64l4.bin", -@"\sgminer-5-1-0-optimized\libcurl-4.dll", -@"\sgminer-5-1-0-optimized\libcurl.dll", -@"\sgminer-5-1-0-optimized\libeay32.dll", -@"\sgminer-5-1-0-optimized\libgcc_s_dw2-1.dll", -@"\sgminer-5-1-0-optimized\libidn-11.dll", -@"\sgminer-5-1-0-optimized\libpdcurses.dll", -@"\sgminer-5-1-0-optimized\Lyra2REv2Hawaiigw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Pitcairngw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Tahitigw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Tongagw64l4.bin", -@"\sgminer-5-1-0-optimized\pthreadGC2.dll", -@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTahitigw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTahitigw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTongagw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\sgminer.exe", -@"\sgminer-5-1-0-optimized\ssleay32.dll", -@"\sgminer-5-1-0-optimized\zlib1.dll", -@"\sgminer-5-1-1-optimized\darkcoin-modHawaiigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\darkcoin-modPitcairngw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\darkcoin-modTahitigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\darkcoin-modTongagw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\libcurl.dll", -@"\sgminer-5-1-1-optimized\libeay32.dll", -@"\sgminer-5-1-1-optimized\libgcc_s_dw2-1.dll", -@"\sgminer-5-1-1-optimized\libidn-11.dll", -@"\sgminer-5-1-1-optimized\libpdcurses.dll", -@"\sgminer-5-1-1-optimized\pthreadGC2.dll", -@"\sgminer-5-1-1-optimized\quarkcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\quarkcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\quarkcoinTahitigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\qubitcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\qubitcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\qubitcoinTahitigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\qubitcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\sgminer.exe", -@"\sgminer-5-1-1-optimized\ssleay32.dll", -@"\sgminer-5-1-1-optimized\zlib1.dll", -@"\sgminer-5-4-0-tweaked\darkcoin-modBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Bonairegw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Fijigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Hawaiigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Pitcairngw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Tahitigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Tongagw64l4.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\sgminer.exe", -@"\sgminer-5-5-0-general\bitblockFijigw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\bitblockHawaiigw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\bitblockTongagw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\blake256r8Fijigw128l4.bin", -@"\sgminer-5-5-0-general\blake256r8Hawaiigw128l4.bin", -@"\sgminer-5-5-0-general\blake256r8Tongagw128l4.bin", -@"\sgminer-5-5-0-general\decredFijigw64l4tc24512.bin", -@"\sgminer-5-5-0-general\decredHawaiigw64l4tc24512.bin", -@"\sgminer-5-5-0-general\decredTongagw64l4tc24512.bin", -@"\sgminer-5-5-0-general\lbryTongagw128l4.bin", -@"\sgminer-5-5-0-general\marucoin-modFijigw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\marucoin-modHawaiigw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\marucoin-modTongagw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\maxcoinFijigw64l4.bin", -@"\sgminer-5-5-0-general\maxcoinHawaiigw64l4.bin", -@"\sgminer-5-5-0-general\maxcoinTongagw64l4.bin", -@"\sgminer-5-5-0-general\neoscryptFijigw64l4lgtc8192.bin", -@"\sgminer-5-5-0-general\neoscryptHawaiigw64l4lgtc8192.bin", -@"\sgminer-5-5-0-general\neoscryptTongagw64l4lgtc8192.bin", -@"\sgminer-5-5-0-general\sgminer.exe", -@"\sgminer-5-5-0-general\talkcoin-modFijigw64l4ku0.bin", -@"\sgminer-5-5-0-general\talkcoin-modHawaiigw64l4ku0.bin", -@"\sgminer-5-5-0-general\talkcoin-modTongagw64l4ku0.bin", -@"\sgminer-5-5-0-general\vanillaFijigw128l4.bin", -@"\sgminer-5-5-0-general\vanillaHawaiigw128l4.bin", -@"\sgminer-5-5-0-general\vanillaTongagw128l4.bin", -}; -#endregion //CODE_GEN STUFF // listFiles.py -} -} - + +namespace NiceHashMiner.Utils { + public static class Bins_Data { + #region CODE_GEN STUFF // listFiles.py + public static string[] ALL_FILES_BINS = { +@"\ccminer.exe", +@"\ccminer_cryptonight.exe", +@"\ccminer_decred.exe", +@"\ccminer_nanashi.exe", +@"\ccminer_neoscrypt.exe", +@"\ccminer_sp.exe", +@"\ccminer_tpruvot.exe", +@"\cpuminer_opt_AES.exe", +@"\cpuminer_opt_AVX.exe", +@"\cpuminer_opt_AVX2.exe", +@"\cpuminer_opt_AVX2_AES.exe", +@"\cpuminer_opt_AVX_AES.exe", +@"\cpuminer_opt_SSE2.exe", +@"\cudart32_80.dll", +@"\cudart64_80.dll", +@"\ethminer.exe", +@"\libcrypto-1.0.0.dll", +@"\libcurl-4.dll", +@"\libcurl.dll", +@"\libgcc_s_seh-1.dll", +@"\libgmp-10.dll", +@"\libgmpxx-4.dll", +@"\libjansson-4.dll", +@"\libjson-c-2.dll", +@"\libmicrohttpd-dll.dll", +@"\libsigc-2.0-0.dll", +@"\libssl-1.0.0.dll", +@"\libstdc++-6.dll", +@"\libwinpthread-1.dll", +@"\libz-1.dll", +@"\msvcr120.dll", +@"\OpenCL.dll", +@"\zlib1.dll", +@"\eqm\cudart64_80.dll", +@"\eqm\eqm.exe", +@"\eqm\msvcp120.dll", +@"\eqm\msvcr120.dll", +@"\eqm_sm52plus\cudart64_80.dll", +@"\eqm_sm52plus\eqm.exe", +@"\eqm_sm52plus\msvcp120.dll", +@"\eqm_sm52plus\msvcr120.dll", +@"\nheqminer_v0.4b\cpu_tromp_AVX.dll", +@"\nheqminer_v0.4b\cpu_tromp_SSE2.dll", +@"\nheqminer_v0.4b\cudart64_75.dll", +@"\nheqminer_v0.4b\cudart64_80.dll", +@"\nheqminer_v0.4b\cuda_tromp.dll", +@"\nheqminer_v0.4b\cuda_tromp_75.dll", +@"\nheqminer_v0.4b\equiw200k9.bin", +@"\nheqminer_v0.4b\msvcp120.dll", +@"\nheqminer_v0.4b\msvcr120.dll", +@"\nheqminer_v0.4b\nheqminer.exe", +@"\sgminer-5-1-0-optimized\darkcoin-modHawaiigw64l4.bin", +@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4.bin", +@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\darkcoin-modTahitigw64l4.bin", +@"\sgminer-5-1-0-optimized\darkcoin-modTongagw64l4.bin", +@"\sgminer-5-1-0-optimized\libcurl-4.dll", +@"\sgminer-5-1-0-optimized\libcurl.dll", +@"\sgminer-5-1-0-optimized\libeay32.dll", +@"\sgminer-5-1-0-optimized\libgcc_s_dw2-1.dll", +@"\sgminer-5-1-0-optimized\libidn-11.dll", +@"\sgminer-5-1-0-optimized\libpdcurses.dll", +@"\sgminer-5-1-0-optimized\Lyra2REv2Hawaiigw64l4.bin", +@"\sgminer-5-1-0-optimized\Lyra2REv2Pitcairngw64l4.bin", +@"\sgminer-5-1-0-optimized\Lyra2REv2Tahitigw64l4.bin", +@"\sgminer-5-1-0-optimized\Lyra2REv2Tongagw64l4.bin", +@"\sgminer-5-1-0-optimized\pthreadGC2.dll", +@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw256l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw256l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinTahitigw256l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinTahitigw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinTongagw256l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinTongagw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\sgminer.exe", +@"\sgminer-5-1-0-optimized\ssleay32.dll", +@"\sgminer-5-1-0-optimized\zlib1.dll", +@"\sgminer-5-1-1-optimized\darkcoin-modHawaiigw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\darkcoin-modPitcairngw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\darkcoin-modTahitigw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\darkcoin-modTongagw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\libcurl.dll", +@"\sgminer-5-1-1-optimized\libeay32.dll", +@"\sgminer-5-1-1-optimized\libgcc_s_dw2-1.dll", +@"\sgminer-5-1-1-optimized\libidn-11.dll", +@"\sgminer-5-1-1-optimized\libpdcurses.dll", +@"\sgminer-5-1-1-optimized\pthreadGC2.dll", +@"\sgminer-5-1-1-optimized\quarkcoinHawaiigw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\quarkcoinPitcairngw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\quarkcoinTahitigw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\quarkcoinTongagw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\qubitcoinHawaiigw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\qubitcoinPitcairngw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\qubitcoinTahitigw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\qubitcoinTongagw64l4ku0.bin", +@"\sgminer-5-1-1-optimized\sgminer.exe", +@"\sgminer-5-1-1-optimized\ssleay32.dll", +@"\sgminer-5-1-1-optimized\zlib1.dll", +@"\sgminer-5-4-0-tweaked\darkcoin-modBonairegw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modFijigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modHawaiigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modPitcairngw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modTahitigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modTongagw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Bonairegw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Fijigw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Hawaiigw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Pitcairngw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Tahitigw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Tongagw64l4.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinBonairegw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinFijigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinHawaiigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinPitcairngw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinTahitigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinTongagw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinBonairegw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinFijigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinHawaiigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinPitcairngw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinTahitigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinTongagw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\sgminer.exe", +@"\sgminer-5-5-0-general\bitblockFijigw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\bitblockHawaiigw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\bitblockTongagw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\blake256r8Fijigw128l4.bin", +@"\sgminer-5-5-0-general\blake256r8Hawaiigw128l4.bin", +@"\sgminer-5-5-0-general\blake256r8Tongagw128l4.bin", +@"\sgminer-5-5-0-general\decredFijigw64l4tc24512.bin", +@"\sgminer-5-5-0-general\decredHawaiigw64l4tc24512.bin", +@"\sgminer-5-5-0-general\decredTongagw64l4tc24512.bin", +@"\sgminer-5-5-0-general\lbryTongagw128l4.bin", +@"\sgminer-5-5-0-general\marucoin-modFijigw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\marucoin-modHawaiigw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\marucoin-modTongagw64l4ku0big4.bin", +@"\sgminer-5-5-0-general\maxcoinFijigw64l4.bin", +@"\sgminer-5-5-0-general\maxcoinHawaiigw64l4.bin", +@"\sgminer-5-5-0-general\maxcoinTongagw64l4.bin", +@"\sgminer-5-5-0-general\neoscryptFijigw64l4lgtc8192.bin", +@"\sgminer-5-5-0-general\neoscryptHawaiigw64l4lgtc8192.bin", +@"\sgminer-5-5-0-general\neoscryptTongagw64l4lgtc8192.bin", +@"\sgminer-5-5-0-general\sgminer.exe", +@"\sgminer-5-5-0-general\talkcoin-modFijigw64l4ku0.bin", +@"\sgminer-5-5-0-general\talkcoin-modHawaiigw64l4ku0.bin", +@"\sgminer-5-5-0-general\talkcoin-modTongagw64l4ku0.bin", +@"\sgminer-5-5-0-general\vanillaFijigw128l4.bin", +@"\sgminer-5-5-0-general\vanillaHawaiigw128l4.bin", +@"\sgminer-5-5-0-general\vanillaTongagw128l4.bin", +}; + #endregion //CODE_GEN STUFF // listFiles.py + } +} + From 6080c2aed0bbf96ddd8845b1b51edb62e4210e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 25 Dec 2016 11:21:18 +0100 Subject: [PATCH 178/366] claymore stratum+ssl added --- NiceHashMiner/Miners/Grouping/GroupMiner.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index 8dcdd92..868d21a 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -75,6 +75,13 @@ public void Start(string miningLocation, string btcAdress, string worker) { if (AlgorithmType == AlgorithmType.Equihash) { if (Miner.IsNHLocked) { Miner.Start(miningLocation, btcAdress, worker); + } else if(Miner is ClaymoreZcashMiner) { + Miner.Start( + "stratum+ssl://" + + name + + "." + miningLocation + + ".nicehash.com:" + + 33357, btcAdress, worker); } else { Miner.Start( name From 81de5559771fd11726db333223823bbff058603f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 25 Dec 2016 11:28:36 +0100 Subject: [PATCH 179/366] version bump, dl link update --- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index cbf1260..b1a97c5 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_10.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_11.zip", "bins.zip", "bin"); From 6257a6b12caaf88f6cb289909ef249fff733212e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 25 Dec 2016 11:39:57 +0100 Subject: [PATCH 180/366] version bump, dl link update --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 879d943..62ae14e 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.10")] -[assembly: AssemblyFileVersion("1.7.3.10")] +[assembly: AssemblyVersion("1.7.3.11")] +[assembly: AssemblyFileVersion("1.7.3.11")] From ecc1145362f52cc2a966628bd8d364041d15fd90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 26 Dec 2016 18:15:47 +0100 Subject: [PATCH 181/366] fix eqm window hiding exception --- NiceHashMiner/Miners/Equihash/eqm.cs | 1 + NiceHashMiner/Miners/Miner.cs | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 3701d16..3997d29 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -10,6 +10,7 @@ public class eqm : nheqBase { public eqm() : base("eqm") { IsNHLocked = true; + IsNeverHideMiningWindow = true; } public override void Start(string url, string btcAdress, string worker) { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index f068b48..e23e7c8 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -54,6 +54,7 @@ public abstract class Miner { public bool IsAPIReadException { get; protected set; } // inhouse miners that are locked on NH (our eqm) public bool IsNHLocked { get; protected set; } + public bool IsNeverHideMiningWindow { get; protected set; } // mining algorithm stuff protected bool IsInit { get; private set; } protected MiningSetup MiningSetup { get; set; } @@ -124,6 +125,7 @@ public Miner(string minerDeviceName) APIPort = MinersApiPortsManager.GetAvaliablePort(); IsAPIReadException = false; IsNHLocked = false; + IsNeverHideMiningWindow = false; IsKillAllUsedMinerProcs = false; _MAX_CooldownTimeInMilliseconds = GET_MAX_CooldownTimeInMilliseconds(); // @@ -498,10 +500,10 @@ virtual protected NiceHashProcess _Start() P.ExitEvent = Miner_Exited; P.StartInfo.Arguments = LastCommandLine; - if (Path != MinerPaths.eqm_sm50 || Path != MinerPaths.eqm_sm52plus) { - P.StartInfo.CreateNoWindow = ConfigManager.GeneralConfig.HideMiningWindows; - } else { + if (IsNeverHideMiningWindow) { P.StartInfo.CreateNoWindow = false; + } else { + P.StartInfo.CreateNoWindow = ConfigManager.GeneralConfig.HideMiningWindows; } P.StartInfo.UseShellExecute = false; From 2ca6e214754594684d13067208554881ff7b88c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 3 Jan 2017 10:05:30 +0100 Subject: [PATCH 182/366] invoke exit benchmark on stop button clicked, fixes event waiting --- NiceHashMiner/Forms/Form_Benchmark.cs | 1 + NiceHashMiner/Miners/Miner.cs | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index f270718..1a2d6b4 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -248,6 +248,7 @@ private void StopButonClick() { CopyBenchmarks(); if (_currentMiner != null) { _currentMiner.BenchmarkSignalQuit = true; + _currentMiner.InvokeBenchmarkSignalQuit(); } if (ExitWhenFinished) { this.Close(); diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index e23e7c8..12efb28 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -185,7 +185,11 @@ public void KillAllUsedMinerProcesses() { Process process = Process.GetProcessById(PidData.PID); if (process != null && PidData.minerBinPath.Contains(process.ProcessName)) { Helpers.ConsolePrint(MinerTAG(), String.Format("Trying to kill {0}", ProcessTag(PidData))); - try { process.Kill(); } catch (Exception e) { + try { + process.Kill(); + process.Close(); + process.WaitForExit(1000 * 60 * 1); + } catch (Exception e) { Helpers.ConsolePrint(MinerTAG(), String.Format("Exception killing {0}, exMsg {1}", ProcessTag(PidData), e.Message)); } } @@ -329,6 +333,11 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { if (!BenchmarkHandle.Start()) return null; + _currentPidData = new MinerPID_Data(); + _currentPidData.minerBinPath = BenchmarkHandle.StartInfo.FileName; + _currentPidData.PID = BenchmarkHandle.Id; + _allPidData.Add(_currentPidData); + return BenchmarkHandle; } @@ -381,6 +390,10 @@ protected void CheckOutdata(string outdata) { } } + public void InvokeBenchmarkSignalQuit() { + KillAllUsedMinerProcesses(); + } + protected double BenchmarkParseLine_cpu_ccminer_extra(string outdata) { // parse line if (outdata.Contains("Benchmark: ") && outdata.Contains("/s")) { @@ -412,6 +425,7 @@ virtual public void EndBenchmarkProcces() { Helpers.ConsolePrint("BENCHMARK", String.Format("Trying to kill benchmark process {0} algorithm {1}", BenchmarkProcessPath, BenchmarkAlgorithm.GetName())); BenchmarkHandle.Kill(); BenchmarkHandle.Close(); + KillAllUsedMinerProcesses(); } catch { } finally { BenchmarkProcessStatus = BenchmarkProcessStatus.DoneKilling; From 9ba3dc5ba77e3b18ca97658a83236dda498b9496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 3 Jan 2017 12:31:19 +0100 Subject: [PATCH 183/366] revert eqm SM versioning exception --- NiceHashMiner/Miners/Grouping/GroupingLogic.cs | 4 +--- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 13 +++++-------- NiceHashMiner/Miners/MinersManager.cs | 2 +- .../Miners/Parsing/ExtraLaunchParametersParser.cs | 2 +- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index fd9a253..8701446 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -28,9 +28,7 @@ public static bool ShouldGroup(MiningPair a, MiningPair b) { private static class EquihashGroup { public static bool IsEquihashGroupLogic(string minerPath, MiningPair a, MiningPair b) { // eqm - if (MinerPaths.eqm_sm50 == minerPath) { - return Is_eqm(a, b); - } else if (MinerPaths.eqm_sm52plus == minerPath) { + if (MinerPaths.eqm == minerPath) { return Is_eqm(a, b); } // nheqmnier diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index d42ba44..34c65e3 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -53,8 +53,9 @@ public static class MinerPaths /// /// eqm /// - public const string eqm_sm50 = _bin + @"\eqm\eqm.exe"; - public const string eqm_sm52plus = _bin + @"\eqm_sm52plus\eqm.exe"; + //public const string eqm_sm50 = _bin + @"\eqm\eqm.exe"; + //public const string eqm_sm52plus = _bin + @"\eqm_sm52plus\eqm.exe"; + public const string eqm = _bin + @"\eqm\eqm.exe"; public const string NONE = ""; @@ -87,13 +88,9 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy } // AlgorithmType.Equihash special shared case if (algorithmType == AlgorithmType.Equihash) { - if (deviceGroupType == DeviceGroupType.NVIDIA_5_0) { - return MinerPaths.eqm_sm50; - } - // for simplicity sake only new eqm miner groups cpu and gpu, check later - if (deviceGroupType == DeviceGroupType.NVIDIA_5_2 || deviceGroupType == DeviceGroupType.NVIDIA_6_x + if (deviceGroupType == DeviceGroupType.NVIDIA_5_0 || deviceGroupType == DeviceGroupType.NVIDIA_5_2 || deviceGroupType == DeviceGroupType.NVIDIA_6_x || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { - return MinerPaths.eqm_sm52plus; + return MinerPaths.eqm; } else if(deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state return MinerPaths.ClaymoreZcashMiner; } diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index dcbdf05..83b757a 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -46,7 +46,7 @@ public static Miner CreateMiner(ComputeDevice device, Algorithm algorithm) { } public static Miner CreateMiner(DeviceType deviceType, string minerPath) { - if ((minerPath == MinerPaths.eqm_sm50 || minerPath == MinerPaths.eqm_sm52plus) && DeviceType.AMD != deviceType) { + if ((minerPath == MinerPaths.eqm) && DeviceType.AMD != deviceType) { return new eqm(); } else if (minerPath == MinerPaths.nheqminer) { return new nheqminer(); diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index c2cbf86..988c24d 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -317,7 +317,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith if (deviceType == DeviceType.AMD) { return Parse(MiningPairs, _nheqminer_AMD_Options); } - } else if (minerPath == MinerPaths.eqm_sm50 || minerPath == MinerPaths.eqm_sm52plus) { + } else if (minerPath == MinerPaths.eqm) { if (deviceType == DeviceType.CPU) { CheckAndSetCPUPairs(MiningPairs); return Parse(MiningPairs, _eqm_CPU_Options); From 9fc51262f279c50e995b5590cc334a85a42bf5cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 3 Jan 2017 12:46:12 +0100 Subject: [PATCH 184/366] remove eqm_sm52_plus checking --- NiceHashMiner/Utils/BINS_CODEGEN.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index 8d352b9..f9ebc62 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -40,10 +40,6 @@ public static class Bins_Data { @"\eqm\eqm.exe", @"\eqm\msvcp120.dll", @"\eqm\msvcr120.dll", -@"\eqm_sm52plus\cudart64_80.dll", -@"\eqm_sm52plus\eqm.exe", -@"\eqm_sm52plus\msvcp120.dll", -@"\eqm_sm52plus\msvcr120.dll", @"\nheqminer_v0.4b\cpu_tromp_AVX.dll", @"\nheqminer_v0.4b\cpu_tromp_SSE2.dll", @"\nheqminer_v0.4b\cudart64_75.dll", From 6c4f3781d8ef5f08f72e1bbff25912ca1e47be20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 3 Jan 2017 12:47:28 +0100 Subject: [PATCH 185/366] update dl links --- NiceHashMiner/Utils/MinersDownloadManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index b1a97c5..c7fdb79 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,12 +15,12 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_11.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_12.zip", "bins.zip", "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_3_6.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_3_12.zip", "bins_3rdparty.zip", "bin_3rdparty"); From c983b7e9daf08faf37205f741f2266fa4344c88e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 3 Jan 2017 12:53:08 +0100 Subject: [PATCH 186/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 62ae14e..6d817ae 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.11")] -[assembly: AssemblyFileVersion("1.7.3.11")] +[assembly: AssemblyVersion("1.7.3.12")] +[assembly: AssemblyFileVersion("1.7.3.12")] From 24742f18365b8a87f5a47af45677fbb9077d089b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 5 Jan 2017 11:42:03 +0100 Subject: [PATCH 187/366] fix restart required for settings --- NiceHashMiner/Configs/ConfigManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index e8996c7..76cf2e7 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -103,7 +103,8 @@ public static bool IsRestartNeeded() { || ConfigManager.GeneralConfig.SwitchMinSecondsFixed != GeneralConfigBackup.SwitchMinSecondsFixed || ConfigManager.GeneralConfig.SwitchMinSecondsAMD != GeneralConfigBackup.SwitchMinSecondsAMD || ConfigManager.GeneralConfig.SwitchMinSecondsDynamic != GeneralConfigBackup.SwitchMinSecondsDynamic - || ConfigManager.GeneralConfig.MinerAPIQueryInterval != GeneralConfigBackup.MinerAPIQueryInterval; + || ConfigManager.GeneralConfig.MinerAPIQueryInterval != GeneralConfigBackup.MinerAPIQueryInterval + || ConfigManager.GeneralConfig.DisableWindowsErrorReporting != GeneralConfigBackup.DisableWindowsErrorReporting ; } public static void GeneralConfigFileCommit() { From 2d8963a3a30241d0fae45afcc9c1437940819571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 6 Jan 2017 14:19:02 +0100 Subject: [PATCH 188/366] version bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 6d817ae..71f404d 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.3.12")] -[assembly: AssemblyFileVersion("1.7.3.12")] +[assembly: AssemblyVersion("1.7.4.0")] +[assembly: AssemblyFileVersion("1.7.4.0")] From 3653936e3920e44ea1c9f3b3c322d1572f1df42c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 9 Jan 2017 13:00:49 +0100 Subject: [PATCH 189/366] add sgminer-gm (cryponight support) --- NiceHashMiner/Devices/GroupAlgorithms.cs | 4 +++- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 4 ++++ NiceHashMiner/Miners/sgminer.cs | 6 ++++-- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 01c34e6..84ced08 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -52,7 +52,7 @@ public static Dictionary CreateForDevice(ComputeDevice // remove all algos except equi and dagger List toRemove = new List(); foreach (var key in algoSettings.Keys) { - if (AlgorithmType.DaggerHashimoto != key && AlgorithmType.Equihash != key) { + if (AlgorithmType.DaggerHashimoto != key && AlgorithmType.Equihash != key && AlgorithmType.CryptoNight != key) { toRemove.Add(key); } } @@ -121,6 +121,8 @@ private static Dictionary CreateDefaultsForGroup(Devic { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") + { ExtraLaunchParameters = "--rawintensity 512 -w 4 -g 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 8f5cdb2..4535c1b 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -50,7 +50,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = "_PENDING"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 34c65e3..2b35f0e 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -44,6 +44,7 @@ public static class MinerPaths public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; public const string sgminer_5_5_0_general = _bin + @"\sgminer-5-5-0-general\sgminer.exe"; public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; + public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; /// /// nheqminer @@ -172,6 +173,9 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i return MinerPaths.sgminer_5_1_1_optimized; } } + if (AlgorithmType.CryptoNight == type /*|| AlgorithmType.DaggerHashimoto == type*/) { + return MinerPaths.sgminer_gm; + } return MinerPaths.sgminer_5_5_0_general; } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 758df75..c5dd761 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -75,7 +75,8 @@ public override void Start(string url, string btcAdress, string worker) LastCommandLine = " --gpu-platform " + GPUPlatformNumber + " -k " + MiningSetup.MinerName + " --url=" + url + - " --userpass=" + username + ":" + Globals.PasswordDefault + + " --userpass=" + username + + " -p " + Globals.PasswordDefault + " --api-listen" + " --api-port=" + APIPort.ToString() + " " + @@ -125,7 +126,8 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti " --gpu-platform " + GPUPlatformNumber + " -k " + algorithm.MinerName + " --url=" + url + - " --userpass=" + username + ":" + Globals.PasswordDefault + + " --userpass=" + username + + " -p " + Globals.PasswordDefault + " --sched-stop " + DateTime.Now.AddSeconds(time).ToString("HH:mm") + " -T --log 10 --log-file dump.txt" + " " + diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index c7fdb79..2699179 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_3_12.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_4_0.zip", "bins.zip", "bin"); From 9fe6d1af26e8a392bb90d446f40ab12c42919f2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 9 Jan 2017 16:54:17 +0100 Subject: [PATCH 190/366] Adding OptiminerZcash (WIP) --- .../Miners/Equihash/OptiminerZcashMiner.cs | 150 ++++++++++++++++++ NiceHashMiner/Miners/Grouping/MinerPaths.cs | 6 +- NiceHashMiner/Miners/MinersManager.cs | 7 +- NiceHashMiner/NiceHashMiner.csproj | 1 + 4 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs new file mode 100644 index 0000000..0cc398c --- /dev/null +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -0,0 +1,150 @@ +using Newtonsoft.Json; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; +using NiceHashMiner.Net20_backport; +using System; +using System.Collections.Generic; +using System.Net.Sockets; +using System.Text; +using System.Windows.Forms; + +namespace NiceHashMiner.Miners.Equihash { + public class OptiminerZcashMiner : Miner { + public OptiminerZcashMiner() + : base("OptiminerZcashMiner") { + Path = MinerPaths.OptiminerZcashMiner; + WorkingDirectory = MinerPaths.OptiminerZcashMiner.Replace("Optiminer.exe", ""); + } + + private class Stratum { + public string target { get; set; } + public bool connected { get; set; } + public int connection_failures { get; set; } + public string host { get; set; } + public int port { get; set; } + } + + private class JsonApiResponse { + public double uptime; + public Dictionary> solution_rate; + public Dictionary share; + public Dictionary> iteration_rate; + public Stratum stratum; + } + + public override void Start(string url, string btcAdress, string worker) { + string username = GetUsername(btcAdress, worker); + LastCommandLine = " " + GetDevicesCommandString() + " -m " + APIPort + " -s " + url + " -u " + username + " -p x"; + ProcessHandle = _Start(); + } + + protected override bool UpdateBindPortCommand(int oldPort, int newPort) { + const string MASK = "-m {0}"; + var oldApiBindStr = String.Format(MASK, oldPort); + var newApiBindStr = String.Format(MASK, newPort); + if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { + LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); + return true; + } + return false; + } + + protected override void _Stop(MinerStopType willswitch) { + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); + } + + protected override int GET_MAX_CooldownTimeInMilliseconds() { + return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds + } + + protected override string GetDevicesCommandString() { + string extraParams = ""; //ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); + string deviceStringCommand = " -c " + ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; + deviceStringCommand += " -d "; + List ids = new List(); + foreach (var mPair in MiningSetup.MiningPairs) { + ids.Add(mPair.Device.ID.ToString()); + } + deviceStringCommand += StringHelper.Join(" ", ids); + + return deviceStringCommand + extraParams; + } + + public override APIData GetSummary() { + _currentMinerReadStatus = MinerAPIReadStatus.NONE; + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); + + TcpClient client = null; + JsonApiResponse resp = null; + try { + byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("status\r\n"); + client = new TcpClient("127.0.0.1", APIPort); + //client.ReceiveTimeout = 500; + //client.NoDelay = true; + NetworkStream nwStream = client.GetStream(); + //nwStream.ReadTimeout = 5000; + nwStream.Write(bytesToSend, 0, bytesToSend.Length); + byte[] bytesToRead = new byte[client.ReceiveBufferSize]; + if (nwStream.CanRead) { + do { + int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); + string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); + Helpers.ConsolePrint("OptiminerZcashMiner", "respStr: " + respStr); + } while (nwStream.DataAvailable); + } else { + Helpers.ConsolePrint("OptiminerZcashMiner API :", "nwStream.CanRead == false"); + } + + if (nwStream.DataAvailable == false) { + Helpers.ConsolePrint("OptiminerZcashMiner API :", "nwStream.DataAvailable == false"); + } + + //int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); + //string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); + //resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); + client.Close(); + //Helpers.ConsolePrint("OptiminerZcashMiner API back:", respStr); + } catch (Exception ex) { + Helpers.ConsolePrint("OptiminerZcashMiner", "GetSummary exception: " + ex.Message); + } + + if (resp != null && resp.solution_rate == null) { + //Helpers.ConsolePrint("OptiminerZcashMiner API back:", "resp != null && resp.error == null"); + const string total_key = "Total"; + const string _5s_key = "5s"; + if (resp.solution_rate.ContainsKey(total_key)) { + var total_solution_rate_dict = resp.solution_rate[total_key]; + if (total_solution_rate_dict != null && total_solution_rate_dict.ContainsKey(_5s_key)) { + ad.Speed = total_solution_rate_dict[_5s_key]; + _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + } + } + if (ad.Speed == 0) { + _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; + } + } + + return ad; + } + + // benchmark stuff + + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + // TODO waiting api implementation + string ret = "TODO"; + return ret; + } + protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { + CheckOutdata(outdata); + } + + protected override bool BenchmarkParseLine(string outdata) { + Helpers.ConsolePrint("BENCHMARK", outdata); + // TODO waiting api implementation + return false; + } + + } +} diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 2b35f0e..8fdd830 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -44,7 +44,7 @@ public static class MinerPaths public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; public const string sgminer_5_5_0_general = _bin + @"\sgminer-5-5-0-general\sgminer.exe"; public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; - public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; + public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; // open source miner /// /// nheqminer @@ -63,6 +63,7 @@ public static class MinerPaths // root binary folder private const string _bin_3rdparty = @"bin_3rdparty"; public const string ClaymoreZcashMiner = _bin_3rdparty + @"\claymore_zcash\ZecMiner64.exe"; + public const string OptiminerZcashMiner = _bin_3rdparty + @"\optiminer_zcash_win\Optiminer.exe"; public static string GetOptimizedMinerPath(MiningPair pair) { return GetOptimizedMinerPath(pair.Device, pair.Algorithm); @@ -93,7 +94,8 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; } else if(deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state - return MinerPaths.ClaymoreZcashMiner; + //return MinerPaths.ClaymoreZcashMiner; + return MinerPaths.OptiminerZcashMiner; } else { // supports all DeviceTypes return MinerPaths.nheqminer; diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 83b757a..8bbe400 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -10,6 +10,7 @@ namespace NiceHashMiner.Miners { using NiceHashMiner.Miners.Grouping; + using NiceHashMiner.Miners.Equihash; public static class MinersManager { private static MiningSession CurMiningSession; @@ -54,6 +55,10 @@ public static Miner CreateMiner(DeviceType deviceType, string minerPath) { ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES && minerPath == MinerPaths.ClaymoreZcashMiner && DeviceType.AMD == deviceType) { return new ClaymoreZcashMiner(); + } else if ( + ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES + && minerPath == MinerPaths.OptiminerZcashMiner && DeviceType.AMD == deviceType) { + return new OptiminerZcashMiner(); } else if (minerPath == MinerPaths.ethminer && DeviceType.CPU != deviceType) { if (DeviceType.AMD == deviceType) { return new MinerEtherumOCL(); @@ -64,7 +69,7 @@ public static Miner CreateMiner(DeviceType deviceType, string minerPath) { return new cpuminer(); } else if (minerPath.Contains("sgminer") && DeviceType.AMD == deviceType) { return new sgminer(); - } else if(minerPath.Contains("ccminer") && DeviceType.NVIDIA == deviceType) { + } else if (minerPath.Contains("ccminer") && DeviceType.NVIDIA == deviceType) { return new ccminer(); } diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 1add196..9ba78a9 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -196,6 +196,7 @@ + From 91acd373d5b9af5f32ec21e566318d35cc351d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 14:52:20 +0100 Subject: [PATCH 191/366] added more 3rd party miners, OptminerZCash and ClaymoreCryptoNightMiner --- NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 267 ++++++++++++++++++ .../Miners/ClaymoreCryptoNightMiner.cs | 50 ++++ .../Miners/Equihash/ClaymoreZcashMiner.cs | 229 +-------------- .../Miners/Equihash/OptiminerZcashMiner.cs | 57 ++-- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 10 +- NiceHashMiner/Miners/Miner.cs | 36 ++- NiceHashMiner/Miners/MinersManager.cs | 4 + NiceHashMiner/NiceHashMiner.csproj | 2 + 8 files changed, 395 insertions(+), 260 deletions(-) create mode 100644 NiceHashMiner/Miners/ClaymoreBaseMiner.cs create mode 100644 NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs new file mode 100644 index 0000000..5ba2926 --- /dev/null +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -0,0 +1,267 @@ +using Newtonsoft.Json; +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; +using NiceHashMiner.Net20_backport; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace NiceHashMiner.Miners { + public abstract class ClaymoreBaseMiner : Miner { + + protected int benchmarkTimeWait = 60; + int benchmark_read_count = 0; + double benchmark_sum = 0.0d; + protected readonly string LOOK_FOR_START; + protected readonly string MinerExeName; + const string LOOK_FOR_END = " h/s"; + + + public ClaymoreBaseMiner(string minerDeviceName, string minerPath, string minerExeName, string look_FOR_START) + : base(minerDeviceName) { + Path = minerPath; + MinerExeName = minerExeName; + LOOK_FOR_START = look_FOR_START.ToLower(); + WorkingDirectory = minerPath.Replace(minerExeName + ".exe", ""); + IsKillAllUsedMinerProcs = true; + } + + protected override int GET_MAX_CooldownTimeInMilliseconds() { + return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds + } + + private class JsonApiResponse { + public List result { get; set; } + public int id { get; set; } + public object error { get; set; } + } + + protected void KillClaymoreMinerBase(string exeName) { + foreach (Process process in Process.GetProcessesByName(exeName)) { + try { process.Kill(); } catch (Exception e) { Helpers.ConsolePrint(MinerDeviceName, e.ToString()); } + } + } + + public override APIData GetSummary() { + _currentMinerReadStatus = MinerAPIReadStatus.NONE; + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); + + TcpClient client = null; + JsonApiResponse resp = null; + try { + byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("{\"id\":0,\"jsonrpc\":\"2.0\",\"method\":\"miner_getstat1\"}n"); + client = new TcpClient("127.0.0.1", APIPort); + NetworkStream nwStream = client.GetStream(); + nwStream.Write(bytesToSend, 0, bytesToSend.Length); + byte[] bytesToRead = new byte[client.ReceiveBufferSize]; + int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); + string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); + resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); + client.Close(); + //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", respStr); + } catch (Exception ex) { + Helpers.ConsolePrint(this.MinerTAG(), "GetSummary exception: " + ex.Message); + } + + if (resp != null && resp.error == null) { + //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "resp != null && resp.error == null"); + if (resp.result != null && resp.result.Count > 4) { + //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "resp.result != null && resp.result.Count > 4"); + var speeds = resp.result[3].Split(';'); + ad.Speed = 0; + foreach (var speed in speeds) { + //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "foreach (var speed in speeds) {"); + double tmpSpeed = 0; + try { + tmpSpeed = Double.Parse(speed, CultureInfo.InvariantCulture); + } catch { + tmpSpeed = 0; + } + ad.Speed += tmpSpeed; + } + _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + } + if (ad.Speed == 0) { + _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; + } + } + + return ad; + } + + protected override bool UpdateBindPortCommand(int oldPort, int newPort) { + const string MASK = "-mport -{0}"; + var oldApiBindStr = String.Format(MASK, oldPort); + var newApiBindStr = String.Format(MASK, newPort); + if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { + LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); + return true; + } + return false; + } + + protected override void _Stop(MinerStopType willswitch) { + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); + } + + + protected override string GetDevicesCommandString() { + string extraParams = ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); + string deviceStringCommand = " -di "; + List ids = new List(); + foreach (var mPair in MiningSetup.MiningPairs) { + ids.Add(mPair.Device.ID.ToString()); + } + deviceStringCommand += StringHelper.Join("", ids); + + return deviceStringCommand + extraParams; + } + + // benchmark stuff + + protected override void BenchmarkThreadRoutine(object CommandLine) { + Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); + + BenchmarkSignalQuit = false; + BenchmarkSignalHanged = false; + BenchmarkSignalFinnished = false; + BenchmarkException = null; + + try { + Helpers.ConsolePrint("BENCHMARK", "Benchmark starts"); + Helpers.ConsolePrint(MinerTAG(), "Benchmark should end in : " + benchmarkTimeWait + " seconds"); + BenchmarkHandle = BenchmarkStartProcess((string)CommandLine); + Stopwatch _benchmarkTimer = new Stopwatch(); + _benchmarkTimer.Reset(); + _benchmarkTimer.Start(); + //BenchmarkThreadRoutineStartSettup(); + // wait a little longer then the benchmark routine if exit false throw + //var timeoutTime = BenchmarkTimeoutInSeconds(BenchmarkTimeInSeconds); + //var exitSucces = BenchmarkHandle.WaitForExit(timeoutTime * 1000); + // don't use wait for it breaks everything + BenchmarkProcessStatus = BenchmarkProcessStatus.Running; + bool keepRunning = true; + while (keepRunning) { + //string outdata = BenchmarkHandle.StandardOutput.ReadLine(); + //BenchmarkOutputErrorDataReceivedImpl(outdata); + // terminate process situations + if (_benchmarkTimer.Elapsed.Seconds >= (benchmarkTimeWait + 2) + || BenchmarkSignalQuit + || BenchmarkSignalFinnished + || BenchmarkSignalHanged + || BenchmarkSignalTimedout + || BenchmarkException != null) { + // maybe will have to KILL process + KillClaymoreMinerBase(MinerExeName); + if (BenchmarkSignalTimedout) { + throw new Exception("Benchmark timedout"); + } + if (BenchmarkException != null) { + throw BenchmarkException; + } + if (BenchmarkSignalQuit) { + throw new Exception("Termined by user request"); + } + if (BenchmarkSignalFinnished) { + break; + } + keepRunning = false; + break; + } + } + } catch (Exception ex) { + BenchmarkAlgorithm.BenchmarkSpeed = 0; + Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); + if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { + OnBenchmarkCompleteCalled = true; + BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); + } + } finally { + BenchmarkAlgorithm.BenchmarkSpeed = 0; + BenchmarkProcessStatus = BenchmarkProcessStatus.Finished; + // find latest log file + string latestLogFile = ""; + var dirInfo = new DirectoryInfo(this.WorkingDirectory); + foreach (var file in dirInfo.GetFiles("*_log.txt")) { + latestLogFile = file.Name; + break; + } + // read file log + if (File.Exists(WorkingDirectory + latestLogFile)) { + var lines = File.ReadAllLines(WorkingDirectory + latestLogFile); + foreach (var line in lines) { + if (line != null) { + string lineLowered = line.ToLower(); + if (lineLowered.Contains(LOOK_FOR_START)) { + benchmark_sum += getNumber(lineLowered); + ++benchmark_read_count; + } + } + } + if (benchmark_read_count > 0) { + BenchmarkAlgorithm.BenchmarkSpeed = benchmark_sum / benchmark_read_count; + BenchmarkProcessStatus = BenchmarkProcessStatus.Success; + } + } + Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); + Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); + if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { + OnBenchmarkCompleteCalled = true; + BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); + } + } + } + + protected void CleanAllOldLogs() { + // clean old logs + try { + var dirInfo = new DirectoryInfo(this.WorkingDirectory); + var deleteContains = "_log.txt"; + if (dirInfo != null && dirInfo.Exists) { + foreach (FileInfo file in dirInfo.GetFiles()) { + if (file.Name.Contains(deleteContains)) { + file.Delete(); + } + } + } + } catch { } + } + + // stub benchmarks read from file + protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { + CheckOutdata(outdata); + } + + protected override bool BenchmarkParseLine(string outdata) { + Helpers.ConsolePrint("BENCHMARK", outdata); + return false; + } + + protected double getNumber(string outdata) { + return getNumber(outdata, LOOK_FOR_START, LOOK_FOR_END); + } + + protected double getNumber(string outdata, string LOOK_FOR_START, string LOOK_FOR_END) { + try { + int speedStart = outdata.IndexOf(LOOK_FOR_START); + string speed = outdata.Substring(speedStart, outdata.Length - speedStart); + speed = speed.Replace(LOOK_FOR_START, ""); + speed = speed.Substring(0, speed.IndexOf(LOOK_FOR_END)); + speed = speed.Trim(); + return Double.Parse(speed, CultureInfo.InvariantCulture); + } catch (Exception ex) { + Helpers.ConsolePrint("getNumber", ex.Message + " | args => " + outdata + " | " + LOOK_FOR_END + " | " + LOOK_FOR_START); + } + return 0; + } + + + } +} diff --git a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs new file mode 100644 index 0000000..8a5a5dc --- /dev/null +++ b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs @@ -0,0 +1,50 @@ +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; +using NiceHashMiner.Net20_backport; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace NiceHashMiner.Miners { + public class ClaymoreCryptoNightMiner : ClaymoreBaseMiner { + + const string _LOOK_FOR_START = "hashrate ="; + public ClaymoreCryptoNightMiner() + : base("ClaymoreCryptoNightMiner", MinerPaths.ClaymoreCryptoNightMiner, "NsGpuCNMiner", _LOOK_FOR_START) { + } + + public override void Start(string url, string btcAdress, string worker) { + string username = GetUsername(btcAdress, worker); + LastCommandLine = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -o " + url + " -u " + username + " -p x"; + ProcessHandle = _Start(); + } + + // benchmark stuff + + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + // clean old logs + CleanAllOldLogs(); + benchmarkTimeWait = time; + //benchmarkTimeWait = 30; // when debugging + // network workaround + var nhAlgorithmData = Globals.NiceHashData[algorithm.NiceHashID]; + string url = "stratum+tcp://" + nhAlgorithmData.name + "." + + Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation] + ".nicehash.com:" + + nhAlgorithmData.port; + // demo for benchmark + string username = Globals.DemoUser; + if (ConfigManager.GeneralConfig.WorkerName.Length > 0) + username += "." + ConfigManager.GeneralConfig.WorkerName.Trim(); + + string ret = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -o " + url + " -u " + username + " -p x"; + return ret; + } + + } +} diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 272201d..0cea491 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -14,235 +14,30 @@ using System.Threading; namespace NiceHashMiner.Miners { - public class ClaymoreZcashMiner : Miner { - public ClaymoreZcashMiner() - : base("ClaymoreZcashMiner") { - Path = MinerPaths.ClaymoreZcashMiner; - WorkingDirectory = MinerPaths.ClaymoreZcashMiner.Replace("ZecMiner64.exe", ""); - //Path = WorkingDirectory + "benchmark.bat"; - - IsKillAllUsedMinerProcs = true; - } - const int BENCHMARK_MAX_GET = 10; - const string LOOK_FOR_START = "ZEC - Total Speed:"; - const string LOOK_FOR_END = " H/s"; - const string LOG_FILE_NAME = "cl_log_noappend.txt"; - int benchmark_read_count = 0; - double benchmark_sum = 0.0d; - - private class JsonApiResponse { - public List result { get; set; } - public int id { get; set; } - public object error { get; set; } - } + public class ClaymoreZcashMiner : ClaymoreBaseMiner { - public void KillZecMiner64() { - foreach (Process process in Process.GetProcessesByName("ZecMiner64")) { - try { process.Kill(); } catch (Exception e) { Helpers.ConsolePrint(MinerDeviceName, e.ToString()); } - } + const string _LOOK_FOR_START = "ZEC - Total Speed:"; + public ClaymoreZcashMiner() + : base("ClaymoreZcashMiner", MinerPaths.ClaymoreZcashMiner, "ZecMiner64", _LOOK_FOR_START) { } - + public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); - LastCommandLine = "-logfile cl_log_noappend.txt " + GetDevicesCommandString() + " -mport -" + APIPort + " -zpool " + url + " -zwal " + username; + LastCommandLine = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -zpool " + url + " -zwal " + username + " -zpsw x"; ProcessHandle = _Start(); } - protected override int GET_MAX_CooldownTimeInMilliseconds() { - return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds - } - - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - const string MASK = "-mport -{0}"; - var oldApiBindStr = String.Format(MASK, oldPort); - var newApiBindStr = String.Format(MASK, newPort); - if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { - LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - return true; - } - return false; - } - - protected override void _Stop(MinerStopType willswitch) { - Stop_cpu_ccminer_sgminer_nheqminer(willswitch); - } - - public override APIData GetSummary() { - _currentMinerReadStatus = MinerAPIReadStatus.NONE; - APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); - - TcpClient client = null; - JsonApiResponse resp = null; - try { - byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("{\"id\":0,\"jsonrpc\":\"2.0\",\"method\":\"miner_getstat1\"}n"); - client = new TcpClient("127.0.0.1", APIPort); - NetworkStream nwStream = client.GetStream(); - nwStream.Write(bytesToSend, 0, bytesToSend.Length); - byte[] bytesToRead = new byte[client.ReceiveBufferSize]; - int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); - string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); - resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); - client.Close(); - //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", respStr); - } catch (Exception ex) { - Helpers.ConsolePrint("ClaymoreZcashMiner", "GetSummary exception: " + ex.Message); - } - - if (resp != null && resp.error == null) { - //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "resp != null && resp.error == null"); - if (resp.result != null && resp.result.Count > 4) { - //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "resp.result != null && resp.result.Count > 4"); - var speeds = resp.result[3].Split(';'); - ad.Speed = 0; - foreach (var speed in speeds) { - //Helpers.ConsolePrint("ClaymoreZcashMiner API back:", "foreach (var speed in speeds) {"); - double tmpSpeed = 0; - try { - tmpSpeed = Double.Parse(speed, CultureInfo.InvariantCulture); - } catch { - tmpSpeed = 0; - } - ad.Speed += tmpSpeed; - } - _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; - } - if (ad.Speed == 0) { - _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; - } - } - - return ad; - } - - protected override string GetDevicesCommandString() { - string extraParams = ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); - string deviceStringCommand = " -di "; - List ids = new List(); - foreach (var mPair in MiningSetup.MiningPairs) { - ids.Add(mPair.Device.ID.ToString()); - } - deviceStringCommand += StringHelper.Join("", ids); - - return deviceStringCommand + extraParams; - } - // benchmark stuff - protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - string ret = "-logfile " + LOG_FILE_NAME + " -benchmark 1 " + GetDevicesCommandString(); - return ret; - } - protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { - CheckOutdata(outdata); - } - - protected override void BenchmarkThreadRoutine(object CommandLine) { - Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); + // clean old logs + CleanAllOldLogs(); + benchmarkTimeWait = time / 3; // 3 times faster than sgminer + //benchmarkTimeWait = 30; // when debugging - BenchmarkSignalQuit = false; - BenchmarkSignalHanged = false; - BenchmarkSignalFinnished = false; - BenchmarkException = null; - - try { - Helpers.ConsolePrint("BENCHMARK", "Benchmark starts"); - BenchmarkHandle = BenchmarkStartProcess((string)CommandLine); - Stopwatch _benchmarkTimer = new Stopwatch(); - _benchmarkTimer.Reset(); - _benchmarkTimer.Start(); - //BenchmarkThreadRoutineStartSettup(); - // wait a little longer then the benchmark routine if exit false throw - //var timeoutTime = BenchmarkTimeoutInSeconds(BenchmarkTimeInSeconds); - //var exitSucces = BenchmarkHandle.WaitForExit(timeoutTime * 1000); - // don't use wait for it breaks everything - BenchmarkProcessStatus = BenchmarkProcessStatus.Running; - while (true) { - //string outdata = BenchmarkHandle.StandardOutput.ReadLine(); - //BenchmarkOutputErrorDataReceivedImpl(outdata); - // terminate process situations - if (_benchmarkTimer.Elapsed.Seconds >= 45 + 2 - || BenchmarkSignalQuit - || BenchmarkSignalFinnished - || BenchmarkSignalHanged - || BenchmarkSignalTimedout - || BenchmarkException != null) { - // maybe will have to KILL process - KillZecMiner64(); - if (BenchmarkSignalTimedout) { - throw new Exception("Benchmark timedout"); - } - if (BenchmarkException != null) { - throw BenchmarkException; - } - if (BenchmarkSignalQuit) { - throw new Exception("Termined by user request"); - } - if (BenchmarkSignalFinnished) { - break; - } - if (_benchmarkTimer.Elapsed.Seconds >= 30) { - break; - } - } - } - } catch (Exception ex) { - BenchmarkAlgorithm.BenchmarkSpeed = 0; - Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); - if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { - OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); - } - } finally { - BenchmarkAlgorithm.BenchmarkSpeed = 0; - BenchmarkProcessStatus = BenchmarkProcessStatus.Finished; - // read file log - if(File.Exists(WorkingDirectory + LOG_FILE_NAME)) { - var lines = File.ReadAllLines(WorkingDirectory + LOG_FILE_NAME); - foreach (var line in lines) { - if (line != null && line.Contains(LOOK_FOR_START)) { - benchmark_sum += getNumber(line); - ++benchmark_read_count; - } - } - if (benchmark_read_count > 0) { - BenchmarkAlgorithm.BenchmarkSpeed = benchmark_sum / benchmark_read_count; - BenchmarkProcessStatus = BenchmarkProcessStatus.Success; - } - } - Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); - Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); - if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { - OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); - } - } - } - - double getNumber(string outdata) { - try { - int speedStart = outdata.IndexOf(LOOK_FOR_START); - String speed = outdata.Substring(speedStart, outdata.Length - speedStart); - speed = speed.Replace(LOOK_FOR_START, ""); - speed = speed.Substring(0, speed.IndexOf(LOOK_FOR_END)); - speed = speed.Trim(); - return Double.Parse(speed, CultureInfo.InvariantCulture); - } catch { - } - return 0; + string ret = " -benchmark 1 " + GetDevicesCommandString(); + return ret; } - protected override bool BenchmarkParseLine(string outdata) { - Helpers.ConsolePrint("BENCHMARK", outdata); - if (outdata.Contains(LOOK_FOR_START)) { - benchmark_sum += getNumber(outdata); - ++benchmark_read_count; - if (benchmark_read_count == BENCHMARK_MAX_GET) { - BenchmarkAlgorithm.BenchmarkSpeed = benchmark_sum / BENCHMARK_MAX_GET; - return true; - } - } - return false; - } } } diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs index 0cc398c..861076a 100644 --- a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using NiceHashMiner.Configs; using NiceHashMiner.Devices; using NiceHashMiner.Enums; using NiceHashMiner.Miners.Grouping; @@ -6,9 +7,11 @@ using NiceHashMiner.Net20_backport; using System; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net; using System.Net.Sockets; using System.Text; -using System.Windows.Forms; namespace NiceHashMiner.Miners.Equihash { public class OptiminerZcashMiner : Miner { @@ -60,6 +63,7 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { } protected override string GetDevicesCommandString() { + // TODO add string extraParams = ""; //ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); string deviceStringCommand = " -c " + ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; deviceStringCommand += " -d "; @@ -79,38 +83,22 @@ public override APIData GetSummary() { TcpClient client = null; JsonApiResponse resp = null; try { - byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("status\r\n"); - client = new TcpClient("127.0.0.1", APIPort); - //client.ReceiveTimeout = 500; - //client.NoDelay = true; - NetworkStream nwStream = client.GetStream(); - //nwStream.ReadTimeout = 5000; - nwStream.Write(bytesToSend, 0, bytesToSend.Length); - byte[] bytesToRead = new byte[client.ReceiveBufferSize]; - if (nwStream.CanRead) { - do { - int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); - string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); - Helpers.ConsolePrint("OptiminerZcashMiner", "respStr: " + respStr); - } while (nwStream.DataAvailable); - } else { - Helpers.ConsolePrint("OptiminerZcashMiner API :", "nwStream.CanRead == false"); - } - - if (nwStream.DataAvailable == false) { - Helpers.ConsolePrint("OptiminerZcashMiner API :", "nwStream.DataAvailable == false"); + string DataToSend = GetHttpRequestNHMAgentStrin(""); + string respStr = GetAPIData(APIPort, DataToSend, true); + if (respStr != null && respStr.Contains("{")) { + int start = respStr.IndexOf("{"); + if (start > -1) { + string respStrJSON = respStr.Substring(start); + resp = JsonConvert.DeserializeObject(respStrJSON.Trim(), Globals.JsonSettings); + } } - - //int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); - //string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); - //resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); client.Close(); //Helpers.ConsolePrint("OptiminerZcashMiner API back:", respStr); } catch (Exception ex) { Helpers.ConsolePrint("OptiminerZcashMiner", "GetSummary exception: " + ex.Message); } - if (resp != null && resp.solution_rate == null) { + if (resp != null && resp.solution_rate != null) { //Helpers.ConsolePrint("OptiminerZcashMiner API back:", "resp != null && resp.error == null"); const string total_key = "Total"; const string _5s_key = "5s"; @@ -132,8 +120,8 @@ public override APIData GetSummary() { // benchmark stuff protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - // TODO waiting api implementation - string ret = "TODO"; + int t = time / 9; // sgminer needs 9 times more than this miner so reduce benchmark speed + string ret = " " + GetDevicesCommandString() + " --benchmark " + t; return ret; } protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { @@ -141,8 +129,17 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { } protected override bool BenchmarkParseLine(string outdata) { - Helpers.ConsolePrint("BENCHMARK", outdata); - // TODO waiting api implementation + const string FIND = "Benchmark:"; + if (outdata.Contains(FIND)) { + int start = outdata.IndexOf("Benchmark:") + FIND.Length; + string itersAndVars = outdata.Substring(start).Trim(); + var ar = itersAndVars.Split(new char[] { ' ' }); + if (ar.Length >= 4) { + // gets sols/s + BenchmarkAlgorithm.BenchmarkSpeed = Helpers.ParseDouble(ar[2]); + return true; + } + } return false; } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 8fdd830..2a89072 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -63,6 +63,7 @@ public static class MinerPaths // root binary folder private const string _bin_3rdparty = @"bin_3rdparty"; public const string ClaymoreZcashMiner = _bin_3rdparty + @"\claymore_zcash\ZecMiner64.exe"; + public const string ClaymoreCryptoNightMiner = _bin_3rdparty + @"\claymore_cryptonight\NsGpuCNMiner.exe"; public const string OptiminerZcashMiner = _bin_3rdparty + @"\optiminer_zcash_win\Optiminer.exe"; public static string GetOptimizedMinerPath(MiningPair pair) { @@ -94,13 +95,18 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; } else if(deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state - //return MinerPaths.ClaymoreZcashMiner; - return MinerPaths.OptiminerZcashMiner; + // TODO add settings to choose what miner to use, or to automatically determine what to use + return MinerPaths.ClaymoreZcashMiner; + //return MinerPaths.OptiminerZcashMiner; } else { // supports all DeviceTypes return MinerPaths.nheqminer; } } + // 3rd party miner + if (algorithmType == AlgorithmType.CryptoNight && deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { + return MinerPaths.ClaymoreCryptoNightMiner; + } // normal stuff // CPU if (deviceType == DeviceType.CPU) { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 12efb28..5746501 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -599,24 +599,18 @@ private void Restart() { } } - protected string GetAPIData(int port, string cmd) + protected string GetAPIData(int port, string DataToSend, bool exitHack = false) { string ResponseFromServer = null; try { TcpClient tcpc = new TcpClient("127.0.0.1", port); - string DataToSend = "GET /" + cmd + " HTTP/1.1\r\n" + - "Host: 127.0.0.1\r\n" + - "User-Agent: NiceHashMiner/" + Application.ProductVersion + "\r\n" + - "\r\n"; - - if (IsKillAllUsedMinerProcs) - DataToSend = cmd; byte[] BytesToSend = ASCIIEncoding.ASCII.GetBytes(DataToSend); tcpc.Client.Send(BytesToSend); byte[] IncomingBuffer = new byte[5000]; + int prevOffset = -1; int offset = 0; bool fin = false; @@ -625,13 +619,24 @@ protected string GetAPIData(int port, string cmd) int r = tcpc.Client.Receive(IncomingBuffer, offset, 5000 - offset, SocketFlags.None); for (int i = offset; i < offset + r; i++) { - if (IncomingBuffer[i] == 0x7C || IncomingBuffer[i] == 0x00) - { + if (IncomingBuffer[i] == 0x7C || IncomingBuffer[i] == 0x00) { fin = true; break; } + // Not working + //if (IncomingBuffer[i] == 0x5d || IncomingBuffer[i] == 0x5e) { + // fin = true; + // break; + //} } offset += r; + if (exitHack) { + if (prevOffset == offset) { + fin = true; + break; + } + prevOffset = offset; + } } tcpc.Close(); @@ -650,13 +655,22 @@ protected string GetAPIData(int port, string cmd) public abstract APIData GetSummary(); + protected string GetHttpRequestNHMAgentStrin(string cmd) { + return "GET /" + cmd + " HTTP/1.1\r\n" + + "Host: 127.0.0.1\r\n" + + "User-Agent: NiceHashMiner/" + Application.ProductVersion + "\r\n" + + "\r\n"; + } + protected APIData GetSummaryCPU_CCMINER() { string resp; // TODO aname string aname = null; APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); - resp = GetAPIData(APIPort, "summary"); + string DataToSend = GetHttpRequestNHMAgentStrin("summary"); + + resp = GetAPIData(APIPort, DataToSend); if (resp == null) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " summary is null"); _currentMinerReadStatus = MinerAPIReadStatus.NONE; diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 8bbe400..c4485ba 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -59,6 +59,10 @@ public static Miner CreateMiner(DeviceType deviceType, string minerPath) { ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES && minerPath == MinerPaths.OptiminerZcashMiner && DeviceType.AMD == deviceType) { return new OptiminerZcashMiner(); + } else if ( + ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES + && minerPath == MinerPaths.ClaymoreCryptoNightMiner && DeviceType.AMD == deviceType) { + return new ClaymoreCryptoNightMiner(); } else if (minerPath == MinerPaths.ethminer && DeviceType.CPU != deviceType) { if (DeviceType.AMD == deviceType) { return new MinerEtherumOCL(); diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 9ba78a9..9282521 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -193,6 +193,8 @@ + + From 057b9fde85348eab9a2f84a593950a78b5aa009a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 15:03:20 +0100 Subject: [PATCH 192/366] claymore zcash update extra launch params --- NiceHashMiner/Enums/MinerOptionType.cs | 1 + NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index aeb9563..6c5f27e 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -51,6 +51,7 @@ public enum MinerOptionType { // eqm CUDA_Solver_Mode, // -cm // ClaymoreZcash + ClaymoreZcash_a, ClaymoreZcash_i, // -i ClaymoreZcash_wd, // -wd ClaymoreZcash_r, diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 988c24d..cf49d43 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -89,6 +89,7 @@ static class ExtraLaunchParametersParser { }; // Zcash claymore private static List _ClaymoreZcash_Options = new List() { + new MinerOption(MinerOptionType.ClaymoreZcash_a , "-a", "-a", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption(MinerOptionType.ClaymoreZcash_i , "-i", "-i", "6", MinerOptionFlagType.MultiParam, ","), new MinerOption(MinerOptionType.ClaymoreZcash_wd , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), //new MinerOption(MinerOptionType.ClaymoreZcash_r , , , , MinerOptionFlagType.MultiParam, ","), From 096abb79b702674d50e7794c374f9317b5ea329b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 15:15:39 +0100 Subject: [PATCH 193/366] update 3rd party dl link and bins detection --- .../Miners/ClaymoreCryptoNightMiner.cs | 1 + NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs | 1170 ++++++++++++++++- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 3 files changed, 1157 insertions(+), 16 deletions(-) diff --git a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs index 8a5a5dc..5d4444f 100644 --- a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs @@ -32,6 +32,7 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti CleanAllOldLogs(); benchmarkTimeWait = time; //benchmarkTimeWait = 30; // when debugging + // network workaround var nhAlgorithmData = Globals.NiceHashData[algorithm.NiceHashID]; string url = "stratum+tcp://" + nhAlgorithmData.name + "." + diff --git a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs index 9bafd51..eade245 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs @@ -1,15 +1,1155 @@ - -namespace NiceHashMiner.Utils { - public static class Bins_Data_3rd { - #region CODE_GEN STUFF // listFiles.py -public static string[] ALL_FILES_BINS = { -@"\claymore_zcash\Data.bin", -@"\claymore_zcash\Data2.bin", -@"\claymore_zcash\msvcr110.dll", -@"\claymore_zcash\ZecMiner64.exe", -@"\claymore_zcash\Remote manager\EthMan.exe", -}; -#endregion //CODE_GEN STUFF // listFiles.py -} -} - + +namespace NiceHashMiner.Utils { + public static class Bins_Data_3rd { + #region CODE_GEN STUFF // listFiles.py + public static string[] ALL_FILES_BINS = { + +@"\claymore_cryptonight\Data.bin", + +@"\claymore_cryptonight\msvcr110.dll", + +@"\claymore_cryptonight\NsGpuCNMiner.exe", + +@"\claymore_cryptonight\Remote manager\EthMan.exe", + +@"\claymore_zcash\Data.bin", + +@"\claymore_zcash\Data2.bin", + +@"\claymore_zcash\msvcr110.dll", + +@"\claymore_zcash\ZecMiner64.exe", + +@"\claymore_zcash\Remote manager\EthMan.exe", + +@"\optiminer_zcash_win\Optiminer.exe", + +@"\optiminer_zcash_win\bin\asm.bin", + +@"\optiminer_zcash_win\bin\base.bin", + +@"\optiminer_zcash_win\bin\round1.bin", + +@"\optiminer_zcash_win\bin\round2.bin", + +@"\optiminer_zcash_win\bin\round3.bin", + +@"\optiminer_zcash_win\bin\round4.bin", + +@"\optiminer_zcash_win\bin\round5.bin", + +@"\optiminer_zcash_win\bin\round6.bin", + +@"\optiminer_zcash_win\bin\round7.bin", + +@"\optiminer_zcash_win\bin\round8.bin", + +@"\optiminer_zcash_win\bin\round9.bin", + +@"\optiminer_zcash_win\bin\xFiji_asm.bin", + +@"\optiminer_zcash_win\bin\xFiji_base.bin", + +@"\optiminer_zcash_win\bin\xFiji_round1.bin", + +@"\optiminer_zcash_win\bin\xFiji_round2.bin", + +@"\optiminer_zcash_win\bin\xFiji_round3.bin", + +@"\optiminer_zcash_win\bin\xFiji_round4.bin", + +@"\optiminer_zcash_win\bin\xFiji_round5.bin", + +@"\optiminer_zcash_win\bin\xFiji_round6.bin", + +@"\optiminer_zcash_win\bin\xFiji_round7.bin", + +@"\optiminer_zcash_win\bin\xFiji_round8.bin", + +@"\optiminer_zcash_win\bin\xFiji_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Bonaire_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Carrizo_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Fiji_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Hawaii_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Iceland_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Kalindi_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Mullins_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Spectre_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Spooky_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Tonga_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Bonaire_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Carrizo_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Fiji_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Hawaii_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Iceland_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Kalindi_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Mullins_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Spectre_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Spooky_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Stoney_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Tonga_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Baffin_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Bonaire_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Carrizo_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Ellesmere_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Fiji_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Hawaii_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Iceland_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Kalindi_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Mullins_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Spectre_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Spooky_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Stoney_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Tonga_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Baffin_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Bonaire_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Carrizo_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Ellesmere_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Fiji_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Hawaii_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Iceland_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Kalindi_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Mullins_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Spectre_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Spooky_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Stoney_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Tonga_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Baffin_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Bonaire_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Carrizo_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Ellesmere_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Fiji_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Hawaii_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Iceland_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Kalindi_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Mullins_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Spectre_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Spooky_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Stoney_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Tonga_round9.bin", + +}; + #endregion //CODE_GEN STUFF // listFiles.py + } +} + diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 2699179..de010c8 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -20,7 +20,7 @@ public static class MinersDownloadManager { "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_3_12.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_4_0.zip", "bins_3rdparty.zip", "bin_3rdparty"); From b31a5735c82f235ad208fabb7b81d9e17f1134f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 15:19:08 +0100 Subject: [PATCH 194/366] remove sgminer-gm support (return when compatible) --- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 2a89072..0462bed 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -44,7 +44,7 @@ public static class MinerPaths public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; public const string sgminer_5_5_0_general = _bin + @"\sgminer-5-5-0-general\sgminer.exe"; public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; - public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; // open source miner + //public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; // open source miner /// /// nheqminer @@ -181,9 +181,9 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i return MinerPaths.sgminer_5_1_1_optimized; } } - if (AlgorithmType.CryptoNight == type /*|| AlgorithmType.DaggerHashimoto == type*/) { - return MinerPaths.sgminer_gm; - } + //if (AlgorithmType.CryptoNight == type /*|| AlgorithmType.DaggerHashimoto == type*/) { + // return MinerPaths.sgminer_gm; + //} return MinerPaths.sgminer_5_5_0_general; } From 188f84de99e17b552b036c904711349f6b3cb56a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 16:35:58 +0100 Subject: [PATCH 195/366] reodrer 3rd party miner TOS, rename form, fix 3rdparty algorithms when toggle --- NiceHashMiner/Devices/ComputeDevice.cs | 29 +++++++++++++++++++ NiceHashMiner/Devices/ComputeDeviceManager.cs | 7 +++++ NiceHashMiner/Devices/GroupAlgorithms.cs | 16 ++++++++-- ...igner.cs => Form_3rdParty_TOS.Designer.cs} | 2 +- ...rm_ClaymoreTOS.cs => Form_3rdParty_TOS.cs} | 11 +++++-- ...laymoreTOS.resx => Form_3rdParty_TOS.resx} | 0 NiceHashMiner/Forms/Form_Main.cs | 18 +++++++----- NiceHashMiner/Forms/Form_Settings.cs | 4 ++- NiceHashMiner/NiceHashMiner.csproj | 10 +++---- 9 files changed, 78 insertions(+), 19 deletions(-) rename NiceHashMiner/Forms/{Form_ClaymoreTOS.Designer.cs => Form_3rdParty_TOS.Designer.cs} (99%) rename NiceHashMiner/Forms/{Form_ClaymoreTOS.cs => Form_3rdParty_TOS.cs} (66%) rename NiceHashMiner/Forms/{Form_ClaymoreTOS.resx => Form_3rdParty_TOS.resx} (100%) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 4df87f4..2e076d4 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -125,6 +125,34 @@ public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { } } + public void _3rdPartyMinerChange() { + var TmpAlgorithmSettings = GroupAlgorithms.CreateForDevice(this); + // check to remove + { + List toRemoveKeys = new List(); + foreach (var containsKey in AlgorithmSettings.Keys) { + if (TmpAlgorithmSettings.ContainsKey(containsKey) == false) { + toRemoveKeys.Add(containsKey); + } + } + foreach (var removeKey in toRemoveKeys) { + AlgorithmSettings.Remove(removeKey); + } + } + // check to add + { + List toAddKeys = new List(); + foreach (var containsKey in TmpAlgorithmSettings.Keys) { + if (AlgorithmSettings.ContainsKey(containsKey) == false) { + toAddKeys.Add(containsKey); + } + } + foreach (var addKey in toAddKeys) { + AlgorithmSettings.Add(addKey, TmpAlgorithmSettings[addKey]); + } + } + } + #region Config Setters/Getters // settings // setters @@ -135,6 +163,7 @@ public void SetFromComputeDeviceConfig(ComputeDeviceConfig config) { } public void SetAlgorithmDeviceConfig(DeviceBenchmarkConfig config) { if (config != null && config.DeviceUUID == UUID && config.AlgorithmSettings != null) { + this.AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); foreach (var algoSetting in config.AlgorithmSettings) { AlgorithmType key = algoSetting.Key; AlgorithmConfig conf = algoSetting.Value; diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index f826583..9830ef3 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -859,6 +859,13 @@ public static List GetSameDevicesTypeAsDeviceWithUUID(string uuid public static ComputeDevice GetCurrentlySelectedComputeDevice(int index, bool unique) { return AllAvaliableDevices[index]; } + + //////////// + public static void ResetAvaliableAlgorithmsForDevice() { + foreach (var dev in AllAvaliableDevices) { + dev._3rdPartyMinerChange(); + } + } } public static class Group { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 84ced08..c341ccb 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -1,4 +1,5 @@ -using NiceHashMiner.Enums; +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; using System; using System.Collections.Generic; using System.Text; @@ -65,6 +66,16 @@ public static Dictionary CreateForDevice(ComputeDevice algoSettings.Remove(AlgorithmType.NeoScrypt); } } + + // check if 3rd party is enabled and allow 3rd party only algos + if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES == false) { + List _3rdPartyOnlyAlgos = new List() { AlgorithmType.CryptoNight }; + foreach (var algoType in _3rdPartyOnlyAlgos) { + if (algoSettings.ContainsKey(algoType)) { + algoSettings.Remove(algoType); + } + } + } } // check if it is Etherum capable @@ -121,8 +132,7 @@ private static Dictionary CreateDefaultsForGroup(Devic { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") - { ExtraLaunchParameters = "--rawintensity 512 -w 4 -g 2" + AmdGpuDevice.TemperatureParam } }, + { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, // for now only 3rd party support { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; } diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.Designer.cs b/NiceHashMiner/Forms/Form_3rdParty_TOS.Designer.cs similarity index 99% rename from NiceHashMiner/Forms/Form_ClaymoreTOS.Designer.cs rename to NiceHashMiner/Forms/Form_3rdParty_TOS.Designer.cs index b9c398b..3dd6ebb 100644 --- a/NiceHashMiner/Forms/Form_ClaymoreTOS.Designer.cs +++ b/NiceHashMiner/Forms/Form_3rdParty_TOS.Designer.cs @@ -1,5 +1,5 @@ namespace NiceHashMiner.Forms { - partial class Form_ClaymoreTOS { + partial class Form_3rdParty_TOS { /// /// Required designer variable. /// diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs b/NiceHashMiner/Forms/Form_3rdParty_TOS.cs similarity index 66% rename from NiceHashMiner/Forms/Form_ClaymoreTOS.cs rename to NiceHashMiner/Forms/Form_3rdParty_TOS.cs index 7579e31..9711b33 100644 --- a/NiceHashMiner/Forms/Form_ClaymoreTOS.cs +++ b/NiceHashMiner/Forms/Form_3rdParty_TOS.cs @@ -1,4 +1,5 @@ using NiceHashMiner.Configs; +using NiceHashMiner.Devices; using NiceHashMiner.Enums; using System; using System.Collections.Generic; @@ -9,23 +10,29 @@ using System.Windows.Forms; namespace NiceHashMiner.Forms { - public partial class Form_ClaymoreTOS : Form { - public Form_ClaymoreTOS() { + public partial class Form_3rdParty_TOS : Form { + public Form_3rdParty_TOS() { InitializeComponent(); + // TODO update 3rd party TOS this.Text = International.GetText("Form_Main_3rdParty_Title"); this.label_Tos.Text = International.GetText("Form_Main_3rdParty_Text"); this.button_Agree.Text = International.GetText("Form_Main_3rdParty_Button_Agree_Text"); this.button_Decline.Text = International.GetText("Form_Main_3rdParty_Button_Refuse_Text"); } + private void button_Agree_Click(object sender, EventArgs e) { ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; + // update devices algorithm settings because some algos are supported only by 3rd party miners + ComputeDeviceManager.Avaliable.ResetAvaliableAlgorithmsForDevice(); this.Close(); } private void button_Decline_Click(object sender, EventArgs e) { ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + // update devices algorithm settings because some algos are supported only by 3rd party miners + ComputeDeviceManager.Avaliable.ResetAvaliableAlgorithmsForDevice(); this.Close(); } } diff --git a/NiceHashMiner/Forms/Form_ClaymoreTOS.resx b/NiceHashMiner/Forms/Form_3rdParty_TOS.resx similarity index 100% rename from NiceHashMiner/Forms/Form_ClaymoreTOS.resx rename to NiceHashMiner/Forms/Form_3rdParty_TOS.resx diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 4535c1b..5e372d5 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -205,6 +205,16 @@ private void StartupTimer_Tick(object sender, EventArgs e) { return; } + // 3rdparty miners check scope #1 + { + // check if setting set + if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.NOT_SET) { + // Show TOS + Form tos = new Form_3rdParty_TOS(); + tos.ShowDialog(this); + } + } + // Query Avaliable ComputeDevices ComputeDeviceManager.Query.QueryDevices(LoadingScreen); _isDeviceDetectionInitialized = true; @@ -328,14 +338,8 @@ private void StartupTimer_Tick(object sender, EventArgs e) { ConfigManager.GeneralConfigFileCommit(); } } - // 3rdparty miners check scope + // 3rdparty miners check scope #2 { - // check if setting set - if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.NOT_SET) { - // Show TOS - Form tos = new Form_ClaymoreTOS(); - tos.ShowDialog(this); - } // check if download needed if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { if (!MinersExistanceChecker.IsMiners3rdPartyBinsInit() && !ConfigManager.GeneralConfig.DownloadInit3rdParty) { diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 91489b3..d58a607 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -711,11 +711,13 @@ private void checkBox_Use3rdPartyMiners_CheckedChanged(object sender, EventArgs if (!_isInitFinished) return; if (this.checkBox_Use3rdPartyMiners.Checked) { // Show TOS - Form tos = new Form_ClaymoreTOS(); + Form tos = new Form_3rdParty_TOS(); tos.ShowDialog(this); this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; } else { ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; + // update devices algorithm settings because some algos are supported only by 3rd party miners + ComputeDeviceManager.Avaliable.ResetAvaliableAlgorithmsForDevice(); } } diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 9282521..dbb90ae 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -171,11 +171,11 @@ Form_ChooseLanguage.cs - + Form - - Form_ClaymoreTOS.cs + + Form_3rdParty_TOS.cs Form @@ -298,8 +298,8 @@ Form_ChooseLanguage.cs - - Form_ClaymoreTOS.cs + + Form_3rdParty_TOS.cs Form_Settings.cs From 4ba330f62b46bd6d2280edef3c7924dc01de4d69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 16:49:35 +0100 Subject: [PATCH 196/366] add option to choose claymore or optminer (default claymore, first 3rdparty miner) --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 2 ++ NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs | 10 ++++++++++ NiceHashMiner/Miners/Grouping/MinerPaths.cs | 8 +++++--- NiceHashMiner/NiceHashMiner.csproj | 1 + 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index f8db2e4..0cb5ec0 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -58,6 +58,7 @@ public class GeneralConfig { // 3rd party miners public Use3rdPartyMiners Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; public bool DownloadInit3rdParty = false; + public AMD_Equihash_3rdParty AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; public bool AllowMultipleInstances = true; @@ -106,6 +107,7 @@ public void SetDefaults() { Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; DownloadInit3rdParty = false; AllowMultipleInstances = true; + AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; } public void FixSettingBounds() { diff --git a/NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs b/NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs new file mode 100644 index 0000000..3602b40 --- /dev/null +++ b/NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Enums { + public enum AMD_Equihash_3rdParty { + Claymore = 0, + Optminer + } +} diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 0462bed..a816bcc 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -95,9 +95,11 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { return MinerPaths.eqm; } else if(deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state - // TODO add settings to choose what miner to use, or to automatically determine what to use - return MinerPaths.ClaymoreZcashMiner; - //return MinerPaths.OptiminerZcashMiner; + if (ConfigManager.GeneralConfig.AMD_Equihash_3rdParty == AMD_Equihash_3rdParty.Claymore) { + return MinerPaths.ClaymoreZcashMiner; + } else { + return MinerPaths.OptiminerZcashMiner; + } } else { // supports all DeviceTypes return MinerPaths.nheqminer; diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index dbb90ae..62719c1 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -103,6 +103,7 @@ + From 9b1117da2e3e2f95e63ac47ea77f93a9d9a06418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 17:17:43 +0100 Subject: [PATCH 197/366] add ClaymoreCryptoNight extra params parsing --- NiceHashMiner/Enums/MinerOptionType.cs | 19 +++++++++++++++- .../Parsing/ExtraLaunchParametersParser.cs | 22 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 6c5f27e..1a67763 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -66,6 +66,23 @@ public enum MinerOptionType { ClaymoreZcash_mclock, ClaymoreZcash_powlim, ClaymoreZcash_cvddc, - ClaymoreZcash_mvddc + ClaymoreZcash_mvddc, + // ClaymoreCryptoNight + ClaymoreCryptoNight_a, + ClaymoreCryptoNight_wd, + ClaymoreCryptoNight_r, + ClaymoreCryptoNight_nofee, + ClaymoreCryptoNight_li, + ClaymoreCryptoNight_tt, // -tt + ClaymoreCryptoNight_ttli, // not present? + ClaymoreCryptoNight_tstop, + ClaymoreCryptoNight_fanmax, + ClaymoreCryptoNight_fanmin, + ClaymoreCryptoNight_cclock, + ClaymoreCryptoNight_mclock, + ClaymoreCryptoNight_powlim, + ClaymoreCryptoNight_cvddc, + ClaymoreCryptoNight_mvddc, + } } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index cf49d43..bdc347f 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -108,6 +108,26 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.ClaymoreZcash_cvddc , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption(MinerOptionType.ClaymoreZcash_mvddc , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), }; + // Zcash cryptonight + private static List _Claymore_cryptonight_Options = new List() { + new MinerOption(MinerOptionType.ClaymoreCryptoNight_a , "-a", "-a", "0", MinerOptionFlagType.MultiParam, ""), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_wd , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), + //new MinerOption(MinerOptionType.ClaymoreCryptoNight_r , , , , MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_nofee , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_li , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), + // temperature stuff + //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all + new MinerOption(MinerOptionType.ClaymoreCryptoNight_tt , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), + //new MinerOption(MinerOptionType.ClaymoreCryptoNight_ttli , "-ttli", "-ttli", "70", MinerOptionFlagType.SingleParam, ","), // no such param + new MinerOption(MinerOptionType.ClaymoreCryptoNight_tstop , "-tstop", "-tstop", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_fanmax , "-fanmax", "-fanmax", "100", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_fanmin , "-fanmin", "-fanmin", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_cclock , "-cclock", "-cclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_mclock , "-mclock", "-mclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_powlim , "-powlim", "-powlim", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_cvddc , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_mvddc , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), + }; private static bool _showLog = true; @@ -349,6 +369,8 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith } else if (deviceType == DeviceType.AMD) { return Parse(cdevs_mappings, _oclEthminerOptions); } + } else if (minerPath == MinerPaths.ClaymoreCryptoNightMiner) { + return Parse(MiningPairs, _Claymore_cryptonight_Options); } else if (deviceCheckSkip == false) { // parse for device if (deviceType == DeviceType.CPU) { From 9acfe05c9dc5f70f27c62faca775e15e61345177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 17:37:43 +0100 Subject: [PATCH 198/366] add Optiminer extra params to parser update parser to new case --- NiceHashMiner/Enums/MinerOptionFlagType.cs | 3 ++- NiceHashMiner/Enums/MinerOptionType.cs | 5 +++++ .../Miners/Equihash/OptiminerZcashMiner.cs | 3 +-- .../Parsing/ExtraLaunchParametersParser.cs | 16 ++++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Enums/MinerOptionFlagType.cs b/NiceHashMiner/Enums/MinerOptionFlagType.cs index ca735e3..fdfc755 100644 --- a/NiceHashMiner/Enums/MinerOptionFlagType.cs +++ b/NiceHashMiner/Enums/MinerOptionFlagType.cs @@ -7,6 +7,7 @@ namespace NiceHashMiner.Enums { public enum MinerOptionFlagType { Uni, SingleParam, - MultiParam + MultiParam, + DuplicateMultiParam // the flag is multiplied } } diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 1a67763..5776bfe 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -83,6 +83,11 @@ public enum MinerOptionType { ClaymoreCryptoNight_powlim, ClaymoreCryptoNight_cvddc, ClaymoreCryptoNight_mvddc, + // Optiminer + Optiminer_ForceGenericKernel, + Optiminer_ExperimentalKernel, + Optiminer_nodevfee, + Optiminer_i, } } diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs index 861076a..8dda976 100644 --- a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -63,8 +63,7 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { } protected override string GetDevicesCommandString() { - // TODO add - string extraParams = ""; //ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); + string extraParams = ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); string deviceStringCommand = " -c " + ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; deviceStringCommand += " -d "; List ids = new List(); diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index bdc347f..c457faa 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -128,6 +128,13 @@ static class ExtraLaunchParametersParser { new MinerOption(MinerOptionType.ClaymoreCryptoNight_cvddc , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption(MinerOptionType.ClaymoreCryptoNight_mvddc , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), }; + // Zcash Optiminer + private static List _OptiminerZcash_Options = new List() { + new MinerOption(MinerOptionType.Optiminer_ForceGenericKernel , "", "--force-generic-kernel", null, MinerOptionFlagType.Uni, ""), + new MinerOption(MinerOptionType.Optiminer_ExperimentalKernel , "", "--experimental-kernel", null, MinerOptionFlagType.Uni, ""), + new MinerOption(MinerOptionType.Optiminer_nodevfee , "", "--nodevfee", null, MinerOptionFlagType.Uni, ""), + new MinerOption(MinerOptionType.Optiminer_i , "-i", "--intensity", "0", MinerOptionFlagType.DuplicateMultiParam, ""), + }; private static bool _showLog = true; @@ -296,6 +303,13 @@ private static string Parse(List MiningPairs, List opti MASK = " {0}{1}"; } retVal += String.Format(MASK, option.LongName, setValue); + } else if (option.FlagType == MinerOptionFlagType.DuplicateMultiParam) { + List values = new List(); + string MASK = " {0} {1}"; + foreach (var pair in MiningPairs) { + values.Add(String.Format(MASK, option.LongName, cdevOptions[pair.Device.UUID][option.Type])); + } + retVal += " " + StringHelper.Join(" ", values); } } } @@ -371,6 +385,8 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith } } else if (minerPath == MinerPaths.ClaymoreCryptoNightMiner) { return Parse(MiningPairs, _Claymore_cryptonight_Options); + } else if (minerPath == MinerPaths.OptiminerZcashMiner) { + return Parse(MiningPairs, _OptiminerZcash_Options); } else if (deviceCheckSkip == false) { // parse for device if (deviceType == DeviceType.CPU) { From 7e775fc5ae594370c752bf45bf80cf1727c26303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 17:39:09 +0100 Subject: [PATCH 199/366] fix Optiminer device command string generation --- NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs index 8dda976..214d568 100644 --- a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -65,10 +65,10 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { protected override string GetDevicesCommandString() { string extraParams = ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); string deviceStringCommand = " -c " + ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; - deviceStringCommand += " -d "; + deviceStringCommand += " "; List ids = new List(); foreach (var mPair in MiningSetup.MiningPairs) { - ids.Add(mPair.Device.ID.ToString()); + ids.Add("-d " + mPair.Device.ID.ToString()); } deviceStringCommand += StringHelper.Join(" ", ids); From d562e56a18fb36596855648d6f5f31ee5567d923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 18:00:51 +0100 Subject: [PATCH 200/366] fix grouping logic --- NiceHashMiner/Miners/Grouping/GroupingLogic.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index 8701446..a588492 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -34,7 +34,7 @@ public static bool IsEquihashGroupLogic(string minerPath, MiningPair a, MiningPa // nheqmnier else if (MinerPaths.nheqminer == minerPath) { return Is_nheqminer(a, b); - } else if (MinerPaths.ClaymoreZcashMiner == minerPath) { + } else if (MinerPaths.ClaymoreZcashMiner == minerPath || MinerPaths.OptiminerZcashMiner == minerPath) { return true; } return false; From 83c3337496499d198a633f6865a4a49f3087727a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 11 Jan 2017 18:47:37 +0100 Subject: [PATCH 201/366] fix claymore thred time exit issue. fixed time under 60seconds WORKS! longer times undefined behavioure --- NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 13 +++++++++++-- NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs | 5 +++-- NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index 5ba2926..ad3c4b9 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -16,7 +16,7 @@ namespace NiceHashMiner.Miners { public abstract class ClaymoreBaseMiner : Miner { - protected int benchmarkTimeWait = 60; + const int benchmarkTimeWait = 45; // if this is larger then welcome to hell!!! keep this fixed int benchmark_read_count = 0; double benchmark_sum = 0.0d; protected readonly string LOOK_FOR_START; @@ -111,6 +111,14 @@ protected override void _Stop(MinerStopType willswitch) { Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } + private bool IsActiveProcess(int pid) { + try { + return Process.GetProcessById(pid) != null; + } catch { + return false; + } + } + protected override string GetDevicesCommandString() { string extraParams = ExtraLaunchParametersParser.ParseForMiningSetup(MiningSetup, DeviceType.AMD); @@ -138,6 +146,7 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { Helpers.ConsolePrint("BENCHMARK", "Benchmark starts"); Helpers.ConsolePrint(MinerTAG(), "Benchmark should end in : " + benchmarkTimeWait + " seconds"); BenchmarkHandle = BenchmarkStartProcess((string)CommandLine); + BenchmarkHandle.WaitForExit(benchmarkTimeWait + 2); Stopwatch _benchmarkTimer = new Stopwatch(); _benchmarkTimer.Reset(); _benchmarkTimer.Start(); @@ -148,7 +157,7 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { // don't use wait for it breaks everything BenchmarkProcessStatus = BenchmarkProcessStatus.Running; bool keepRunning = true; - while (keepRunning) { + while (keepRunning && IsActiveProcess(BenchmarkHandle.Id)) { //string outdata = BenchmarkHandle.StandardOutput.ReadLine(); //BenchmarkOutputErrorDataReceivedImpl(outdata); // terminate process situations diff --git a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs index 5d4444f..057f0fc 100644 --- a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs @@ -30,8 +30,9 @@ public override void Start(string url, string btcAdress, string worker) { protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { // clean old logs CleanAllOldLogs(); - benchmarkTimeWait = time; - //benchmarkTimeWait = 30; // when debugging + //benchmarkTimeWait = time; + ////benchmarkTimeWait = 180; + ////benchmarkTimeWait = 30; // when debugging // network workaround var nhAlgorithmData = Globals.NiceHashData[algorithm.NiceHashID]; diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 0cea491..e79ebaa 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -32,7 +32,7 @@ public override void Start(string url, string btcAdress, string worker) { protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { // clean old logs CleanAllOldLogs(); - benchmarkTimeWait = time / 3; // 3 times faster than sgminer + //benchmarkTimeWait = time / 3; // 3 times faster than sgminer //benchmarkTimeWait = 30; // when debugging string ret = " -benchmark 1 " + GetDevicesCommandString(); From ed70759f771cda7ee3280df14ad3166716b0e222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 13 Jan 2017 00:36:38 +0100 Subject: [PATCH 202/366] fix CPU load when benchmarking with sgminer and claymore miners --- NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 4 ++++ NiceHashMiner/Miners/sgminer.cs | 3 +++ 2 files changed, 7 insertions(+) diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index ad3c4b9..8ee8674 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -183,7 +183,11 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { } keepRunning = false; break; + } else { + // wait a second reduce CPU load + Thread.Sleep(1000); } + } } catch (Exception ex) { BenchmarkAlgorithm.BenchmarkSpeed = 0; diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index c5dd761..33f56d7 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -251,6 +251,9 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { if (BenchmarkSignalFinnished) { break; } + } else { + // wait a second reduce CPU load + Thread.Sleep(1000); } } } catch (Exception ex) { From b7b0b36c284a5cdab5222a152842c18a06907d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 13 Jan 2017 13:58:33 +0100 Subject: [PATCH 203/366] restart claymore if reporting negative speeds --- NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 5 +++++ NiceHashMiner/Miners/Miner.cs | 11 +++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index 8ee8674..e1d4e21 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -91,6 +91,11 @@ public override APIData GetSummary() { if (ad.Speed == 0) { _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; } + // some clayomre miners have this issue reporting negative speeds in that case restart miner + if (ad.Speed < 0) { + Helpers.ConsolePrint(this.MinerTAG(), "Reporting negative speeds will restart..."); + this.Restart(); + } } return ad; diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 5746501..135e120 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -567,13 +567,16 @@ protected void StartCoolDownTimerChecker() { virtual protected void Miner_Exited() { // TODO make miner restart in 5 seconds //Stop(MinerStopType.END, true); - var RestartInMS = ConfigManager.GeneralConfig.MinerRestartDelayMS > 5000 ? - ConfigManager.GeneralConfig.MinerRestartDelayMS : 5000; + ScheduleRestart(5000); + } + + protected void ScheduleRestart(int ms) { + var RestartInMS = ConfigManager.GeneralConfig.MinerRestartDelayMS > ms ? + ConfigManager.GeneralConfig.MinerRestartDelayMS : ms; Helpers.ConsolePrint(MinerTAG(), ProcessTag() + String.Format(" Miner_Exited Will restart in {0} ms", RestartInMS)); _currentMinerReadStatus = MinerAPIReadStatus.RESTART; NeedsRestart = true; _currentCooldownTimeInSecondsLeft = RestartInMS; - } protected abstract bool UpdateBindPortCommand(int oldPort, int newPort); @@ -590,7 +593,7 @@ protected bool UpdateBindPortCommand_ccminer_cpuminer(int oldPort, int newPort) return false; } - private void Restart() { + protected void Restart() { if (!isEnded) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Restarting miner.."); Stop(MinerStopType.END); // stop miner first From c51e0cd3cf061731baa09e33209e92b36072d43a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 17 Jan 2017 17:52:28 +0100 Subject: [PATCH 204/366] check accepted shares for worker, update claymore params, update system env vars --- NiceHashMiner/Enums/MinerOptionType.cs | 1 + NiceHashMiner/Forms/Form_Main.cs | 16 +++- .../Interfaces/IMainFormRatesComunication.cs | 1 + NiceHashMiner/Links.cs | 2 + NiceHashMiner/Miners/MiningSession.cs | 20 ++++- .../Parsing/ExtraLaunchParametersParser.cs | 2 + NiceHashMiner/NiceHashStats.cs | 76 +++++++++++++++++++ NiceHashMiner/langs/en.lang | 1 + NiceHashMiner/langs/ru.lang | 1 + 9 files changed, 118 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 5776bfe..72ee38b 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -52,6 +52,7 @@ public enum MinerOptionType { CUDA_Solver_Mode, // -cm // ClaymoreZcash ClaymoreZcash_a, + ClaymoreZcash_asm, ClaymoreZcash_i, // -i ClaymoreZcash_wd, // -wd ClaymoreZcash_r, diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 5e372d5..355649a 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -622,7 +622,7 @@ void SetEnvironmentVariables() string[] envName = { "GPU_MAX_ALLOC_PERCENT", "GPU_USE_SYNC_OBJECTS", "GPU_SINGLE_ALLOC_PERCENT", "GPU_MAX_HEAP_SIZE", "GPU_FORCE_64BIT_PTR" }; - string[] envValue = { "100", "1", "100", "100", "0" }; + string[] envValue = { "100", "1", "100", "100", "1" }; for (int i = 0; i < envName.Length; i++) { @@ -737,6 +737,20 @@ private void buttonSettings_Click(object sender, EventArgs e) } + private bool isRaiseAlertSharesNotAcceptedShown = false; + public void RaiseAlertSharesNotAccepted(string algoName) { + if (!isRaiseAlertSharesNotAcceptedShown) { + isRaiseAlertSharesNotAcceptedShown = true; + + MessageBox.Show(String.Format(International.GetText("Form_Main_Accepted_Speed_Zero"), alg), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.OK, MessageBoxIcon.Warning); + + isRaiseAlertSharesNotAcceptedShown = false; + } + } + + private void buttonStartMining_Click(object sender, EventArgs e) { IsManuallyStarted = true; if (StartMining(true) == false) { diff --git a/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs b/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs index 33b0d0b..dbf10f4 100644 --- a/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs +++ b/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs @@ -9,5 +9,6 @@ public interface IMainFormRatesComunication { void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPIData, double paying, bool isApiGetException); void ShowNotProfitable(string msg); void HideNotProfitable(); + void RaiseAlertSharesNotAccepted(string algoName); } } diff --git a/NiceHashMiner/Links.cs b/NiceHashMiner/Links.cs index 731c7f2..5bbca97 100644 --- a/NiceHashMiner/Links.cs +++ b/NiceHashMiner/Links.cs @@ -19,6 +19,8 @@ public static class Links { public static string NHM_API_stats = "https://www.nicehash.com/api?method=stats.provider&addr="; public static string NHM_API_info = "https://www.nicehash.com/api?method=simplemultialgo.info"; public static string NHM_API_version = "https://www.nicehash.com/nicehashminer?method=version"; + public static string NHM_API_stats_provider_workers = "https://www.nicehash.com/api?method=stats.provider.workers&addr="; + // device profits public static string NHM_Profit_Check = "https://www.nicehash.com/?utm_source=NHM&p=calc&name="; } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 89741f7..d524e96 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -42,6 +42,8 @@ public class MiningSession { private Timer _preventSleepTimer; // check internet connection private Timer _internetCheckTimer; + // check local and web stats per algo + private Timer _checkWorkerStats; public bool IsMiningEnabled { @@ -82,7 +84,12 @@ public MiningSession(List devices, // set internet checking _internetCheckTimer = new Timer(); _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; - _internetCheckTimer.Interval = 1000 * 1; // every minute + _internetCheckTimer.Interval = 1 * 1000 * 60; // every minute + + // check worker stats + _checkWorkerStats = new Timer(); + _checkWorkerStats.Elapsed += _checkWorkerStats_Elapsed; + _checkWorkerStats.Interval = 5 * 1000 * 60; // every 5 minutes // assume profitable IsProfitable = true; @@ -92,11 +99,21 @@ public MiningSession(List devices, if (IsMiningEnabled) { _preventSleepTimer.Start(); _internetCheckTimer.Start(); + _checkWorkerStats.Start(); } IsMiningRegardlesOfProfit = ConfigManager.GeneralConfig.MinimumProfit == 0; } + void _checkWorkerStats_Elapsed(object sender, ElapsedEventArgs e) { + foreach (var groupMiner in _runningGroupMiners.Values) { + var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); + if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { + _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(groupMiner.AlgorithmType)); + } + } + } + #region Timers stuff private void InternetCheckTimer_Tick(object sender, EventArgs e) { if (ConfigManager.GeneralConfig.IdleWhenNoInternetAccess) { @@ -134,6 +151,7 @@ public void StopAllMiners() { // restroe/enable sleep _preventSleepTimer.Stop(); _internetCheckTimer.Stop(); + _checkWorkerStats.Stop(); Helpers.AllowMonitorPowerdownAndSleep(); // delete generated bin files diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index c457faa..8a8ef8a 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -90,6 +90,8 @@ static class ExtraLaunchParametersParser { // Zcash claymore private static List _ClaymoreZcash_Options = new List() { new MinerOption(MinerOptionType.ClaymoreZcash_a , "-a", "-a", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_asm , "-asm", "-asm", "1", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreZcash_i , "-i", "-i", "6", MinerOptionFlagType.MultiParam, ","), new MinerOption(MinerOptionType.ClaymoreZcash_wd , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), //new MinerOption(MinerOptionType.ClaymoreZcash_r , , , , MinerOptionFlagType.MultiParam, ","), diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index 5722199..f88d3e6 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -7,6 +7,7 @@ using Newtonsoft.Json; using NiceHashMiner.Enums; using NiceHashMiner.Miners; +using Newtonsoft.Json.Linq; @@ -67,6 +68,11 @@ class nicehash_json public string method; } + class nicehash_json_T { + public T result; + public string method; + } + class nicehash_error { public string error; @@ -77,6 +83,28 @@ class nicehashminer_version { public string version; } + + class nicehash_workers_algo_stats { + public string addr; + public AlgorithmType algo; + public List> workers; + } + class nicehash_worker_algo_stats_H { + public string workerName; + public Dictionary speedsStatus; + public int timeConnected; + public int xnsub; + public double difficulty; + public int serviceLocation; + } + public class nicehash_worker_algo_stats { + public nicehash_worker_algo_stats(AlgorithmType t) { + type = t; + } + public readonly AlgorithmType type = AlgorithmType.NONE; + public double accepted = 0; + public double rejected = 0; + } #pragma warning restore 649 @@ -105,6 +133,54 @@ public static Dictionary GetAlgorithmRates(string wo } } + public static nicehash_worker_algo_stats GetWorkerAlgorithmAcceptedSpeeds(string btc, AlgorithmType algo, string worker) { + string args = String.Format("{0}&algo={1}", btc, (int)algo); + string r1 = GetNiceHashAPIData(Links.NHM_API_stats_provider_workers + args, worker); + if (r1 == null) return null; + + List ret = new List(); + nicehash_worker_algo_stats retEl = new nicehash_worker_algo_stats(algo); + nicehash_json_T nhjson_current; + try { + nhjson_current = JsonConvert.DeserializeObject>(r1, Globals.JsonSettings); + List all = new List(); + foreach (var worker_stat in nhjson_current.result.workers) { + if (worker_stat.Count >= 6) { + nicehash_worker_algo_stats_H tmp = new nicehash_worker_algo_stats_H(); + tmp.workerName = worker_stat[0] as string; + { + var toConv = worker_stat[1] as JObject; // Dictionary; + tmp.speedsStatus = new Dictionary(); + foreach (var pair in toConv) { + tmp.speedsStatus.Add(pair.Key, Helpers.ParseDouble(pair.Value.ToString())); + } + } + // other stuff don't care + //tmp.timeConnected = (int)worker_stat[2]; + //tmp.xnsub = (int)worker_stat[3]; + //tmp.difficulty = (double)worker_stat[4]; + //tmp.serviceLocation = (int)worker_stat[5]; + if (tmp.workerName == worker) { + ret.Add(tmp); + } + } + } + if (ret.Count > 0) { + var first = ret[0]; + if (first.speedsStatus.ContainsKey("a")) { + retEl.accepted = first.speedsStatus["a"]; + } + if (first.speedsStatus.ContainsKey("rs")) { + retEl.rejected = first.speedsStatus["rs"]; + } + } + + return retEl; + } catch { + return null; + } + } + public static nicehash_stats GetStats(string btc, int algo, string worker) { diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 735b314..849bec2 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -337,5 +337,6 @@ "Form_Main_StartMiningReturnedFalse": "NiceHash Miner cannot start mining. Make sure you have at least one enabled device that has at least one enabled and benchmarked algorithm.", "Program_WMI_Error_Text": "NiceHash Miner cannot run needed components. It seems that your system has Windows Management Instrumentation service Disabled. In order for NiceHash Miner to work properly Windows Management Instrumentation service needs to be Enabled. This service is needed to detect RAM usage and Avaliable Video controler information. Enable Windows Management Instrumentation service manually and start NiceHash Miner.", "Program_WMI_Error_Title": "Windows Management Instrumentation Error", + "Form_Main_Accepted_Speed_Zero" : "Warning! Algorithm {0} is reporting 0 shares accepted. Please disable this algorithm in Benchmark/Settings and report this issue to support@nicehash.com!" } } diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index b5e7ec0..b83bec1 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -337,5 +337,6 @@ "Form_Main_StartMiningReturnedFalse": "NiceHashMiner не может начать майнинг. Убедитесь, что хотя-бы одно устройство включено с хотя-бы одним включенным и прошедшим бенчмарк алгоритмом", "Program_WMI_Error_Text": "NiceHash Miner не может запустить необходимые компоненты. Похоже, что в вашей системе отключен сервис Инструментарий управления Windows. Для корректной работы NiceHash Miner, сервис Инструментарий управления Windows должен быть включен. Этот сервис нужен для определения использования RAM и доступной информации видеоконтроллера. Включите сервис Инструментарий управления Windows вручную и запустите NiceHash Miner.", "Program_WMI_Error_Title": "Ошибка Инструментария управления Windows", + "Form_Main_Accepted_Speed_Zero" : "Warning! Algorithm {0} is reporting 0 shares accepted. Please disable this algorithm in Benchmark/Settings and report this issue to support@nicehash.com!" } } \ No newline at end of file From ed656eed053578267aff1cf68ba41daaac0f6fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 17 Jan 2017 18:07:12 +0100 Subject: [PATCH 205/366] update 3rd party file checker --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs | 395 ++++++++++++++++++++++-- 2 files changed, 374 insertions(+), 23 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 355649a..911461e 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -742,7 +742,7 @@ public void RaiseAlertSharesNotAccepted(string algoName) { if (!isRaiseAlertSharesNotAcceptedShown) { isRaiseAlertSharesNotAcceptedShown = true; - MessageBox.Show(String.Format(International.GetText("Form_Main_Accepted_Speed_Zero"), alg), + MessageBox.Show(String.Format(International.GetText("Form_Main_Accepted_Speed_Zero"), algoName), International.GetText("Warning_with_Exclamation"), MessageBoxButtons.OK, MessageBoxIcon.Warning); diff --git a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs index eade245..567e04c 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs @@ -4,6 +4,7 @@ public static class Bins_Data_3rd { #region CODE_GEN STUFF // listFiles.py public static string[] ALL_FILES_BINS = { + @"\claymore_cryptonight\Data.bin", @"\claymore_cryptonight\msvcr110.dll", @@ -14,6 +15,18 @@ public static class Bins_Data_3rd { @"\claymore_zcash\Data.bin", +@"\claymore_zcash\Data1a1.bin", + +@"\claymore_zcash\Data1b1.bin", + +@"\claymore_zcash\Data1b2.bin", + +@"\claymore_zcash\Data1c1.bin", + +@"\claymore_zcash\Data1d1.bin", + +@"\claymore_zcash\Data1f1.bin", + @"\claymore_zcash\Data2.bin", @"\claymore_zcash\msvcr110.dll", @@ -46,28 +59,6 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin\round9.bin", -@"\optiminer_zcash_win\bin\xFiji_asm.bin", - -@"\optiminer_zcash_win\bin\xFiji_base.bin", - -@"\optiminer_zcash_win\bin\xFiji_round1.bin", - -@"\optiminer_zcash_win\bin\xFiji_round2.bin", - -@"\optiminer_zcash_win\bin\xFiji_round3.bin", - -@"\optiminer_zcash_win\bin\xFiji_round4.bin", - -@"\optiminer_zcash_win\bin\xFiji_round5.bin", - -@"\optiminer_zcash_win\bin\xFiji_round6.bin", - -@"\optiminer_zcash_win\bin\xFiji_round7.bin", - -@"\optiminer_zcash_win\bin\xFiji_round8.bin", - -@"\optiminer_zcash_win\bin\xFiji_round9.bin", - @"\optiminer_zcash_win\bin-191205\Bonaire_round1.bin", @"\optiminer_zcash_win\bin-191205\Bonaire_round2.bin", @@ -86,6 +77,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-191205\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round1.bin", + +@"\optiminer_zcash_win\bin-191205\CapeVerde_round2.bin", + +@"\optiminer_zcash_win\bin-191205\CapeVerde_round3.bin", + +@"\optiminer_zcash_win\bin-191205\CapeVerde_round4.bin", + +@"\optiminer_zcash_win\bin-191205\CapeVerde_round5.bin", + +@"\optiminer_zcash_win\bin-191205\CapeVerde_round6.bin", + +@"\optiminer_zcash_win\bin-191205\CapeVerde_round7.bin", + +@"\optiminer_zcash_win\bin-191205\CapeVerde_round8.bin", + +@"\optiminer_zcash_win\bin-191205\CapeVerde_round9.bin", + @"\optiminer_zcash_win\bin-191205\Carrizo_round1.bin", @"\optiminer_zcash_win\bin-191205\Carrizo_round2.bin", @@ -194,6 +203,42 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-191205\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Oland_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Oland_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Oland_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Oland_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Oland_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Oland_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Oland_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Oland_round9.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Pitcairn_round9.bin", + @"\optiminer_zcash_win\bin-191205\Spectre_round1.bin", @"\optiminer_zcash_win\bin-191205\Spectre_round2.bin", @@ -230,6 +275,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-191205\Spooky_round9.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round1.bin", + +@"\optiminer_zcash_win\bin-191205\Tahiti_round2.bin", + +@"\optiminer_zcash_win\bin-191205\Tahiti_round3.bin", + +@"\optiminer_zcash_win\bin-191205\Tahiti_round4.bin", + +@"\optiminer_zcash_win\bin-191205\Tahiti_round5.bin", + +@"\optiminer_zcash_win\bin-191205\Tahiti_round6.bin", + +@"\optiminer_zcash_win\bin-191205\Tahiti_round7.bin", + +@"\optiminer_zcash_win\bin-191205\Tahiti_round8.bin", + +@"\optiminer_zcash_win\bin-191205\Tahiti_round9.bin", + @"\optiminer_zcash_win\bin-191205\Tonga_round1.bin", @"\optiminer_zcash_win\bin-191205\Tonga_round2.bin", @@ -266,6 +329,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-200406\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round1.bin", + +@"\optiminer_zcash_win\bin-200406\CapeVerde_round2.bin", + +@"\optiminer_zcash_win\bin-200406\CapeVerde_round3.bin", + +@"\optiminer_zcash_win\bin-200406\CapeVerde_round4.bin", + +@"\optiminer_zcash_win\bin-200406\CapeVerde_round5.bin", + +@"\optiminer_zcash_win\bin-200406\CapeVerde_round6.bin", + +@"\optiminer_zcash_win\bin-200406\CapeVerde_round7.bin", + +@"\optiminer_zcash_win\bin-200406\CapeVerde_round8.bin", + +@"\optiminer_zcash_win\bin-200406\CapeVerde_round9.bin", + @"\optiminer_zcash_win\bin-200406\Carrizo_round1.bin", @"\optiminer_zcash_win\bin-200406\Carrizo_round2.bin", @@ -374,6 +455,42 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-200406\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Oland_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Oland_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Oland_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Oland_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Oland_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Oland_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Oland_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Oland_round9.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Pitcairn_round9.bin", + @"\optiminer_zcash_win\bin-200406\Spectre_round1.bin", @"\optiminer_zcash_win\bin-200406\Spectre_round2.bin", @@ -428,6 +545,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-200406\Stoney_round9.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round1.bin", + +@"\optiminer_zcash_win\bin-200406\Tahiti_round2.bin", + +@"\optiminer_zcash_win\bin-200406\Tahiti_round3.bin", + +@"\optiminer_zcash_win\bin-200406\Tahiti_round4.bin", + +@"\optiminer_zcash_win\bin-200406\Tahiti_round5.bin", + +@"\optiminer_zcash_win\bin-200406\Tahiti_round6.bin", + +@"\optiminer_zcash_win\bin-200406\Tahiti_round7.bin", + +@"\optiminer_zcash_win\bin-200406\Tahiti_round8.bin", + +@"\optiminer_zcash_win\bin-200406\Tahiti_round9.bin", + @"\optiminer_zcash_win\bin-200406\Tonga_round1.bin", @"\optiminer_zcash_win\bin-200406\Tonga_round2.bin", @@ -482,6 +617,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-203603\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round1.bin", + +@"\optiminer_zcash_win\bin-203603\CapeVerde_round2.bin", + +@"\optiminer_zcash_win\bin-203603\CapeVerde_round3.bin", + +@"\optiminer_zcash_win\bin-203603\CapeVerde_round4.bin", + +@"\optiminer_zcash_win\bin-203603\CapeVerde_round5.bin", + +@"\optiminer_zcash_win\bin-203603\CapeVerde_round6.bin", + +@"\optiminer_zcash_win\bin-203603\CapeVerde_round7.bin", + +@"\optiminer_zcash_win\bin-203603\CapeVerde_round8.bin", + +@"\optiminer_zcash_win\bin-203603\CapeVerde_round9.bin", + @"\optiminer_zcash_win\bin-203603\Carrizo_round1.bin", @"\optiminer_zcash_win\bin-203603\Carrizo_round2.bin", @@ -608,6 +761,42 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-203603\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Oland_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Oland_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Oland_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Oland_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Oland_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Oland_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Oland_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Oland_round9.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Pitcairn_round9.bin", + @"\optiminer_zcash_win\bin-203603\Spectre_round1.bin", @"\optiminer_zcash_win\bin-203603\Spectre_round2.bin", @@ -662,6 +851,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-203603\Stoney_round9.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round1.bin", + +@"\optiminer_zcash_win\bin-203603\Tahiti_round2.bin", + +@"\optiminer_zcash_win\bin-203603\Tahiti_round3.bin", + +@"\optiminer_zcash_win\bin-203603\Tahiti_round4.bin", + +@"\optiminer_zcash_win\bin-203603\Tahiti_round5.bin", + +@"\optiminer_zcash_win\bin-203603\Tahiti_round6.bin", + +@"\optiminer_zcash_win\bin-203603\Tahiti_round7.bin", + +@"\optiminer_zcash_win\bin-203603\Tahiti_round8.bin", + +@"\optiminer_zcash_win\bin-203603\Tahiti_round9.bin", + @"\optiminer_zcash_win\bin-203603\Tonga_round1.bin", @"\optiminer_zcash_win\bin-203603\Tonga_round2.bin", @@ -716,6 +923,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-207903\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round1.bin", + +@"\optiminer_zcash_win\bin-207903\CapeVerde_round2.bin", + +@"\optiminer_zcash_win\bin-207903\CapeVerde_round3.bin", + +@"\optiminer_zcash_win\bin-207903\CapeVerde_round4.bin", + +@"\optiminer_zcash_win\bin-207903\CapeVerde_round5.bin", + +@"\optiminer_zcash_win\bin-207903\CapeVerde_round6.bin", + +@"\optiminer_zcash_win\bin-207903\CapeVerde_round7.bin", + +@"\optiminer_zcash_win\bin-207903\CapeVerde_round8.bin", + +@"\optiminer_zcash_win\bin-207903\CapeVerde_round9.bin", + @"\optiminer_zcash_win\bin-207903\Carrizo_round1.bin", @"\optiminer_zcash_win\bin-207903\Carrizo_round2.bin", @@ -842,6 +1067,42 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-207903\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Oland_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Oland_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Oland_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Oland_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Oland_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Oland_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Oland_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Oland_round9.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Pitcairn_round9.bin", + @"\optiminer_zcash_win\bin-207903\Spectre_round1.bin", @"\optiminer_zcash_win\bin-207903\Spectre_round2.bin", @@ -896,6 +1157,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-207903\Stoney_round9.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round1.bin", + +@"\optiminer_zcash_win\bin-207903\Tahiti_round2.bin", + +@"\optiminer_zcash_win\bin-207903\Tahiti_round3.bin", + +@"\optiminer_zcash_win\bin-207903\Tahiti_round4.bin", + +@"\optiminer_zcash_win\bin-207903\Tahiti_round5.bin", + +@"\optiminer_zcash_win\bin-207903\Tahiti_round6.bin", + +@"\optiminer_zcash_win\bin-207903\Tahiti_round7.bin", + +@"\optiminer_zcash_win\bin-207903\Tahiti_round8.bin", + +@"\optiminer_zcash_win\bin-207903\Tahiti_round9.bin", + @"\optiminer_zcash_win\bin-207903\Tonga_round1.bin", @"\optiminer_zcash_win\bin-207903\Tonga_round2.bin", @@ -950,6 +1229,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-223600\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round1.bin", + +@"\optiminer_zcash_win\bin-223600\CapeVerde_round2.bin", + +@"\optiminer_zcash_win\bin-223600\CapeVerde_round3.bin", + +@"\optiminer_zcash_win\bin-223600\CapeVerde_round4.bin", + +@"\optiminer_zcash_win\bin-223600\CapeVerde_round5.bin", + +@"\optiminer_zcash_win\bin-223600\CapeVerde_round6.bin", + +@"\optiminer_zcash_win\bin-223600\CapeVerde_round7.bin", + +@"\optiminer_zcash_win\bin-223600\CapeVerde_round8.bin", + +@"\optiminer_zcash_win\bin-223600\CapeVerde_round9.bin", + @"\optiminer_zcash_win\bin-223600\Carrizo_round1.bin", @"\optiminer_zcash_win\bin-223600\Carrizo_round2.bin", @@ -1076,6 +1373,42 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-223600\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Oland_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Oland_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Oland_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Oland_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Oland_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Oland_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Oland_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Oland_round9.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Pitcairn_round9.bin", + @"\optiminer_zcash_win\bin-223600\Spectre_round1.bin", @"\optiminer_zcash_win\bin-223600\Spectre_round2.bin", @@ -1130,6 +1463,24 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-223600\Stoney_round9.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round1.bin", + +@"\optiminer_zcash_win\bin-223600\Tahiti_round2.bin", + +@"\optiminer_zcash_win\bin-223600\Tahiti_round3.bin", + +@"\optiminer_zcash_win\bin-223600\Tahiti_round4.bin", + +@"\optiminer_zcash_win\bin-223600\Tahiti_round5.bin", + +@"\optiminer_zcash_win\bin-223600\Tahiti_round6.bin", + +@"\optiminer_zcash_win\bin-223600\Tahiti_round7.bin", + +@"\optiminer_zcash_win\bin-223600\Tahiti_round8.bin", + +@"\optiminer_zcash_win\bin-223600\Tahiti_round9.bin", + @"\optiminer_zcash_win\bin-223600\Tonga_round1.bin", @"\optiminer_zcash_win\bin-223600\Tonga_round2.bin", From b38ab44401f8006d38e5c3d0fc21c55c9c5610e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 17 Jan 2017 22:07:15 +0100 Subject: [PATCH 206/366] AMD algorithm list - sgminer driver exception checking --- NiceHashMiner/Devices/AmdGpuDevice.cs | 6 +++++- NiceHashMiner/Devices/ComputeDevice.cs | 3 +++ NiceHashMiner/Devices/ComputeDeviceManager.cs | 14 ++++++++++++-- NiceHashMiner/Devices/GroupAlgorithms.cs | 10 ++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Devices/AmdGpuDevice.cs b/NiceHashMiner/Devices/AmdGpuDevice.cs index d7a0f03..25b3d6c 100644 --- a/NiceHashMiner/Devices/AmdGpuDevice.cs +++ b/NiceHashMiner/Devices/AmdGpuDevice.cs @@ -18,9 +18,13 @@ public class AmdGpuDevice { private OpenCLDevice _openClSubset; public readonly string InfSection; // has arhitecture string + // new drivers make some algorithms unusable 21.19.164.1 => driver not working with NeoScrypt and + public bool DriverDisableAlgos { get; private set; } + public string Codename { get { return _openClSubset._CL_DEVICE_NAME; } } - public AmdGpuDevice(OpenCLDevice openClSubset, bool isOldDriver, string infSection) { + public AmdGpuDevice(OpenCLDevice openClSubset, bool isOldDriver, string infSection, bool driverDisableAlgo) { + DriverDisableAlgos = driverDisableAlgo; InfSection = infSection; _openClSubset = openClSubset; // Check for optimized version diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 2e076d4..852178b 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -39,6 +39,8 @@ public class ComputeDevice public readonly bool IsOptimizedVersion; public readonly string Codename; public readonly string InfSection; + // amd has some algos not working with new drivers + public readonly bool DriverDisableAlgos; //public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } public Dictionary AlgorithmSettings { get; set; } @@ -107,6 +109,7 @@ public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount, bool isDetectionFallb Codename = amdDevice.Codename; InfSection = amdDevice.InfSection; AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); + DriverDisableAlgos = amdDevice.DriverDisableAlgos; ; } // combines long and short name diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 9830ef3..216fe47 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -521,6 +521,7 @@ static public void QueryAMD() { #region AMD driver check, ADL returns 0 // check the driver version bool EnableOptimizedVersion = true; Dictionary deviceDriverOld = new Dictionary(); + Dictionary deviceDriverNO_neoscrypt_lyra2re = new Dictionary(); string minerPath = MinerPaths.sgminer_5_5_0_general; bool ShowWarningDialog = false; @@ -528,10 +529,19 @@ static public void QueryAMD() { Helpers.ConsolePrint(TAG, String.Format("Checking AMD device (driver): {0} ({1})", vidContrllr.Name, vidContrllr.DriverVersion)); deviceDriverOld[vidContrllr.Name] = false; + deviceDriverNO_neoscrypt_lyra2re[vidContrllr.Name] = false; + Version sgminer_NO_neoscrypt_lyra2re = new Version("21.19.164.1"); // TODO checking radeon drivers only? if ((vidContrllr.Name.Contains("AMD") || vidContrllr.Name.Contains("Radeon")) && ShowWarningDialog == false) { Version AMDDriverVersion = new Version(vidContrllr.DriverVersion); + bool greaterOrEqual = AMDDriverVersion.CompareTo(sgminer_NO_neoscrypt_lyra2re) >= 0; + if (greaterOrEqual) { + deviceDriverNO_neoscrypt_lyra2re[vidContrllr.Name] = true; + Helpers.ConsolePrint(TAG, "Driver version seems to be " + sgminer_NO_neoscrypt_lyra2re.ToString() + " or higher. NeoScrypt and Lyra2REv2 will be removed from list"); + } + + if (AMDDriverVersion.Major < 15) { ShowWarningDialog = true; deviceDriverOld[vidContrllr.Name] = true; @@ -743,7 +753,7 @@ static public void QueryAMD() { int busID = amdGpus[i_id].AMD_BUS_ID; if (busID != -1 && _busIdsInfo.ContainsKey(busID)) { var deviceName = _busIdsInfo[busID].Item1; - var newAmdDev = new AmdGpuDevice(amdGpus[i_id], deviceDriverOld[deviceName], _busIdsInfo[busID].Item3); + var newAmdDev = new AmdGpuDevice(amdGpus[i_id], deviceDriverOld[deviceName], _busIdsInfo[busID].Item3, deviceDriverNO_neoscrypt_lyra2re[deviceName]); newAmdDev.DeviceName = deviceName; newAmdDev.UUID = _busIdsInfo[busID].Item2; bool isDisabledGroup = ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD; @@ -794,7 +804,7 @@ static public void QueryAMD() { var deviceName = AMDVideoControllers[i].Name; if(AMDVideoControllers[i].InfSection == null) AMDVideoControllers[i].InfSection = ""; - var newAmdDev = new AmdGpuDevice(amdGpus[i], deviceDriverOld[deviceName], AMDVideoControllers[i].InfSection); + var newAmdDev = new AmdGpuDevice(amdGpus[i], deviceDriverOld[deviceName], AMDVideoControllers[i].InfSection, deviceDriverNO_neoscrypt_lyra2re[deviceName]); newAmdDev.DeviceName = deviceName; newAmdDev.UUID = "UNUSED"; bool isDisabledGroup = ConfigManager.GeneralConfig.DeviceDetection.DisableDetectionAMD; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index c341ccb..14cb2d9 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -76,6 +76,16 @@ public static Dictionary CreateForDevice(ComputeDevice } } } + + // drivers algos issue + if (device.DriverDisableAlgos) { + List _3rdPartyOnlyAlgos = new List() { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2REv2 }; + foreach (var algoType in _3rdPartyOnlyAlgos) { + if (algoSettings.ContainsKey(algoType)) { + algoSettings.Remove(algoType); + } + } + } } // check if it is Etherum capable From 64620e7367b910c375c4a0483dc9551ef99e6042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 17 Jan 2017 22:13:05 +0100 Subject: [PATCH 207/366] remove pending --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 911461e..e7863c1 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -50,7 +50,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "_PENDING"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; From 43bf23911f7f2e42217302aa05fdccf4d649b7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 18 Jan 2017 10:05:41 +0100 Subject: [PATCH 208/366] fix local and web stat checking (give miners time before checking) - FIXES switching case --- NiceHashMiner/Miners/Miner.cs | 11 +++++++++++ NiceHashMiner/Miners/MiningSession.cs | 11 +++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 135e120..d85b346 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -71,6 +71,9 @@ public abstract class Miner { private MinerPID_Data _currentPidData; private List _allPidData = new List(); + // for local and global checking. give miner at least 5 minutes to take affect + private DateTime _startMining; + // Benchmark stuff public bool BenchmarkSignalQuit; public bool BenchmarkSignalHanged; @@ -494,12 +497,20 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { } } + public bool Is5minuteMining() { + return _startMining.AddMinutes(5) > DateTime.UtcNow; + } + public void ResetCheckTime() { + _startMining = DateTime.UtcNow; + } + abstract protected bool BenchmarkParseLine(string outdata); #endregion //BENCHMARK DE-COUPLED Decoupled benchmarking routines virtual protected NiceHashProcess _Start() { + ResetCheckTime(); PreviousTotalMH = 0.0; if (LastCommandLine.Length == 0) return null; diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index d524e96..33be117 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -89,7 +89,7 @@ public MiningSession(List devices, // check worker stats _checkWorkerStats = new Timer(); _checkWorkerStats.Elapsed += _checkWorkerStats_Elapsed; - _checkWorkerStats.Interval = 5 * 1000 * 60; // every 5 minutes + _checkWorkerStats.Interval = 2 * 1000 * 60; // every 2 minutes check, miners have to mine 5 minutes to take into account // assume profitable IsProfitable = true; @@ -107,9 +107,12 @@ public MiningSession(List devices, void _checkWorkerStats_Elapsed(object sender, ElapsedEventArgs e) { foreach (var groupMiner in _runningGroupMiners.Values) { - var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); - if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { - _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(groupMiner.AlgorithmType)); + if (groupMiner.Miner.Is5minuteMining()) { + groupMiner.Miner.ResetCheckTime(); + var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); + if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { + _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(groupMiner.AlgorithmType)); + } } } } From 399eafdd4c5f2c50816526f8ca8a45f7935955e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 18 Jan 2017 10:47:48 +0100 Subject: [PATCH 209/366] fix local web check, claymore cryptonight optimization param for certain cards --- NiceHashMiner/Devices/GroupAlgorithms.cs | 12 ++++++++++++ NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/Miners/MiningSession.cs | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 14cb2d9..17ca9ff 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -75,6 +75,18 @@ public static Dictionary CreateForDevice(ComputeDevice algoSettings.Remove(algoType); } } + } else { // 3rd party enabled + // + if (algoSettings.ContainsKey(AlgorithmType.CryptoNight)) { + //string regex_a_3 = "[5|6][0-9][0-9][0-9]"; + List a_4 = new List() {"280", "280x", "270", "270x", "290", "290x"}; + foreach (var namePart in a_4) { + if(device.Name.Contains(namePart)) { + algoSettings[AlgorithmType.CryptoNight].ExtraLaunchParameters = "-a 4"; + break; + } + } + } } // drivers algos issue diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index d85b346..9bf3cf1 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -498,7 +498,7 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { } public bool Is5minuteMining() { - return _startMining.AddMinutes(5) > DateTime.UtcNow; + return _startMining.AddMinutes(5) < DateTime.UtcNow; } public void ResetCheckTime() { _startMining = DateTime.UtcNow; diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 33be117..f67ca5f 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -108,10 +108,11 @@ public MiningSession(List devices, void _checkWorkerStats_Elapsed(object sender, ElapsedEventArgs e) { foreach (var groupMiner in _runningGroupMiners.Values) { if (groupMiner.Miner.Is5minuteMining()) { - groupMiner.Miner.ResetCheckTime(); + //groupMiner.Miner.ResetCheckTime(); var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(groupMiner.AlgorithmType)); + break; } } } From 4c95963f6a6ba46bad1f18546848dbd2b7aeb2f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 18 Jan 2017 11:16:57 +0100 Subject: [PATCH 210/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 71f404d..e3b4c30 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.4.0")] -[assembly: AssemblyFileVersion("1.7.4.0")] +[assembly: AssemblyVersion("1.7.4.1")] +[assembly: AssemblyFileVersion("1.7.4.1")] From 11b1ba5a602f090e900212ec44cd526efecc37cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 18 Jan 2017 11:55:42 +0100 Subject: [PATCH 211/366] claymore cryptonight -a 4 flag added devices --- NiceHashMiner/Devices/GroupAlgorithms.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 17ca9ff..a7fc472 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -79,7 +79,18 @@ public static Dictionary CreateForDevice(ComputeDevice // if (algoSettings.ContainsKey(AlgorithmType.CryptoNight)) { //string regex_a_3 = "[5|6][0-9][0-9][0-9]"; - List a_4 = new List() {"280", "280x", "270", "270x", "290", "290x"}; + List a_4 = new List() { + "270", + "270x", + "280", + "280x", + "290", + "290x", + "370", + "380", + "390", + "470", + "480"}; foreach (var namePart in a_4) { if(device.Name.Contains(namePart)) { algoSettings[AlgorithmType.CryptoNight].ExtraLaunchParameters = "-a 4"; From 2e3f41274e7039efd878a9b2abf44c2266dc7ef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 18 Jan 2017 13:47:35 +0100 Subject: [PATCH 212/366] increase local and web stats checking (15 minute interval) --- NiceHashMiner/Miners/Miner.cs | 4 ++-- NiceHashMiner/Miners/MiningSession.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 9bf3cf1..aeaf7ff 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -497,8 +497,8 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { } } - public bool Is5minuteMining() { - return _startMining.AddMinutes(5) < DateTime.UtcNow; + public bool IsXminutesMining(int minutes) { + return _startMining.AddMinutes(minutes) < DateTime.UtcNow; } public void ResetCheckTime() { _startMining = DateTime.UtcNow; diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index f67ca5f..521767d 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -107,8 +107,8 @@ public MiningSession(List devices, void _checkWorkerStats_Elapsed(object sender, ElapsedEventArgs e) { foreach (var groupMiner in _runningGroupMiners.Values) { - if (groupMiner.Miner.Is5minuteMining()) { - //groupMiner.Miner.ResetCheckTime(); + if (groupMiner.Miner.IsXminutesMining(15)) { + groupMiner.Miner.ResetCheckTime(); var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(groupMiner.AlgorithmType)); From 1f81b4401051728639cfc59cdf676a4ed5cb4af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 18 Jan 2017 13:58:04 +0100 Subject: [PATCH 213/366] update translations --- NiceHashMiner/langs/ru.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index b83bec1..a2de93d 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -337,6 +337,6 @@ "Form_Main_StartMiningReturnedFalse": "NiceHashMiner не может начать майнинг. Убедитесь, что хотя-бы одно устройство включено с хотя-бы одним включенным и прошедшим бенчмарк алгоритмом", "Program_WMI_Error_Text": "NiceHash Miner не может запустить необходимые компоненты. Похоже, что в вашей системе отключен сервис Инструментарий управления Windows. Для корректной работы NiceHash Miner, сервис Инструментарий управления Windows должен быть включен. Этот сервис нужен для определения использования RAM и доступной информации видеоконтроллера. Включите сервис Инструментарий управления Windows вручную и запустите NiceHash Miner.", "Program_WMI_Error_Title": "Ошибка Инструментария управления Windows", - "Form_Main_Accepted_Speed_Zero" : "Warning! Algorithm {0} is reporting 0 shares accepted. Please disable this algorithm in Benchmark/Settings and report this issue to support@nicehash.com!" + "Form_Main_Accepted_Speed_Zero" : "Предупреждение! Алгоритм {0} сообщает 0 принятых шар. Отключите, пожалуйста, этот алгоритм в Бенчмарке/Настройках и сообщите о данной проблеме на support-ru@nicehash.com!" } } \ No newline at end of file From cd379b687d95c3224cb9395c2009982817eb0e1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 18 Jan 2017 14:51:13 +0100 Subject: [PATCH 214/366] fix local and web miner checking (wait for 4 strikes before warning) --- NiceHashMiner/Miners/Miner.cs | 25 ++++++++++++++++++++++++- NiceHashMiner/Miners/MiningSession.cs | 14 +++++++++++--- NiceHashMiner/NiceHashStats.cs | 13 ++++++------- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index aeaf7ff..3cb45db 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -497,12 +497,34 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { } } - public bool IsXminutesMining(int minutes) { + + int minerStatsCheckCount = 3; + public bool ShouldCheckMinerStats() { + int minuteCheck = 1; // 1 minutes default + if (minerStatsCheckCount == 3) { + minuteCheck = 15; + } else if (minerStatsCheckCount == 2) { + minuteCheck = 5; + } else if (minerStatsCheckCount == 1) { + minuteCheck = 2; + } + --minerStatsCheckCount; + return IsXminutesMining(minuteCheck); + } + + public bool IsCheckShowWarning() { + return minerStatsCheckCount < 0; + } + + private bool IsXminutesMining(int minutes) { return _startMining.AddMinutes(minutes) < DateTime.UtcNow; } public void ResetCheckTime() { _startMining = DateTime.UtcNow; } + public void ResetCheckStateCount() { + minerStatsCheckCount = 3; + } abstract protected bool BenchmarkParseLine(string outdata); @@ -511,6 +533,7 @@ public void ResetCheckTime() { virtual protected NiceHashProcess _Start() { ResetCheckTime(); + ResetCheckStateCount(); PreviousTotalMH = 0.0; if (LastCommandLine.Length == 0) return null; diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 521767d..5db836e 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -105,17 +105,25 @@ public MiningSession(List devices, IsMiningRegardlesOfProfit = ConfigManager.GeneralConfig.MinimumProfit == 0; } + // TODO this feature is needs more feedback void _checkWorkerStats_Elapsed(object sender, ElapsedEventArgs e) { + AlgorithmType type = AlgorithmType.NONE; + bool showWarning = false; foreach (var groupMiner in _runningGroupMiners.Values) { - if (groupMiner.Miner.IsXminutesMining(15)) { + if (groupMiner.Miner.ShouldCheckMinerStats()) { groupMiner.Miner.ResetCheckTime(); var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { - _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(groupMiner.AlgorithmType)); - break; + type = groupMiner.AlgorithmType; + showWarning = groupMiner.Miner.IsCheckShowWarning(); + } else { + groupMiner.Miner.ResetCheckStateCount(); } } } + if (showWarning) { + _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(type)); + } } #region Timers stuff diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index f88d3e6..0cf5ceb 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -165,13 +165,12 @@ public static nicehash_worker_algo_stats GetWorkerAlgorithmAcceptedSpeeds(string } } } - if (ret.Count > 0) { - var first = ret[0]; - if (first.speedsStatus.ContainsKey("a")) { - retEl.accepted = first.speedsStatus["a"]; - } - if (first.speedsStatus.ContainsKey("rs")) { - retEl.rejected = first.speedsStatus["rs"]; + foreach (var r in ret) { + if (r.speedsStatus.ContainsKey("a")) { + retEl.accepted += r.speedsStatus["a"]; + } + if (r.speedsStatus.ContainsKey("rs")) { + retEl.rejected += r.speedsStatus["rs"]; } } From 751418fbc444e3803fad64bc01a1343d9d77f12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 18 Jan 2017 20:17:41 +0100 Subject: [PATCH 215/366] disable web check feature (until issues are resolved) --- NiceHashMiner/Forms/Form_Main.cs | 24 ++++---- .../Interfaces/IMainFormRatesComunication.cs | 2 +- NiceHashMiner/Miners/MiningSession.cs | 56 +++++++++---------- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index e7863c1..8bc7cd4 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -737,18 +737,18 @@ private void buttonSettings_Click(object sender, EventArgs e) } - private bool isRaiseAlertSharesNotAcceptedShown = false; - public void RaiseAlertSharesNotAccepted(string algoName) { - if (!isRaiseAlertSharesNotAcceptedShown) { - isRaiseAlertSharesNotAcceptedShown = true; - - MessageBox.Show(String.Format(International.GetText("Form_Main_Accepted_Speed_Zero"), algoName), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - - isRaiseAlertSharesNotAcceptedShown = false; - } - } + //private bool isRaiseAlertSharesNotAcceptedShown = false; + //public void RaiseAlertSharesNotAccepted(string algoName) { + // if (!isRaiseAlertSharesNotAcceptedShown) { + // isRaiseAlertSharesNotAcceptedShown = true; + + // MessageBox.Show(String.Format(International.GetText("Form_Main_Accepted_Speed_Zero"), algoName), + // International.GetText("Warning_with_Exclamation"), + // MessageBoxButtons.OK, MessageBoxIcon.Warning); + + // isRaiseAlertSharesNotAcceptedShown = false; + // } + //} private void buttonStartMining_Click(object sender, EventArgs e) { diff --git a/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs b/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs index dbf10f4..0115fcd 100644 --- a/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs +++ b/NiceHashMiner/Interfaces/IMainFormRatesComunication.cs @@ -9,6 +9,6 @@ public interface IMainFormRatesComunication { void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPIData, double paying, bool isApiGetException); void ShowNotProfitable(string msg); void HideNotProfitable(); - void RaiseAlertSharesNotAccepted(string algoName); + //void RaiseAlertSharesNotAccepted(string algoName); } } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 5db836e..591152b 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -42,8 +42,8 @@ public class MiningSession { private Timer _preventSleepTimer; // check internet connection private Timer _internetCheckTimer; - // check local and web stats per algo - private Timer _checkWorkerStats; + //// check local and web stats per algo + //private Timer _checkWorkerStats; public bool IsMiningEnabled { @@ -86,10 +86,10 @@ public MiningSession(List devices, _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; _internetCheckTimer.Interval = 1 * 1000 * 60; // every minute - // check worker stats - _checkWorkerStats = new Timer(); - _checkWorkerStats.Elapsed += _checkWorkerStats_Elapsed; - _checkWorkerStats.Interval = 2 * 1000 * 60; // every 2 minutes check, miners have to mine 5 minutes to take into account + //// check worker stats + //_checkWorkerStats = new Timer(); + //_checkWorkerStats.Elapsed += _checkWorkerStats_Elapsed; + //_checkWorkerStats.Interval = 2 * 1000 * 60; // every 2 minutes check, miners have to mine 5 minutes to take into account // assume profitable IsProfitable = true; @@ -99,32 +99,32 @@ public MiningSession(List devices, if (IsMiningEnabled) { _preventSleepTimer.Start(); _internetCheckTimer.Start(); - _checkWorkerStats.Start(); + //_checkWorkerStats.Start(); } IsMiningRegardlesOfProfit = ConfigManager.GeneralConfig.MinimumProfit == 0; } - // TODO this feature is needs more feedback - void _checkWorkerStats_Elapsed(object sender, ElapsedEventArgs e) { - AlgorithmType type = AlgorithmType.NONE; - bool showWarning = false; - foreach (var groupMiner in _runningGroupMiners.Values) { - if (groupMiner.Miner.ShouldCheckMinerStats()) { - groupMiner.Miner.ResetCheckTime(); - var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); - if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { - type = groupMiner.AlgorithmType; - showWarning = groupMiner.Miner.IsCheckShowWarning(); - } else { - groupMiner.Miner.ResetCheckStateCount(); - } - } - } - if (showWarning) { - _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(type)); - } - } + //// TODO this feature is needs more feedback + //void _checkWorkerStats_Elapsed(object sender, ElapsedEventArgs e) { + // AlgorithmType type = AlgorithmType.NONE; + // bool showWarning = false; + // foreach (var groupMiner in _runningGroupMiners.Values) { + // if (groupMiner.Miner.ShouldCheckMinerStats()) { + // groupMiner.Miner.ResetCheckTime(); + // var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); + // if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { + // type = groupMiner.AlgorithmType; + // showWarning = groupMiner.Miner.IsCheckShowWarning(); + // } else { + // groupMiner.Miner.ResetCheckStateCount(); + // } + // } + // } + // if (showWarning) { + // _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(type)); + // } + //} #region Timers stuff private void InternetCheckTimer_Tick(object sender, EventArgs e) { @@ -163,7 +163,7 @@ public void StopAllMiners() { // restroe/enable sleep _preventSleepTimer.Stop(); _internetCheckTimer.Stop(); - _checkWorkerStats.Stop(); + //_checkWorkerStats.Stop(); Helpers.AllowMonitorPowerdownAndSleep(); // delete generated bin files From 56b8764dc32dc4142428498be8e8a74b7e5a3af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 19 Jan 2017 16:09:54 +0100 Subject: [PATCH 216/366] add ToS --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 1 + .../Forms/Form_ChooseLanguage.Designer.cs | 46 ++++++++++++++++--- NiceHashMiner/Forms/Form_ChooseLanguage.cs | 24 ++++++++-- NiceHashMiner/Forms/Form_ChooseLanguage.resx | 7 ++- NiceHashMiner/Globals.cs | 3 ++ NiceHashMiner/Program.cs | 8 ++-- NiceHashMiner/langs/en.lang | 3 +- 7 files changed, 76 insertions(+), 16 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index 0cb5ec0..4815df0 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -66,6 +66,7 @@ public class GeneralConfig { public List LastDevicesSettup = new List(); // public string hwid = ""; + public int agreedWithTOS = 0; // methods public void SetDefaults() { diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs index 09ab12b..4f419d6 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.Designer.cs @@ -23,15 +23,18 @@ protected override void Dispose(bool disposing) { /// the contents of this method with the code editor. /// private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form_ChooseLanguage)); this.label_Instruction = new System.Windows.Forms.Label(); this.comboBox_Languages = new System.Windows.Forms.ComboBox(); this.button_OK = new System.Windows.Forms.Button(); + this.checkBox_TOS = new System.Windows.Forms.CheckBox(); + this.textBox_TOS = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // label_Instruction // this.label_Instruction.AutoSize = true; - this.label_Instruction.Location = new System.Drawing.Point(52, 9); + this.label_Instruction.Location = new System.Drawing.Point(10, 367); this.label_Instruction.Name = "label_Instruction"; this.label_Instruction.Size = new System.Drawing.Size(231, 13); this.label_Instruction.TabIndex = 0; @@ -40,15 +43,17 @@ private void InitializeComponent() { // comboBox_Languages // this.comboBox_Languages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox_Languages.Enabled = false; this.comboBox_Languages.FormattingEnabled = true; - this.comboBox_Languages.Location = new System.Drawing.Point(66, 29); + this.comboBox_Languages.Location = new System.Drawing.Point(15, 384); this.comboBox_Languages.Name = "comboBox_Languages"; this.comboBox_Languages.Size = new System.Drawing.Size(195, 21); this.comboBox_Languages.TabIndex = 1; // // button_OK // - this.button_OK.Location = new System.Drawing.Point(110, 56); + this.button_OK.Enabled = false; + this.button_OK.Location = new System.Drawing.Point(216, 382); this.button_OK.Name = "button_OK"; this.button_OK.Size = new System.Drawing.Size(106, 23); this.button_OK.TabIndex = 2; @@ -56,20 +61,45 @@ private void InitializeComponent() { this.button_OK.UseVisualStyleBackColor = true; this.button_OK.Click += new System.EventHandler(this.button_OK_Click); // - // Form_ChooseLanguage_r + // checkBox_TOS + // + this.checkBox_TOS.AutoSize = true; + this.checkBox_TOS.Location = new System.Drawing.Point(292, 359); + this.checkBox_TOS.Name = "checkBox_TOS"; + this.checkBox_TOS.Size = new System.Drawing.Size(151, 17); + this.checkBox_TOS.TabIndex = 3; + this.checkBox_TOS.Text = "I accept the Terms Of Use"; + this.checkBox_TOS.UseVisualStyleBackColor = true; + this.checkBox_TOS.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); + // + // textBox_TOS + // + this.textBox_TOS.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.textBox_TOS.Location = new System.Drawing.Point(13, 13); + this.textBox_TOS.Multiline = true; + this.textBox_TOS.Name = "textBox_TOS"; + this.textBox_TOS.ReadOnly = true; + this.textBox_TOS.Size = new System.Drawing.Size(430, 340); + this.textBox_TOS.TabIndex = 4; + this.textBox_TOS.TabStop = false; + this.textBox_TOS.Text = resources.GetString("textBox_TOS.Text"); + // + // Form_ChooseLanguage // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(334, 91); + this.ClientSize = new System.Drawing.Size(455, 427); + this.Controls.Add(this.textBox_TOS); + this.Controls.Add(this.checkBox_TOS); this.Controls.Add(this.button_OK); this.Controls.Add(this.comboBox_Languages); this.Controls.Add(this.label_Instruction); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; - this.Name = "Form_ChooseLanguage_r"; + this.Name = "Form_ChooseLanguage"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Choose Language"; + this.Text = "NiceHash Miner Term Of Use / Choose Language"; this.ResumeLayout(false); this.PerformLayout(); @@ -80,5 +110,7 @@ private void InitializeComponent() { private System.Windows.Forms.Label label_Instruction; private System.Windows.Forms.ComboBox comboBox_Languages; private System.Windows.Forms.Button button_OK; + private System.Windows.Forms.CheckBox checkBox_TOS; + private System.Windows.Forms.TextBox textBox_TOS; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.cs index e0d84e2..e3143d1 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.cs +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.cs @@ -10,6 +10,9 @@ namespace NiceHashMiner.Forms { public partial class Form_ChooseLanguage : Form { + + private static readonly string TOS_TEXT = "NiceHash Miner Terms Of Use NiceHash operates as in intermediate service by providing hashing power from hashing power owners to hashing power buyers. NiceHash does not directly provide it's own hashing power. We will do our best to provide stable, secure and feature full service. We do not take responsibility for any kind of hashing power loss or funds loss and do not take any kind of financial, material, legal or other responsibilities for any issues that my arise from using NiceHash Miner. NiceHash service and it's products (NiceHash Miner, etc.) is still in development, therefore some bugs or other issues may arise. We will work hard to fix any issues as soon as possible, add new features and overall improve our service. NiceHash reserves the rights to seize any funds of suspicious illegal activity such as mining with botnets, money laundering, hacking attempts, etc.\r\n\r\nAs a user of NiceHash Miner, you are providing your hashing power (your are a seller) to the hashing power buyers though NiceHash's hashing power marketplace. You earn Bitcoins from selling your hashing power for every valid share your miner generates and is accepted by NiceHash service. In some cases no shares are sent to or are accepted by NiceHash service. This cases are rare and includes usage of slower hardware, software or network errors or simmilar. In these cases (no shares generated and accepted by NiceHash service) no reward in form of Bitcoins can be accounted to you. Payouts are automatic and are paid to BTC address, used in NiceHash Miner. Payment schedule can be found in FAQ on our website and is subject to change. You can always monitor your statistics on this site: https://www.nicehash.com/?p=myminer \r\n\r\nIf you have any questions relating to these Terms of Use, your rights and obligations arising from these Terms and/or your use of the NiceHash service, or any other matter, please contact us at support@nicehash.com."; + public Form_ChooseLanguage() { InitializeComponent(); @@ -23,14 +26,29 @@ public Form_ChooseLanguage() { comboBox_Languages.SelectedIndex = 0; - label_Instruction.Location = new Point((this.Width - label_Instruction.Size.Width) / 2, label_Instruction.Location.Y); - button_OK.Location = new Point((this.Width - button_OK.Size.Width) / 2, button_OK.Location.Y); - comboBox_Languages.Location = new Point((this.Width - comboBox_Languages.Size.Width) / 2, comboBox_Languages.Location.Y); + //label_Instruction.Location = new Point((this.Width - label_Instruction.Size.Width) / 2, label_Instruction.Location.Y); + //button_OK.Location = new Point((this.Width - button_OK.Size.Width) / 2, button_OK.Location.Y); + //comboBox_Languages.Location = new Point((this.Width - comboBox_Languages.Size.Width) / 2, comboBox_Languages.Location.Y); + this.textBox_TOS.Text = TOS_TEXT; + } private void button_OK_Click(object sender, EventArgs e) { ConfigManager.GeneralConfig.Language = (LanguageType)comboBox_Languages.SelectedIndex; + ConfigManager.GeneralConfigFileCommit(); this.Close(); } + + private void checkBox1_CheckedChanged(object sender, EventArgs e) { + if (checkBox_TOS.Checked) { + ConfigManager.GeneralConfig.agreedWithTOS = Globals.CURRENT_TOS_VER; + comboBox_Languages.Enabled = true; + button_OK.Enabled = true; + } else { + ConfigManager.GeneralConfig.agreedWithTOS = 0; + comboBox_Languages.Enabled = false; + button_OK.Enabled = false; + } + } } } diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.resx b/NiceHashMiner/Forms/Form_ChooseLanguage.resx index 1af7de1..02afb7d 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.resx +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.resx @@ -112,9 +112,12 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + "NiceHash Miner Term Of Use NiceHash operates as in intermediate service by providing hashing power from hashing power owners to hashing power buyers. NiceHash does not directly provide it's own hashing power. We will do our best to provide stable, secure and feature full service. We do not take responsibility for any kind of hashing power loss or funds loss and do not take any kind of financial, material, legal or other responsibilities for any issues that my arise from using NiceHash Miner. NiceHash service and it's products (NiceHash Miner, etc.) is still in development, therefore some bugs or other issues may arise. We will work hard to fix any issues as soon as possible, add new features and overall improve our service. NiceHash reserves the rights to seize any funds of suspicious illegal activity such as mining with botnets, money laundering, hacking attempts, etc.\r\n\r\nAs a user of NiceHash Miner, you are providing your hashing power (your are a seller) to the hashing power buyers though NiceHash's hashing power marketplace. You earn Bitcoins from selling your hashing power for every valid share your miner generates and is accepted by NiceHash service. In some cases no shares are sent to or are accepted by NiceHash service. This cases are rare and includes usage of slower hardware, software or network errors or simmilar. In these cases (no shares generated and accepted by NiceHash service) no reward in form of Bitcoins can be accounted to you. Payouts are automatic and are paid to BTC address, used in NiceHash Miner. Payment schedule can be found in FAQ on our website and is subject to change. You can always monitor your statistics on this site: <a href=\"https://www.nicehash.com/?p=myminer\">https://www.nicehash.com/?p=myminer</a> \r\n\r\nIf you have any questions relating to these Terms of Use, your rights and obligations arising from these Terms and/or your use of the NiceHash service, or any other matter, please contact us at support@nicehash.com." + \ No newline at end of file diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index 933b034..c8c5b0f 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -18,5 +18,8 @@ public class Globals { public static int FirstNetworkCheckTimeoutTries = 10; // sgminer Ellesmere/Polaris ignore setting (sgminer needs more testing) public static bool IsEllesmereSgminerIgnore = true; + + // change this if TOS changes + public static int CURRENT_TOS_VER = 1; } } \ No newline at end of file diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index d5bde55..18ed618 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -64,8 +64,8 @@ static void Main(string[] argv) var commandLineArgs = new CommandLineParser(argv); Helpers.ConsolePrint("NICEHASH", "Starting up NiceHashMiner v" + Application.ProductVersion); - - if (!ConfigManager.GeneralConfigIsFileExist() && !commandLineArgs.IsLang) { + bool tosChecked = ConfigManager.GeneralConfig.agreedWithTOS == Globals.CURRENT_TOS_VER; + if (!tosChecked || !ConfigManager.GeneralConfigIsFileExist() && !commandLineArgs.IsLang) { Helpers.ConsolePrint("NICEHASH", "No config file found. Running NiceHash Miner for the first time. Choosing a default language."); Application.Run(new Form_ChooseLanguage()); } @@ -81,7 +81,9 @@ static void Main(string[] argv) // check WMI if (Helpers.IsWMIEnabled()) { - Application.Run(new Form_Main()); + if (ConfigManager.GeneralConfig.agreedWithTOS == Globals.CURRENT_TOS_VER) { + Application.Run(new Form_Main()); + } } else { MessageBox.Show(International.GetText("Program_WMI_Error_Text"), diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 849bec2..ccf42cc 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -337,6 +337,7 @@ "Form_Main_StartMiningReturnedFalse": "NiceHash Miner cannot start mining. Make sure you have at least one enabled device that has at least one enabled and benchmarked algorithm.", "Program_WMI_Error_Text": "NiceHash Miner cannot run needed components. It seems that your system has Windows Management Instrumentation service Disabled. In order for NiceHash Miner to work properly Windows Management Instrumentation service needs to be Enabled. This service is needed to detect RAM usage and Avaliable Video controler information. Enable Windows Management Instrumentation service manually and start NiceHash Miner.", "Program_WMI_Error_Title": "Windows Management Instrumentation Error", - "Form_Main_Accepted_Speed_Zero" : "Warning! Algorithm {0} is reporting 0 shares accepted. Please disable this algorithm in Benchmark/Settings and report this issue to support@nicehash.com!" + "Form_Main_Accepted_Speed_Zero": "Warning! Algorithm {0} is reporting 0 shares accepted. Please disable this algorithm in Benchmark/Settings and report this issue to support@nicehash.com!", + "NHM_TOS" : "NiceHash Miners Term Of Use NiceHash operates as in intermediate service by providing hashing power from hashing power owners to hashing power buyers. NiceHash does not directly provide it's own hashing power. We will do our best to provide stable, secure and feature full service. We do not take responsibility for any kind of hashing power loss or funds loss and do not take any kind of financial, material, legal or other responsibilities for any issues that my arise from using NiceHash Miner. NiceHash service and it's products (NiceHash Miner, etc.) is still in development, therefore some bugs or other issues may arise. We will work hard to fix any issues as soon as possible, add new features and overall improve our service. NiceHash reserves the rights to seize any funds of suspicious illegal activity such as mining with botnets, money laundering, hacking attempts, etc.\r\n\r\nAs a user of NiceHash Miner, you are providing your hashing power (your are a seller) to the hashing power buyers though NiceHash's hashing power marketplace. You earn Bitcoins from selling your hashing power for every valid share your miner generates and is accepted by NiceHash service. In some cases no shares are sent to or are accepted by NiceHash service. This cases are rare and includes usage of slower hardware, software or network errors or simmilar. In these cases (no shares generated and accepted by NiceHash service) no reward in form of Bitcoins can be accounted to you. Payouts are automatic and are paid to BTC address, used in NiceHash Miner. Payment schedule can be found in FAQ on our website and is subject to change. You can always monitor your statistics on this site: https://www.nicehash.com/?p=myminer\r\n\r\nIf you have any questions relating to these Terms of Use, your rights and obligations arising from these Terms and/or your use of the NiceHash service, or any other matter, please contact us at support@nicehash.com." } } From 18a0ad7a42d6a9e65af26e4bf123086abf4869e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 19 Jan 2017 16:17:32 +0100 Subject: [PATCH 217/366] add dagger exceptions --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 10 ++++++++++ NiceHashMiner/Devices/GroupAlgorithms.cs | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 216fe47..63d2856 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -876,6 +876,16 @@ public static void ResetAvaliableAlgorithmsForDevice() { dev._3rdPartyMinerChange(); } } + + public static int GetCountForType(DeviceType type) { + int count = 0; + foreach (var device in Avaliable.AllAvaliableDevices) { + if (device.DeviceType == type) { + ++count; + } + } + return count; + } } public static class Group { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index a7fc472..a29a21e 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -102,13 +102,18 @@ public static Dictionary CreateForDevice(ComputeDevice // drivers algos issue if (device.DriverDisableAlgos) { - List _3rdPartyOnlyAlgos = new List() { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2REv2 }; + List _3rdPartyOnlyAlgos = new List() { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2REv2, AlgorithmType.DaggerHashimoto }; foreach (var algoType in _3rdPartyOnlyAlgos) { if (algoSettings.ContainsKey(algoType)) { algoSettings.Remove(algoType); } } } + if (ComputeDeviceManager.Avaliable.GetCountForType(DeviceType.AMD) > 4) { + if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto)) { + algoSettings.Remove(AlgorithmType.DaggerHashimoto); + } + } } // check if it is Etherum capable From 0e89c5bf50ada20671906fffdb49d72000b75c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 20 Jan 2017 21:05:52 +0100 Subject: [PATCH 218/366] update bins dl, enable sgminer-gm --- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 10 +++++----- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index a816bcc..4cef3d8 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -44,7 +44,7 @@ public static class MinerPaths public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; public const string sgminer_5_5_0_general = _bin + @"\sgminer-5-5-0-general\sgminer.exe"; public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; - //public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; // open source miner + public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; /// /// nheqminer @@ -86,7 +86,7 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy // special cases // AlgorithmType.DaggerHashimoto special shared case if (algorithmType == AlgorithmType.DaggerHashimoto - && (deviceType == DeviceType.AMD || deviceType == DeviceType.NVIDIA)) { + && (/*deviceType == DeviceType.AMD ||*/ deviceType == DeviceType.NVIDIA)) { return MinerPaths.ethminer; } // AlgorithmType.Equihash special shared case @@ -183,9 +183,9 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i return MinerPaths.sgminer_5_1_1_optimized; } } - //if (AlgorithmType.CryptoNight == type /*|| AlgorithmType.DaggerHashimoto == type*/) { - // return MinerPaths.sgminer_gm; - //} + if (AlgorithmType.CryptoNight == type || AlgorithmType.DaggerHashimoto == type) { + return MinerPaths.sgminer_gm; + } return MinerPaths.sgminer_5_5_0_general; } diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index de010c8..49dee6c 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_4_0.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_4_2.zip", "bins.zip", "bin"); From b21b73af75a4a270c12468822224905451f2854b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 20 Jan 2017 21:20:49 +0100 Subject: [PATCH 219/366] add miner settings, update suported algos AMD logic --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 4 ++++ NiceHashMiner/Devices/GroupAlgorithms.cs | 26 ++++++++------------- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index 4815df0..cd92d74 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -59,6 +59,8 @@ public class GeneralConfig { public Use3rdPartyMiners Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; public bool DownloadInit3rdParty = false; public AMD_Equihash_3rdParty AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; + public bool AMD_DaggerHashimoto_UseSgminer = false; + public bool AMD_CryptoNight_ForceSgminer = false; public bool AllowMultipleInstances = true; @@ -109,6 +111,8 @@ public void SetDefaults() { DownloadInit3rdParty = false; AllowMultipleInstances = true; AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; + AMD_DaggerHashimoto_UseSgminer = false; + AMD_CryptoNight_ForceSgminer = false; } public void FixSettingBounds() { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index a29a21e..a0bafbf 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -68,15 +68,7 @@ public static Dictionary CreateForDevice(ComputeDevice } // check if 3rd party is enabled and allow 3rd party only algos - if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES == false) { - List _3rdPartyOnlyAlgos = new List() { AlgorithmType.CryptoNight }; - foreach (var algoType in _3rdPartyOnlyAlgos) { - if (algoSettings.ContainsKey(algoType)) { - algoSettings.Remove(algoType); - } - } - } else { // 3rd party enabled - // + if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES && ConfigManager.GeneralConfig.AMD_CryptoNight_ForceSgminer == false) { if (algoSettings.ContainsKey(AlgorithmType.CryptoNight)) { //string regex_a_3 = "[5|6][0-9][0-9][0-9]"; List a_4 = new List() { @@ -92,7 +84,7 @@ public static Dictionary CreateForDevice(ComputeDevice "470", "480"}; foreach (var namePart in a_4) { - if(device.Name.Contains(namePart)) { + if (device.Name.Contains(namePart)) { algoSettings[AlgorithmType.CryptoNight].ExtraLaunchParameters = "-a 4"; break; } @@ -109,21 +101,22 @@ public static Dictionary CreateForDevice(ComputeDevice } } } - if (ComputeDeviceManager.Avaliable.GetCountForType(DeviceType.AMD) > 4) { + if (ComputeDeviceManager.Avaliable.GetCountForType(DeviceType.AMD) > 4 && ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer == false) { if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto)) { algoSettings.Remove(AlgorithmType.DaggerHashimoto); } } } + // check if AlgorithmType.DaggerHashimoto and sgminer + if (ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer) { + // TODO set best defaults + } // check if it is Etherum capable if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto) && device.IsEtherumCapale == false) { algoSettings.Remove(AlgorithmType.DaggerHashimoto); } - //// also check for Equihash as it needs 2GB GPU - //if (algoSettings.ContainsKey(AlgorithmType.Equihash) && device.IsEtherumCapale == false) { - // algoSettings.Remove(AlgorithmType.Equihash); - //} + } return algoSettings; } @@ -170,7 +163,8 @@ private static Dictionary CreateDefaultsForGroup(Devic { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, // for now only 3rd party support + { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") + { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" + AmdGpuDevice.TemperatureParam } }, // TODO find best performance { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 4cef3d8..b5d5403 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -86,7 +86,7 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy // special cases // AlgorithmType.DaggerHashimoto special shared case if (algorithmType == AlgorithmType.DaggerHashimoto - && (/*deviceType == DeviceType.AMD ||*/ deviceType == DeviceType.NVIDIA)) { + && (deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer == false || deviceType == DeviceType.NVIDIA)) { return MinerPaths.ethminer; } // AlgorithmType.Equihash special shared case From 27a22dfc47ba1ab3a8bf9c600e40c92fa80e5d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 21 Jan 2017 13:18:23 +0100 Subject: [PATCH 220/366] add option to enable params parsing for NVIDIA SM21 and SM3.x --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 1 + .../Miners/Parsing/ExtraLaunchParametersParser.cs | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index cd92d74..ae89dac 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -61,6 +61,7 @@ public class GeneralConfig { public AMD_Equihash_3rdParty AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; public bool AMD_DaggerHashimoto_UseSgminer = false; public bool AMD_CryptoNight_ForceSgminer = false; + public bool NVIDIA_CryptoNight_Preventive = true; public bool AllowMultipleInstances = true; diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 8a8ef8a..44b1423 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -399,10 +399,12 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith return Parse(MiningPairs, _ccimerOptions); } else if (algorithmType == AlgorithmType.CryptoNight) { // check if any device is SM21 or SM3.x if yes return empty for stability reasons - foreach (var pair in MiningPairs) { - var groupType = pair.Device.DeviceGroupType; - if (groupType == DeviceGroupType.NVIDIA_2_1 || groupType == DeviceGroupType.NVIDIA_3_x) { - return ""; + if (ConfigManager.GeneralConfig.NVIDIA_CryptoNight_Preventive) { + foreach (var pair in MiningPairs) { + var groupType = pair.Device.DeviceGroupType; + if (groupType == DeviceGroupType.NVIDIA_2_1 || groupType == DeviceGroupType.NVIDIA_3_x) { + return ""; + } } } return Parse(MiningPairs, _ccimerCryptoNightOptions, true); From 2125156f34be06149f1d5d5fb5f17d33613a2e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 08:47:27 +0100 Subject: [PATCH 221/366] update 3rdparty dl link --- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 49dee6c..d24b3da 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -20,7 +20,7 @@ public static class MinersDownloadManager { "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_4_0.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_4_2.zip", "bins_3rdparty.zip", "bin_3rdparty"); From edba95981b5363438e64aa1df1aced8ba4d58092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 08:54:59 +0100 Subject: [PATCH 222/366] fix path priority, sgminer daggerhashimoto by default, remove dagger exception --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 2 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 7 +------ NiceHashMiner/Miners/Grouping/MinerPaths.cs | 9 +++++---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index ae89dac..48a9920 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -59,7 +59,7 @@ public class GeneralConfig { public Use3rdPartyMiners Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; public bool DownloadInit3rdParty = false; public AMD_Equihash_3rdParty AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; - public bool AMD_DaggerHashimoto_UseSgminer = false; + public bool AMD_DaggerHashimoto_UseSgminer = true; public bool AMD_CryptoNight_ForceSgminer = false; public bool NVIDIA_CryptoNight_Preventive = true; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index a0bafbf..7abaae6 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -94,18 +94,13 @@ public static Dictionary CreateForDevice(ComputeDevice // drivers algos issue if (device.DriverDisableAlgos) { - List _3rdPartyOnlyAlgos = new List() { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2REv2, AlgorithmType.DaggerHashimoto }; + List _3rdPartyOnlyAlgos = new List() { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2REv2 }; foreach (var algoType in _3rdPartyOnlyAlgos) { if (algoSettings.ContainsKey(algoType)) { algoSettings.Remove(algoType); } } } - if (ComputeDeviceManager.Avaliable.GetCountForType(DeviceType.AMD) > 4 && ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer == false) { - if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto)) { - algoSettings.Remove(AlgorithmType.DaggerHashimoto); - } - } } // check if AlgorithmType.DaggerHashimoto and sgminer if (ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer) { diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index b5d5403..f490cdc 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -86,7 +86,8 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy // special cases // AlgorithmType.DaggerHashimoto special shared case if (algorithmType == AlgorithmType.DaggerHashimoto - && (deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer == false || deviceType == DeviceType.NVIDIA)) { + && ( + (deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer == false) || deviceType == DeviceType.NVIDIA)) { return MinerPaths.ethminer; } // AlgorithmType.Equihash special shared case @@ -169,6 +170,9 @@ public static string ccminer_sm5x_or_sm6x(AlgorithmType algorithmType) { static class AMD_GROUP { public static string sgminer_path(AlgorithmType type, string gpuCodename, bool isOptimized) { + if (AlgorithmType.CryptoNight == type || AlgorithmType.DaggerHashimoto == type) { + return MinerPaths.sgminer_gm; + } if (isOptimized) { if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type || AlgorithmType.Qubit == type) { if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { @@ -183,9 +187,6 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i return MinerPaths.sgminer_5_1_1_optimized; } } - if (AlgorithmType.CryptoNight == type || AlgorithmType.DaggerHashimoto == type) { - return MinerPaths.sgminer_gm; - } return MinerPaths.sgminer_5_5_0_general; } From 60d7c3be5d886d9f4f4ab6f3558f5721eeae40ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 09:00:56 +0100 Subject: [PATCH 223/366] remove uncommented, sgminer dagger defaults --- NiceHashMiner/Devices/GroupAlgorithms.cs | 32 ++---------------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 7abaae6..81fe8cd 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -131,29 +131,12 @@ private static Dictionary CreateDefaultsForGroup(Devic // DisableAMDTempControl = false; TemperatureParam must be appended lastly string DefaultParam = AmdGpuDevice.DefaultParam; return new Dictionary() { - //{ AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") - // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - //{ AlgorithmType.Keccak , new Algorithm(AlgorithmType.Keccak, "keccak") - // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 300 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, - //{ AlgorithmType.X15 , new Algorithm(AlgorithmType.X15, "x15") - // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam} }, - //{ AlgorithmType.Nist5 , new Algorithm(AlgorithmType.Nist5, "nist5") - // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 16 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.NeoScrypt , new Algorithm(AlgorithmType.NeoScrypt, "neoscrypt") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" + AmdGpuDevice.TemperatureParam } }, - //{ AlgorithmType.WhirlpoolX , new Algorithm(AlgorithmType.WhirlpoolX, "whirlpoolx") - // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - //{ AlgorithmType.Qubit , new Algorithm(AlgorithmType.Qubit, "qubitcoin") - // { ExtraLaunchParameters = DefaultParam + "--intensity 18 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - //{ AlgorithmType.Quark , new Algorithm(AlgorithmType.Quark, "quarkcoin") - // { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "Lyra2REv2") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, - //{ AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") - // { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - //{ AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") - // { ExtraLaunchParameters = DefaultParam + "--intensity 24 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, - { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, + { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "ethash") + { ExtraLaunchParameters = "--xintensity 512 -w 192 -g 1" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") @@ -166,19 +149,8 @@ private static Dictionary CreateDefaultsForGroup(Devic // NVIDIA if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType || DeviceGroupType.NVIDIA_5_0 == deviceGroupType || DeviceGroupType.NVIDIA_5_2 == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { var ret = new Dictionary { - //{ AlgorithmType.X13 , new Algorithm(AlgorithmType.X13, "x13") }, - //{ AlgorithmType.Keccak , new Algorithm(AlgorithmType.Keccak, "keccak") }, - //{ AlgorithmType.X15 , new Algorithm(AlgorithmType.X15, "x15") }, - //{ AlgorithmType.Nist5 , new Algorithm(AlgorithmType.Nist5, "nist5") }, { AlgorithmType.NeoScrypt , new Algorithm(AlgorithmType.NeoScrypt, "neoscrypt") }, - //{ AlgorithmType.WhirlpoolX , new Algorithm(AlgorithmType.WhirlpoolX, "whirlpoolx") }, - //{ AlgorithmType.Qubit , new Algorithm(AlgorithmType.Qubit, "qubit") }, - //{ AlgorithmType.Quark , new Algorithm(AlgorithmType.Quark, "quark") }, - //{ AlgorithmType.Lyra2RE , new Algorithm(AlgorithmType.Lyra2RE, "lyra2") }, { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "lyra2v2") }, - //{ AlgorithmType.Blake256r8 , new Algorithm(AlgorithmType.Blake256r8, "blakecoin") }, - //{ AlgorithmType.Blake256r14 , new Algorithm(AlgorithmType.Blake256r14, "blake") }, - //{ AlgorithmType.Blake256r8vnl , new Algorithm(AlgorithmType.Blake256r8vnl, "vanilla") }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") }, { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, From 9edd375f0d4e2aafa657cc8bdf4b8765bafd889b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 09:05:27 +0100 Subject: [PATCH 224/366] Hawaii CryptoNight separate defaults check --- NiceHashMiner/Devices/GroupAlgorithms.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 81fe8cd..9f91e6c 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -90,6 +90,11 @@ public static Dictionary CreateForDevice(ComputeDevice } } } + } else { // we are using sgminer for CryptoNight + // set different defaults for Hawaii + if (algoSettings.ContainsKey(AlgorithmType.CryptoNight) && device.Name.Contains("Hawaii")) { + algoSettings[AlgorithmType.CryptoNight].ExtraLaunchParameters = "--rawintensity 640 -w 8 -g 2"; + } } // drivers algos issue @@ -101,11 +106,7 @@ public static Dictionary CreateForDevice(ComputeDevice } } } - } - // check if AlgorithmType.DaggerHashimoto and sgminer - if (ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer) { - // TODO set best defaults - } + } // END AMD case // check if it is Etherum capable if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto) && device.IsEtherumCapale == false) { From 128a3206fb4d38968da89e01752d03ab1bc2a87d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 09:11:08 +0100 Subject: [PATCH 225/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index e3b4c30..3e11288 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.4.1")] -[assembly: AssemblyFileVersion("1.7.4.1")] +[assembly: AssemblyVersion("1.7.4.2")] +[assembly: AssemblyFileVersion("1.7.4.2")] From a756a57dbaf59b11ea0d9aedfe03952c41b0c734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 09:20:10 +0100 Subject: [PATCH 226/366] extra launch params dagger check miner --- NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 44b1423..e6550cf 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -365,7 +365,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith } else if (minerPath == MinerPaths.ClaymoreZcashMiner) { return Parse(MiningPairs, _ClaymoreZcash_Options); } - } else if (algorithmType == AlgorithmType.DaggerHashimoto) { // ethminer dagger + } else if (algorithmType == AlgorithmType.DaggerHashimoto && ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer == false) { // ethminer dagger // use if missing compute device for correct mapping // init fakes workaround var cdevs_mappings = new List(); From 295b6eb8184441b7b343d1fc5a5765e10dc38a4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 09:42:12 +0100 Subject: [PATCH 227/366] miner path return fix --- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 2 +- NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index f490cdc..1a1399e 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -107,7 +107,7 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy } } // 3rd party miner - if (algorithmType == AlgorithmType.CryptoNight && deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { + if (algorithmType == AlgorithmType.CryptoNight && deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES && ConfigManager.GeneralConfig.AMD_CryptoNight_ForceSgminer == false) { return MinerPaths.ClaymoreCryptoNightMiner; } // normal stuff diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index e6550cf..da61e09 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -340,7 +340,6 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith _showLog = showLog; // parse for nheqminer - bool deviceCheckSkip = algorithmType == AlgorithmType.Equihash || algorithmType == AlgorithmType.DaggerHashimoto; if (algorithmType == AlgorithmType.Equihash) { // nheqminer if (minerPath == MinerPaths.nheqminer) { @@ -365,7 +364,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith } else if (minerPath == MinerPaths.ClaymoreZcashMiner) { return Parse(MiningPairs, _ClaymoreZcash_Options); } - } else if (algorithmType == AlgorithmType.DaggerHashimoto && ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer == false) { // ethminer dagger + } else if (minerPath == MinerPaths.ethminer && algorithmType == AlgorithmType.DaggerHashimoto) { // ethminer dagger // use if missing compute device for correct mapping // init fakes workaround var cdevs_mappings = new List(); @@ -389,7 +388,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith return Parse(MiningPairs, _Claymore_cryptonight_Options); } else if (minerPath == MinerPaths.OptiminerZcashMiner) { return Parse(MiningPairs, _OptiminerZcash_Options); - } else if (deviceCheckSkip == false) { + } else { // parse for device if (deviceType == DeviceType.CPU) { CheckAndSetCPUPairs(MiningPairs); From 2e5a86ccb5c650d2088a163038d8326b7ac80ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 09:59:10 +0100 Subject: [PATCH 228/366] fix default settings val --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index 48a9920..60cb69f 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -112,7 +112,7 @@ public void SetDefaults() { DownloadInit3rdParty = false; AllowMultipleInstances = true; AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; - AMD_DaggerHashimoto_UseSgminer = false; + AMD_DaggerHashimoto_UseSgminer = true; AMD_CryptoNight_ForceSgminer = false; } From cfc86d74be4e0791ba790ff6e60cc16fc1a11c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 10:27:49 +0100 Subject: [PATCH 229/366] comment unused code --- NiceHashMiner/Links.cs | 2 +- NiceHashMiner/NiceHashStats.cs | 92 +++++++++++++++++----------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/NiceHashMiner/Links.cs b/NiceHashMiner/Links.cs index 5bbca97..bb98105 100644 --- a/NiceHashMiner/Links.cs +++ b/NiceHashMiner/Links.cs @@ -19,7 +19,7 @@ public static class Links { public static string NHM_API_stats = "https://www.nicehash.com/api?method=stats.provider&addr="; public static string NHM_API_info = "https://www.nicehash.com/api?method=simplemultialgo.info"; public static string NHM_API_version = "https://www.nicehash.com/nicehashminer?method=version"; - public static string NHM_API_stats_provider_workers = "https://www.nicehash.com/api?method=stats.provider.workers&addr="; + //public static string NHM_API_stats_provider_workers = "https://www.nicehash.com/api?method=stats.provider.workers&addr="; // device profits public static string NHM_Profit_Check = "https://www.nicehash.com/?utm_source=NHM&p=calc&name="; diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index 0cf5ceb..420a4ab 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -133,52 +133,52 @@ public static Dictionary GetAlgorithmRates(string wo } } - public static nicehash_worker_algo_stats GetWorkerAlgorithmAcceptedSpeeds(string btc, AlgorithmType algo, string worker) { - string args = String.Format("{0}&algo={1}", btc, (int)algo); - string r1 = GetNiceHashAPIData(Links.NHM_API_stats_provider_workers + args, worker); - if (r1 == null) return null; - - List ret = new List(); - nicehash_worker_algo_stats retEl = new nicehash_worker_algo_stats(algo); - nicehash_json_T nhjson_current; - try { - nhjson_current = JsonConvert.DeserializeObject>(r1, Globals.JsonSettings); - List all = new List(); - foreach (var worker_stat in nhjson_current.result.workers) { - if (worker_stat.Count >= 6) { - nicehash_worker_algo_stats_H tmp = new nicehash_worker_algo_stats_H(); - tmp.workerName = worker_stat[0] as string; - { - var toConv = worker_stat[1] as JObject; // Dictionary; - tmp.speedsStatus = new Dictionary(); - foreach (var pair in toConv) { - tmp.speedsStatus.Add(pair.Key, Helpers.ParseDouble(pair.Value.ToString())); - } - } - // other stuff don't care - //tmp.timeConnected = (int)worker_stat[2]; - //tmp.xnsub = (int)worker_stat[3]; - //tmp.difficulty = (double)worker_stat[4]; - //tmp.serviceLocation = (int)worker_stat[5]; - if (tmp.workerName == worker) { - ret.Add(tmp); - } - } - } - foreach (var r in ret) { - if (r.speedsStatus.ContainsKey("a")) { - retEl.accepted += r.speedsStatus["a"]; - } - if (r.speedsStatus.ContainsKey("rs")) { - retEl.rejected += r.speedsStatus["rs"]; - } - } - - return retEl; - } catch { - return null; - } - } + //public static nicehash_worker_algo_stats GetWorkerAlgorithmAcceptedSpeeds(string btc, AlgorithmType algo, string worker) { + // string args = String.Format("{0}&algo={1}", btc, (int)algo); + // string r1 = GetNiceHashAPIData(Links.NHM_API_stats_provider_workers + args, worker); + // if (r1 == null) return null; + + // List ret = new List(); + // nicehash_worker_algo_stats retEl = new nicehash_worker_algo_stats(algo); + // nicehash_json_T nhjson_current; + // try { + // nhjson_current = JsonConvert.DeserializeObject>(r1, Globals.JsonSettings); + // List all = new List(); + // foreach (var worker_stat in nhjson_current.result.workers) { + // if (worker_stat.Count >= 6) { + // nicehash_worker_algo_stats_H tmp = new nicehash_worker_algo_stats_H(); + // tmp.workerName = worker_stat[0] as string; + // { + // var toConv = worker_stat[1] as JObject; // Dictionary; + // tmp.speedsStatus = new Dictionary(); + // foreach (var pair in toConv) { + // tmp.speedsStatus.Add(pair.Key, Helpers.ParseDouble(pair.Value.ToString())); + // } + // } + // // other stuff don't care + // //tmp.timeConnected = (int)worker_stat[2]; + // //tmp.xnsub = (int)worker_stat[3]; + // //tmp.difficulty = (double)worker_stat[4]; + // //tmp.serviceLocation = (int)worker_stat[5]; + // if (tmp.workerName == worker) { + // ret.Add(tmp); + // } + // } + // } + // foreach (var r in ret) { + // if (r.speedsStatus.ContainsKey("a")) { + // retEl.accepted += r.speedsStatus["a"]; + // } + // if (r.speedsStatus.ContainsKey("rs")) { + // retEl.rejected += r.speedsStatus["rs"]; + // } + // } + + // return retEl; + // } catch { + // return null; + // } + //} public static nicehash_stats GetStats(string btc, int algo, string worker) From 500c086f8b41ab6c8425d76bee021ba3179e6563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 11:11:15 +0100 Subject: [PATCH 230/366] sgminer benchmark increase wait time --- NiceHashMiner/Miners/sgminer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 33f56d7..c2601f4 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -208,7 +208,7 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { } protected override void BenchmarkThreadRoutine(object CommandLine) { - Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); + Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS * 3); // increase wait for sgminer BenchmarkSignalQuit = false; BenchmarkSignalHanged = false; From 82e0732f8bec378cb8354946468a09223f1948e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 12:21:55 +0100 Subject: [PATCH 231/366] sgminer wait cryptonight restart at least 2seconds --- NiceHashMiner/Miners/Grouping/GroupMiner.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index 868d21a..b98fdf6 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -67,8 +67,12 @@ public void Start(string miningLocation, string btcAdress, string worker) { if(Miner.IsRunning) { return; } + int waitTimeMS = ConfigManager.GeneralConfig.MinerRestartDelayMS; + if (waitTimeMS < 2000 && Miner is sgminer && AlgorithmType == AlgorithmType.CryptoNight) { + waitTimeMS = 2000; + } // Wait before new start - System.Threading.Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); + System.Threading.Thread.Sleep(waitTimeMS); string name = Globals.NiceHashData[AlgorithmType].name; int port = Globals.NiceHashData[AlgorithmType].port; From 34f5b984da1101eb4b5781f02d35613baf8c1293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 12:22:59 +0100 Subject: [PATCH 232/366] revert prev commit --- NiceHashMiner/Miners/Grouping/GroupMiner.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index b98fdf6..868d21a 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -67,12 +67,8 @@ public void Start(string miningLocation, string btcAdress, string worker) { if(Miner.IsRunning) { return; } - int waitTimeMS = ConfigManager.GeneralConfig.MinerRestartDelayMS; - if (waitTimeMS < 2000 && Miner is sgminer && AlgorithmType == AlgorithmType.CryptoNight) { - waitTimeMS = 2000; - } // Wait before new start - System.Threading.Thread.Sleep(waitTimeMS); + System.Threading.Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); string name = Globals.NiceHashData[AlgorithmType].name; int port = Globals.NiceHashData[AlgorithmType].port; From 07ec6724394b487f3b6bd37fb9dd6e6e445fbe0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 23 Jan 2017 17:39:51 +0100 Subject: [PATCH 233/366] fix sgminer daggerhashimoto benchmark parsing --- NiceHashMiner/Miners/sgminer.cs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index c2601f4..2a6d273 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -144,7 +144,7 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti } protected override bool BenchmarkParseLine(string outdata) { - if (outdata.Contains("Average hashrate:") && outdata.Contains("/s")) { + if (outdata.Contains("Average hashrate:") && outdata.Contains("/s") && BenchmarkAlgorithm.NiceHashID != AlgorithmType.DaggerHashimoto) { int i = outdata.IndexOf(": "); int k = outdata.IndexOf("/s"); @@ -161,6 +161,30 @@ protected override bool BenchmarkParseLine(string outdata) { speed *= 1000000; BenchmarkAlgorithm.BenchmarkSpeed = speed; + return true; + } else if (outdata.Contains(String.Format("GPU{0}", MiningSetup.MiningPairs[0].Device.ID)) && outdata.Contains("s):") && BenchmarkAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto) { + int i = outdata.IndexOf("s):"); + int k = outdata.IndexOf("(avg)"); + + // save speed + string hashSpeed = outdata.Substring(i + 3, k - i + 3).Trim(); + hashSpeed = hashSpeed.Replace("(avg):", ""); + Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + hashSpeed); + + double mult = 1; + if (hashSpeed.Contains("K")) { + hashSpeed = hashSpeed.Replace("K", ""); + mult = 1000; + } else if (hashSpeed.Contains("M")) { + hashSpeed = hashSpeed.Replace("M", ""); + mult = 1000000; + } + + hashSpeed = hashSpeed.Substring(0, hashSpeed.IndexOf(" ")); + double speed = Double.Parse(hashSpeed, CultureInfo.InvariantCulture) * mult; + + BenchmarkAlgorithm.BenchmarkSpeed = speed; + return true; } return false; From e1d45d9092020417654454569dda1f26b9a8df48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 24 Jan 2017 23:16:16 +0100 Subject: [PATCH 234/366] AMD Temp control disabled by default --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 4 ++-- NiceHashMiner/Devices/GroupAlgorithms.cs | 26 ++++++++++----------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index 60cb69f..638e6a4 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -32,7 +32,7 @@ public class GeneralConfig { // TODO deprecate this public DeviceDetectionConfig DeviceDetection = new DeviceDetectionConfig(); - public bool DisableAMDTempControl = false; + public bool DisableAMDTempControl = true; public bool DisableDefaultOptimizations = false; public bool AutoScaleBTCValues = true; @@ -86,7 +86,7 @@ public void SetDefaults() { MinimizeToTray = false; BenchmarkTimeLimits = new BenchmarkTimeLimitsConfig(); DeviceDetection = new DeviceDetectionConfig(); - DisableAMDTempControl = false; + DisableAMDTempControl = true; DisableDefaultOptimizations = false; AutoScaleBTCValues = true; StartMiningWhenIdle = false; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 9f91e6c..914964e 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -20,29 +20,29 @@ public static Dictionary CreateForDevice(ComputeDevice // Check for optimized version if (device.IsOptimizedVersion) { if (algoSettings.ContainsKey(AlgorithmType.Qubit)) { - algoSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; + algoSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1"; } if (algoSettings.ContainsKey(AlgorithmType.Quark)) { - algoSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; + algoSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1"; } if (algoSettings.ContainsKey(AlgorithmType.Lyra2REv2)) { - algoSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 512 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; + algoSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 512 --thread-concurrency 0 --worksize 64 --gpu-threads 1"; } } else { // this is not the same as the constructor values?? check! if (algoSettings.ContainsKey(AlgorithmType.Qubit)) { - algoSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 4" + AmdGpuDevice.TemperatureParam; + algoSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 4"; } if (algoSettings.ContainsKey(AlgorithmType.Quark)) { - algoSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 256 --gpu-threads 1" + AmdGpuDevice.TemperatureParam; + algoSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 256 --gpu-threads 1"; } if (algoSettings.ContainsKey(AlgorithmType.Lyra2REv2)) { - algoSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam; + algoSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"; } } if (!device.Codename.Contains("Tahiti")) { if (algoSettings.ContainsKey(AlgorithmType.NeoScrypt)) { - algoSettings[AlgorithmType.NeoScrypt].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 2" + AmdGpuDevice.TemperatureParam; + algoSettings[AlgorithmType.NeoScrypt].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 2"; Helpers.ConsolePrint("ComputeDevice", "The GPU detected (" + device.Codename + ") is not Tahiti. Changing default gpu-threads to 2."); } } @@ -133,17 +133,17 @@ private static Dictionary CreateDefaultsForGroup(Devic string DefaultParam = AmdGpuDevice.DefaultParam; return new Dictionary() { { AlgorithmType.NeoScrypt , new Algorithm(AlgorithmType.NeoScrypt, "neoscrypt") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" + AmdGpuDevice.TemperatureParam } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" } }, { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "Lyra2REv2") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" + AmdGpuDevice.TemperatureParam } }, + { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" } }, { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "ethash") - { ExtraLaunchParameters = "--xintensity 512 -w 192 -g 1" + AmdGpuDevice.TemperatureParam } }, + { ExtraLaunchParameters = "--xintensity 512 -w 192 -g 1" } }, { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") - { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" + AmdGpuDevice.TemperatureParam } }, + { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" } }, { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") - { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" + AmdGpuDevice.TemperatureParam } }, + { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" } }, { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") - { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" + AmdGpuDevice.TemperatureParam } }, // TODO find best performance + { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" } }, // TODO find best performance { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } }; } From e4d012a5bdb5ba3a2577e57a5ee5df3f30b9ec31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 27 Jan 2017 22:42:33 +0100 Subject: [PATCH 235/366] fix claymore parsing flag, very minor fixes --- NiceHashMiner/Enums/MinerOptionType.cs | 1 + NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 2 -- NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs | 1 - NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs | 2 -- NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs | 1 + 5 files changed, 2 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs index 72ee38b..7920565 100644 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ b/NiceHashMiner/Enums/MinerOptionType.cs @@ -74,6 +74,7 @@ public enum MinerOptionType { ClaymoreCryptoNight_r, ClaymoreCryptoNight_nofee, ClaymoreCryptoNight_li, + ClaymoreCryptoNight_h, ClaymoreCryptoNight_tt, // -tt ClaymoreCryptoNight_ttli, // not present? ClaymoreCryptoNight_tstop, diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index e1d4e21..7c8f0ef 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -279,7 +279,5 @@ protected double getNumber(string outdata, string LOOK_FOR_START, string LOOK_FO } return 0; } - - } } diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index e79ebaa..cdfe363 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -38,6 +38,5 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti string ret = " -benchmark 1 " + GetDevicesCommandString(); return ret; } - } } diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs index 214d568..4ccf5cd 100644 --- a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -79,7 +79,6 @@ public override APIData GetSummary() { _currentMinerReadStatus = MinerAPIReadStatus.NONE; APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); - TcpClient client = null; JsonApiResponse resp = null; try { string DataToSend = GetHttpRequestNHMAgentStrin(""); @@ -91,7 +90,6 @@ public override APIData GetSummary() { resp = JsonConvert.DeserializeObject(respStrJSON.Trim(), Globals.JsonSettings); } } - client.Close(); //Helpers.ConsolePrint("OptiminerZcashMiner API back:", respStr); } catch (Exception ex) { Helpers.ConsolePrint("OptiminerZcashMiner", "GetSummary exception: " + ex.Message); diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index da61e09..4cc388f 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -117,6 +117,7 @@ static class ExtraLaunchParametersParser { //new MinerOption(MinerOptionType.ClaymoreCryptoNight_r , , , , MinerOptionFlagType.MultiParam, ","), new MinerOption(MinerOptionType.ClaymoreCryptoNight_nofee , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), new MinerOption(MinerOptionType.ClaymoreCryptoNight_li , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption(MinerOptionType.ClaymoreCryptoNight_h , "-h", "-h", "0", MinerOptionFlagType.MultiParam, ","), // temperature stuff //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all new MinerOption(MinerOptionType.ClaymoreCryptoNight_tt , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), From 1ab19aa18d3b92a1a5b7699563f8b78999fc7b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 30 Jan 2017 13:44:41 +0100 Subject: [PATCH 236/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 3e11288..d066a2a 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.4.2")] -[assembly: AssemblyFileVersion("1.7.4.2")] +[assembly: AssemblyVersion("1.7.4.3")] +[assembly: AssemblyFileVersion("1.7.4.3")] From 651351b71a4c85e823e1f64099bde69c100e6e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 31 Jan 2017 15:17:30 +0100 Subject: [PATCH 237/366] claymore miners remove log file creation --- NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs | 2 +- NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs index 057f0fc..2066007 100644 --- a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs @@ -21,7 +21,7 @@ public ClaymoreCryptoNightMiner() public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); - LastCommandLine = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -o " + url + " -u " + username + " -p x"; + LastCommandLine = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -o " + url + " -u " + username + " -p x -dbg -1"; ProcessHandle = _Start(); } diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index cdfe363..60d62b1 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -24,7 +24,7 @@ public ClaymoreZcashMiner() public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); - LastCommandLine = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -zpool " + url + " -zwal " + username + " -zpsw x"; + LastCommandLine = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -zpool " + url + " -zwal " + username + " -zpsw x -dbg -1"; ProcessHandle = _Start(); } From e467ea7f4fafb26784c484f7f22cf243c1dd79c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 3 Feb 2017 03:46:50 +0100 Subject: [PATCH 238/366] Claymore cryptonight ssl support --- NiceHashMiner/Enums/NHMConectionType.cs | 12 +++++ NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 1 + NiceHashMiner/Miners/Equihash/eqm.cs | 2 +- NiceHashMiner/Miners/Equihash/nheqminer.cs | 1 + NiceHashMiner/Miners/Grouping/GroupMiner.cs | 55 +++++++++++---------- NiceHashMiner/Miners/Miner.cs | 6 +-- NiceHashMiner/NiceHashMiner.csproj | 1 + 7 files changed, 47 insertions(+), 31 deletions(-) create mode 100644 NiceHashMiner/Enums/NHMConectionType.cs diff --git a/NiceHashMiner/Enums/NHMConectionType.cs b/NiceHashMiner/Enums/NHMConectionType.cs new file mode 100644 index 0000000..c45f2ad --- /dev/null +++ b/NiceHashMiner/Enums/NHMConectionType.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Enums { + public enum NHMConectionType { + NONE, + STRATUM_TCP, + STRATUM_SSL, + LOCKED // inhouse miners that are locked on NH (our eqm) + } +} diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index 7c8f0ef..16dca2a 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -26,6 +26,7 @@ public abstract class ClaymoreBaseMiner : Miner { public ClaymoreBaseMiner(string minerDeviceName, string minerPath, string minerExeName, string look_FOR_START) : base(minerDeviceName) { + ConectionType = NHMConectionType.STRATUM_SSL; Path = minerPath; MinerExeName = minerExeName; LOOK_FOR_START = look_FOR_START.ToLower(); diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index 3997d29..ced1893 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -9,7 +9,7 @@ namespace NiceHashMiner.Miners { public class eqm : nheqBase { public eqm() : base("eqm") { - IsNHLocked = true; + ConectionType = NHMConectionType.LOCKED; IsNeverHideMiningWindow = true; } diff --git a/NiceHashMiner/Miners/Equihash/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs index 26a44eb..50fa517 100644 --- a/NiceHashMiner/Miners/Equihash/nheqminer.cs +++ b/NiceHashMiner/Miners/Equihash/nheqminer.cs @@ -15,6 +15,7 @@ namespace NiceHashMiner.Miners { public class nheqminer : nheqBase { public nheqminer() : base("nheqminer") { + ConectionType = NHMConectionType.NONE; Path = MinerPaths.nheqminer; WorkingDirectory = MinerPaths.nheqminer.Replace("nheqminer.exe", ""); } diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index 868d21a..c62102c 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -63,6 +63,32 @@ public void End() { CurrentRate = 0; } + private string GetLocationURL(string miningLocation, NHMConectionType ConectionType) { + string name = Globals.NiceHashData[AlgorithmType].name; + int n_port = Globals.NiceHashData[AlgorithmType].port; + int ssl_port = 30000 + n_port; + + // NHMConectionType.NONE + string prefix = ""; + int port = n_port; + if (NHMConectionType.LOCKED == Miner.ConectionType) { + return miningLocation; + } + if (NHMConectionType.STRATUM_TCP == Miner.ConectionType) { + prefix = "stratum+tcp://"; + } + if (NHMConectionType.STRATUM_SSL == Miner.ConectionType) { + prefix = "stratum+ssl://"; + port = ssl_port; + } + + return prefix + + name + + "." + miningLocation + + ".nicehash.com:" + + port; + } + public void Start(string miningLocation, string btcAdress, string worker) { if(Miner.IsRunning) { return; @@ -70,33 +96,8 @@ public void Start(string miningLocation, string btcAdress, string worker) { // Wait before new start System.Threading.Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); - string name = Globals.NiceHashData[AlgorithmType].name; - int port = Globals.NiceHashData[AlgorithmType].port; - if (AlgorithmType == AlgorithmType.Equihash) { - if (Miner.IsNHLocked) { - Miner.Start(miningLocation, btcAdress, worker); - } else if(Miner is ClaymoreZcashMiner) { - Miner.Start( - "stratum+ssl://" - + name - + "." + miningLocation - + ".nicehash.com:" - + 33357, btcAdress, worker); - } else { - Miner.Start( - name - + "." + miningLocation - + ".nicehash.com:" - + port, btcAdress, worker); - } - } else { - Miner.Start( - "stratum+tcp://" - + name - + "." + miningLocation - + ".nicehash.com:" - + port, btcAdress, worker); - } + string locationURL = GetLocationURL(miningLocation, Miner.ConectionType); + Miner.Start(locationURL, btcAdress, worker); } } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 3cb45db..ced4654 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -45,6 +45,8 @@ public abstract class Miner { // MINER_ID_COUNT used to identify miners creation protected static long MINER_ID_COUNT { get; private set; } + + public NHMConectionType ConectionType { get; protected set; } // used to identify miner instance protected readonly long MINER_ID; private string _minetTag = null; @@ -52,8 +54,6 @@ public abstract class Miner { protected int APIPort { get; private set; } // if miner has no API bind port for reading curentlly only CryptoNight on ccminer public bool IsAPIReadException { get; protected set; } - // inhouse miners that are locked on NH (our eqm) - public bool IsNHLocked { get; protected set; } public bool IsNeverHideMiningWindow { get; protected set; } // mining algorithm stuff protected bool IsInit { get; private set; } @@ -111,6 +111,7 @@ public abstract class Miner { public Miner(string minerDeviceName) { + ConectionType = NHMConectionType.STRATUM_TCP; MiningSetup = new MiningSetup(null); IsInit = false; MINER_ID = MINER_ID_COUNT++; @@ -127,7 +128,6 @@ public Miner(string minerDeviceName) APIPort = MinersApiPortsManager.GetAvaliablePort(); IsAPIReadException = false; - IsNHLocked = false; IsNeverHideMiningWindow = false; IsKillAllUsedMinerProcs = false; _MAX_CooldownTimeInMilliseconds = GET_MAX_CooldownTimeInMilliseconds(); diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 62719c1..bde9c80 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -117,6 +117,7 @@ + UserControl From ff88a73a70bc7eb741d2de92a8c6b20229ac4a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 3 Feb 2017 15:49:03 +0100 Subject: [PATCH 239/366] added multiminer per algo support (broken WIP) --- NiceHashMiner/Algorithm.cs | 9 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 292 ++++++++++-------- NiceHashMiner/Enums/MinerBaseType.cs | 17 + NiceHashMiner/Miners/Grouping/MinerPaths.cs | 89 +++++- NiceHashMiner/Miners/MinerFactory.cs | 50 +++ .../Parsing/ExtraLaunchParametersParser.cs | 2 +- NiceHashMiner/NiceHashMiner.csproj | 2 + 7 files changed, 325 insertions(+), 136 deletions(-) create mode 100644 NiceHashMiner/Enums/MinerBaseType.cs create mode 100644 NiceHashMiner/Miners/MinerFactory.cs diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index 62a4c39..47fcea6 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -7,6 +7,7 @@ namespace NiceHashMiner { public class Algorithm { readonly public AlgorithmType NiceHashID; + readonly public MinerBaseType MinerBaseType; // Miner name is used for miner ALGO flag parameter readonly public string MinerName; public double BenchmarkSpeed { get; set; } @@ -18,8 +19,14 @@ public class Algorithm { // avarage speed of same devices to increase mining stability public double AvaragedSpeed { get; set; } + // based on device and settings here we set the miner path + public string MinerBinaryPath = ""; + // TODO these are changing (logging reasons) + public double CurrentProfit = 0; + public double CurNhmSMADataVal = 0; - public Algorithm(AlgorithmType niceHashID, string minerName) { + public Algorithm(MinerBaseType minerBaseType, AlgorithmType niceHashID, string minerName) { + MinerBaseType = minerBaseType; NiceHashID = niceHashID; MinerName = minerName; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 914964e..e89ba68 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -12,64 +12,54 @@ namespace NiceHashMiner.Devices { public static class GroupAlgorithms { - public static Dictionary CreateForDevice(ComputeDevice device) { + public static Dictionary> CreateForDevice(ComputeDevice device) { if (device != null) { var algoSettings = CreateDefaultsForGroup(device.DeviceGroupType); if (algoSettings != null) { if (device.DeviceType == DeviceType.AMD) { - // Check for optimized version - if (device.IsOptimizedVersion) { - if (algoSettings.ContainsKey(AlgorithmType.Qubit)) { - algoSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1"; - } - if (algoSettings.ContainsKey(AlgorithmType.Quark)) { - algoSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1"; - } - if (algoSettings.ContainsKey(AlgorithmType.Lyra2REv2)) { - algoSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 512 --thread-concurrency 0 --worksize 64 --gpu-threads 1"; - } - } else { - // this is not the same as the constructor values?? check! - if (algoSettings.ContainsKey(AlgorithmType.Qubit)) { - algoSettings[AlgorithmType.Qubit].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 4"; - } - if (algoSettings.ContainsKey(AlgorithmType.Quark)) { - algoSettings[AlgorithmType.Quark].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 256 --gpu-threads 1"; - } - if (algoSettings.ContainsKey(AlgorithmType.Lyra2REv2)) { - algoSettings[AlgorithmType.Lyra2REv2].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"; + // sgminer stuff + if (algoSettings.ContainsKey(MinerBaseType.sgminer)) { + var sgminerAlgos = algoSettings[MinerBaseType.sgminer]; + int Lyra2REv2_Index = sgminerAlgos.FindIndex((el) => el.NiceHashID == AlgorithmType.Lyra2REv2); + int NeoScrypt_Index = sgminerAlgos.FindIndex((el) => el.NiceHashID == AlgorithmType.NeoScrypt); + int CryptoNight_Index = sgminerAlgos.FindIndex((el) => el.NiceHashID == AlgorithmType.CryptoNight); + + // Check for optimized version + if (Lyra2REv2_Index > -1) { + if (device.IsOptimizedVersion) { + sgminerAlgos[Lyra2REv2_Index].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 512 --thread-concurrency 0 --worksize 64 --gpu-threads 1"; + } else { + sgminerAlgos[Lyra2REv2_Index].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"; + } } - } - if (!device.Codename.Contains("Tahiti")) { - if (algoSettings.ContainsKey(AlgorithmType.NeoScrypt)) { - algoSettings[AlgorithmType.NeoScrypt].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 2"; + + if (!device.Codename.Contains("Tahiti") && NeoScrypt_Index > -1) { + sgminerAlgos[NeoScrypt_Index].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 2"; Helpers.ConsolePrint("ComputeDevice", "The GPU detected (" + device.Codename + ") is not Tahiti. Changing default gpu-threads to 2."); } + if (CryptoNight_Index > -1 && device.Name.Contains("Hawaii")) { + sgminerAlgos[CryptoNight_Index].ExtraLaunchParameters = "--rawintensity 640 -w 8 -g 2"; + } } // Ellesmere, Polaris // Ellesmere sgminer workaround, keep this until sgminer is fixed to work with Ellesmere if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris")) && Globals.IsEllesmereSgminerIgnore) { // remove all algos except equi and dagger - List toRemove = new List(); - foreach (var key in algoSettings.Keys) { - if (AlgorithmType.DaggerHashimoto != key && AlgorithmType.Equihash != key && AlgorithmType.CryptoNight != key) { - toRemove.Add(key); - } - } - // remove keys - foreach (var key in toRemove) { - algoSettings.Remove(key); - } + var ignoreRemove = new List {AlgorithmType.DaggerHashimoto, AlgorithmType.Equihash, AlgorithmType.CryptoNight}; + var toRemove = GetKeysForMinerAlgosGroup(algoSettings).FindAll((algoType) => ignoreRemove.IndexOf(algoType) == -1); + algoSettings = FilterMinerAlgos(algoSettings, toRemove); + // remove all sgminer? + // algoSettings = FilterMinerBaseTypes(algoSettings, [MinerBaseType.sgminer]); } else if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris"))) { - if (algoSettings.ContainsKey(AlgorithmType.NeoScrypt)) { - algoSettings.Remove(AlgorithmType.NeoScrypt); - } + algoSettings = FilterMinerAlgos(algoSettings, new List { AlgorithmType.NeoScrypt} ); } // check if 3rd party is enabled and allow 3rd party only algos - if (ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES && ConfigManager.GeneralConfig.AMD_CryptoNight_ForceSgminer == false) { - if (algoSettings.ContainsKey(AlgorithmType.CryptoNight)) { + if (algoSettings.ContainsKey(MinerBaseType.ClaymoreAMD)) { + var ClaymoreAlgos = algoSettings[MinerBaseType.sgminer]; + int CryptoNight_Index = ClaymoreAlgos.FindIndex((el) => el.NiceHashID == AlgorithmType.CryptoNight); + if (CryptoNight_Index > -1) { //string regex_a_3 = "[5|6][0-9][0-9][0-9]"; List a_4 = new List() { "270", @@ -85,32 +75,27 @@ public static Dictionary CreateForDevice(ComputeDevice "480"}; foreach (var namePart in a_4) { if (device.Name.Contains(namePart)) { - algoSettings[AlgorithmType.CryptoNight].ExtraLaunchParameters = "-a 4"; + ClaymoreAlgos[CryptoNight_Index].ExtraLaunchParameters = "-a 4"; break; } } } - } else { // we are using sgminer for CryptoNight - // set different defaults for Hawaii - if (algoSettings.ContainsKey(AlgorithmType.CryptoNight) && device.Name.Contains("Hawaii")) { - algoSettings[AlgorithmType.CryptoNight].ExtraLaunchParameters = "--rawintensity 640 -w 8 -g 2"; - } } // drivers algos issue if (device.DriverDisableAlgos) { - List _3rdPartyOnlyAlgos = new List() { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2REv2 }; - foreach (var algoType in _3rdPartyOnlyAlgos) { - if (algoSettings.ContainsKey(algoType)) { - algoSettings.Remove(algoType); - } - } + algoSettings = FilterMinerAlgos(algoSettings, new List { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2REv2 }); + } + + // also check for Equihash as nheqminer it needs 2GB GPU + if (device.IsEtherumCapale == false) { + algoSettings = FilterMinerBaseTypes(algoSettings, new List { MinerBaseType.nheqminer }); } } // END AMD case // check if it is Etherum capable - if (algoSettings.ContainsKey(AlgorithmType.DaggerHashimoto) && device.IsEtherumCapale == false) { - algoSettings.Remove(AlgorithmType.DaggerHashimoto); + if (device.IsEtherumCapale == false) { + algoSettings = FilterMinerAlgos(algoSettings, new List { AlgorithmType.DaggerHashimoto }); } } @@ -119,106 +104,161 @@ public static Dictionary CreateForDevice(ComputeDevice return null; } - private static Dictionary CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { + private static Dictionary> CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { if (DeviceGroupType.CPU == deviceGroupType) { - return new Dictionary() { - { AlgorithmType.Lyra2RE, new Algorithm(AlgorithmType.Lyra2RE, "lyra2") }, - { AlgorithmType.Hodl, new Algorithm(AlgorithmType.Hodl, "hodl") }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, - { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } + return new Dictionary>() { + { MinerBaseType.cpuminer, + new List() { + new Algorithm(MinerBaseType.cpuminer, AlgorithmType.Lyra2RE, "lyra2"), + new Algorithm(MinerBaseType.cpuminer, AlgorithmType.Hodl, "hodl"), + new Algorithm(MinerBaseType.cpuminer, AlgorithmType.CryptoNight, "cryptonight") + } + }, + { MinerBaseType.nheqminer, + new List() { + new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") + } + }, + { MinerBaseType.eqm, + new List() { + new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") + } + } + }; } if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { // DisableAMDTempControl = false; TemperatureParam must be appended lastly string DefaultParam = AmdGpuDevice.DefaultParam; - return new Dictionary() { - { AlgorithmType.NeoScrypt , new Algorithm(AlgorithmType.NeoScrypt, "neoscrypt") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" } }, - { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "Lyra2REv2") - { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" } }, - { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "ethash") - { ExtraLaunchParameters = "--xintensity 512 -w 192 -g 1" } }, - { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") - { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" } }, - { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") - { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" } }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") - { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" } }, // TODO find best performance - { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } + return new Dictionary>() { + { MinerBaseType.sgminer, + new List() { + new Algorithm(MinerBaseType.sgminer, AlgorithmType.NeoScrypt, "neoscrypt") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lyra2REv2, "Lyra2REv2") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.DaggerHashimoto, "ethash") { ExtraLaunchParameters = "--xintensity 512 -w 192 -g 1" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" } + } + }, + { MinerBaseType.ethminer, + new List() { + new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto") + } + }, + { MinerBaseType.nheqminer, + new List() { + new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") + } + }, + { MinerBaseType.ClaymoreAMD, + new List() { + new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.CryptoNight, "cryptonight"), /*, { ExtraLaunchParameters: "-a 4" }*/ + new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.Equihash, "equihash") + } + }, + { MinerBaseType.OptiminerAMD, + new List() { + new Algorithm(MinerBaseType.OptiminerAMD, AlgorithmType.Equihash, "equihash") + } + }, }; } // NVIDIA if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType || DeviceGroupType.NVIDIA_5_0 == deviceGroupType || DeviceGroupType.NVIDIA_5_2 == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { - var ret = new Dictionary { - { AlgorithmType.NeoScrypt , new Algorithm(AlgorithmType.NeoScrypt, "neoscrypt") }, - { AlgorithmType.Lyra2REv2 , new Algorithm(AlgorithmType.Lyra2REv2, "lyra2v2") }, - { AlgorithmType.DaggerHashimoto , new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto") }, - { AlgorithmType.Decred , new Algorithm(AlgorithmType.Decred, "decred") }, - { AlgorithmType.CryptoNight, new Algorithm(AlgorithmType.CryptoNight, "cryptonight") }, - { AlgorithmType.Lbry, new Algorithm(AlgorithmType.Lbry, "lbry") }, - { AlgorithmType.Equihash, new Algorithm(AlgorithmType.Equihash, "equihash") } + var ToRemoveAlgoTypes = new List(); + var ret = new Dictionary>() { + { MinerBaseType.ccminer, + new List() { + new Algorithm(MinerBaseType.ccminer, AlgorithmType.NeoScrypt, "neoscrypt"), + new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lyra2REv2, "lyra2v2"), + new Algorithm(MinerBaseType.ccminer, AlgorithmType.Decred, "decred"), + new Algorithm(MinerBaseType.ccminer, AlgorithmType.CryptoNight, "cryptonight"), + new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lbry, "lbry") + } + }, + { MinerBaseType.ethminer, + new List() { + new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto") + } + }, + { MinerBaseType.nheqminer, + new List() { + new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") + } + }, + { MinerBaseType.eqm, + new List() { + new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") + } + }, }; if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType) { - // minerName change => "whirlpoolx" => "whirlpool" - if (ret.ContainsKey(AlgorithmType.WhirlpoolX)) { - ret[AlgorithmType.WhirlpoolX] = new Algorithm(AlgorithmType.WhirlpoolX, "whirlpool"); // Needed for new tpruvot's ccminer - } - // disable/remove neoscrypt - if (ret.ContainsKey(AlgorithmType.NeoScrypt)) { - ret.Remove(AlgorithmType.NeoScrypt); - } - if (ret.ContainsKey(AlgorithmType.Lyra2RE)) { - ret.Remove(AlgorithmType.Lyra2RE); - } - if (ret.ContainsKey(AlgorithmType.Lyra2REv2)) { - ret.Remove(AlgorithmType.Lyra2REv2); - } + ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { + AlgorithmType.WhirlpoolX, + AlgorithmType.NeoScrypt, + AlgorithmType.Lyra2RE, + AlgorithmType.Lyra2REv2 + }); } if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { - // disable/remove daggerhashimoto - if (ret.ContainsKey(AlgorithmType.DaggerHashimoto)) { - ret.Remove(AlgorithmType.DaggerHashimoto); - } - if (ret.ContainsKey(AlgorithmType.CryptoNight)) { - ret.Remove(AlgorithmType.CryptoNight); - } + ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { + AlgorithmType.DaggerHashimoto, + AlgorithmType.CryptoNight + }); } - return ret; + + // filter unused + var finalRet = FilterMinerAlgos(ret, ToRemoveAlgoTypes); + + return finalRet; } return null; } - private static bool _IsAlgosInGroupInit = false; - private static Dictionary> _algosInGroup = new Dictionary>(); - private static void InitAlgosInGroup() { - for (DeviceGroupType type = DeviceGroupType.CPU; type < DeviceGroupType.LAST; ++type) { - var supportedList = GetAlgorithmKeysForGroup(type); - if(supportedList != null) { - _algosInGroup[type] = supportedList; + static Dictionary> FilterMinerBaseTypes(Dictionary> minerAlgos, List toRemove) { + var finalRet = new Dictionary>(); + foreach (var kvp in minerAlgos) { + if (toRemove.IndexOf(kvp.Key) == -1) { + finalRet[kvp.Key] = kvp.Value; } } - _IsAlgosInGroupInit = true; + return finalRet; } - public static bool IsAlgorithmSupportedForGroup(AlgorithmType algorithmType, DeviceGroupType deviceGroupType) { - // lazy init - if (_IsAlgosInGroupInit == false) { - InitAlgosInGroup(); - } - if (_algosInGroup.ContainsKey(deviceGroupType)) { - return _algosInGroup[deviceGroupType].Contains(algorithmType); + static Dictionary> FilterMinerAlgos(Dictionary> minerAlgos, List toRemove) { + var finalRet = new Dictionary>(); + foreach (var kvp in minerAlgos) { + var algoList = kvp.Value.FindAll((a) => toRemove.IndexOf(a.NiceHashID) == -1); + if (algoList.Count > 0) { + finalRet[kvp.Key] = algoList; + } } - return false; + return finalRet; } - private static List GetAlgorithmKeysForGroup(DeviceGroupType deviceGroupType) { - var ret = CreateDefaultsForGroup(deviceGroupType); - if (ret != null) { - return new List (ret.Keys); + static List GetKeysForMinerAlgosGroup(Dictionary> minerAlgos) { + List ret = new List(); + foreach (var kvp in minerAlgos) { + var currentKeys = kvp.Value.ConvertAll((a) => a.NiceHashID); + foreach (var key in currentKeys) { + if (ret.Contains(key) == false) { + ret.Add(key); + } + } } - return null; + return ret; } + + //private static List GetAlgorithmKeysForGroup(DeviceGroupType deviceGroupType) { + // var ret = CreateDefaultsForGroup(deviceGroupType); + // if (ret != null) { + // return new List (ret.Keys); + // } + // return null; + //} + } } diff --git a/NiceHashMiner/Enums/MinerBaseType.cs b/NiceHashMiner/Enums/MinerBaseType.cs new file mode 100644 index 0000000..9b53583 --- /dev/null +++ b/NiceHashMiner/Enums/MinerBaseType.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Enums { + public enum MinerBaseType { + NONE = 0, + cpuminer, + ccminer, + sgminer, + nheqminer, + eqm, + ethminer, + ClaymoreAMD, + OptiminerAMD + } +} diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 1a1399e..12073fd 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -66,6 +66,65 @@ public static class MinerPaths public const string ClaymoreCryptoNightMiner = _bin_3rdparty + @"\claymore_cryptonight\NsGpuCNMiner.exe"; public const string OptiminerZcashMiner = _bin_3rdparty + @"\optiminer_zcash_win\Optiminer.exe"; + // NEW START + //////////////////////////////////////////// + // Pure functions + public static bool IsMinerAlgorithmAvaliable(List algos, MinerBaseType minerBaseType, AlgorithmType algorithmType) { + return algos.FindIndex((a) => a.MinerBaseType == minerBaseType && a.NiceHashID == algorithmType) > -1; + } + + public static string GetPathFor(ComputeDevice computeDevice, Algorithm algorithm /*, Options: MinerPathsConfig*/) { + if (computeDevice == null || algorithm == null) { + return MinerPaths.NONE; + } + var algoType = algorithm.NiceHashID; + var devGroupType = computeDevice.DeviceGroupType; + var devCodename = computeDevice.Codename; + var isOptimized = computeDevice.IsOptimizedVersion; + switch (algorithm.MinerBaseType) { + case MinerBaseType.cpuminer: + return CPU_GROUP.cpu_miner_opt(CPUUtils.GetMostOptimized()/*Options.MostOptimizedCPUExtensionType*/); + case MinerBaseType.ccminer: + return NVIDIA_GROUPS.ccminer_path(algoType, devGroupType); + case MinerBaseType.sgminer: + return AMD_GROUP.sgminer_path(algoType, devCodename, isOptimized); + case MinerBaseType.nheqminer: + return MinerPaths.nheqminer; + case MinerBaseType.eqm: + return MinerPaths.eqm; + case MinerBaseType.ethminer: + return MinerPaths.ethminer; + case MinerBaseType.ClaymoreAMD: + return AMD_GROUP.ClaymorePath(algoType); + case MinerBaseType.OptiminerAMD: + return MinerPaths.OptiminerZcashMiner; + } + return MinerPaths.NONE; + } + + public static bool IsValidMinerPath(string minerPath) { + // TODO make a list of valid miner paths and check that instead + return minerPath != null && MinerPaths.NONE != minerPath && minerPath != ""; + } + + /** + * InitAlgorithmsMinerPaths gets and sets miner paths + */ + public static List GetAndInitAlgorithmsMinerPaths(List algos, ComputeDevice computeDevice/*, Options: MinerPathsConfig*/) { + var retAlgos = algos.FindAll((a) => a != null).ConvertAll((a) => { + a.MinerBinaryPath = GetPathFor(computeDevice, a/*, Options*/); + return a; + }); + //// TODO settup what to use what not Options + //const thirdPartyMiners = [MinerBaseType.ClaymoreAMD, MinerBaseType.OptiminerAMD]; + //if (Options.Use3rdPartyMiners != Use3rdPartyMiners.YES) { + // retAlgos = retAlgos.filter((a) => thirdPartyMiners.indexOf(a.MinerBaseType) == -1); + //} + + return retAlgos; + } + // NEW END + public static string GetOptimizedMinerPath(MiningPair pair) { return GetOptimizedMinerPath(pair.Device, pair.Algorithm); } @@ -118,14 +177,7 @@ public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceTy // NVIDIA if (deviceType == DeviceType.NVIDIA) { var nvidiaGroup = deviceGroupType; - // sm21 and sm3x have same settings - if (nvidiaGroup == DeviceGroupType.NVIDIA_2_1 || nvidiaGroup == DeviceGroupType.NVIDIA_3_x) { - return NVIDIA_GROUPS.ccminer_sm21_or_sm3x(algorithmType); - } - // sm5x and sm6x have same settings - if (nvidiaGroup == DeviceGroupType.NVIDIA_5_0 || nvidiaGroup == DeviceGroupType.NVIDIA_5_2 || nvidiaGroup == DeviceGroupType.NVIDIA_6_x) { - return NVIDIA_GROUPS.ccminer_sm5x_or_sm6x(algorithmType); - } + } // AMD if (deviceType == DeviceType.AMD) { @@ -166,6 +218,18 @@ public static string ccminer_sm5x_or_sm6x(AlgorithmType algorithmType) { return MinerPaths.ccminer_sp; } + public static string ccminer_path(AlgorithmType algorithmType, DeviceGroupType nvidiaGroup) { + // sm21 and sm3x have same settings + if (nvidiaGroup == DeviceGroupType.NVIDIA_2_1 || nvidiaGroup == DeviceGroupType.NVIDIA_3_x) { + return NVIDIA_GROUPS.ccminer_sm21_or_sm3x(algorithmType); + } + // sm5x and sm6x have same settings + if (nvidiaGroup == DeviceGroupType.NVIDIA_5_0 || nvidiaGroup == DeviceGroupType.NVIDIA_5_2 || nvidiaGroup == DeviceGroupType.NVIDIA_6_x) { + return NVIDIA_GROUPS.ccminer_sm5x_or_sm6x(algorithmType); + } + // TODO wrong case? + return MinerPaths.NONE; // should not happen + } } static class AMD_GROUP { @@ -190,6 +254,15 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i return MinerPaths.sgminer_5_5_0_general; } + + public static string ClaymorePath(AlgorithmType type) { + if(AlgorithmType.Equihash == type) { + return MinerPaths.ClaymoreZcashMiner; + } else if(AlgorithmType.CryptoNight == type) { + return MinerPaths.ClaymoreCryptoNightMiner; + } + return MinerPaths.NONE; // should not happen + } } static class CPU_GROUP { diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs new file mode 100644 index 0000000..7718051 --- /dev/null +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -0,0 +1,50 @@ +using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Equihash; +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Miners { + public class MinerFactory { + + private static Miner CreateEthminer(DeviceType deviceType) { + if (DeviceType.AMD == deviceType) { + return new MinerEtherumOCL(/*minersConfig*/); + } else if(DeviceType.NVIDIA == deviceType) { + return new MinerEtherumCUDA(/*minersConfig*/); + } + return null; + } + + private static Miner CreateClaymore(AlgorithmType algorithmType) { + if (AlgorithmType.Equihash == algorithmType) { + return new ClaymoreZcashMiner(/*minersConfig*/); + } else if (AlgorithmType.CryptoNight == algorithmType) { + return new ClaymoreCryptoNightMiner(/*minersConfig*/); + } + return null; + } + + public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmType, MinerBaseType minerBaseType /*, /*minersConfig: minersConfig*/) { + switch (minerBaseType) { + case MinerBaseType.cpuminer: + return new cpuminer(/*minersConfig*/); + case MinerBaseType.ccminer: + return new ccminer(/*minersConfig*/); + case MinerBaseType.sgminer: + return new sgminer(/*minersConfig*/); + case MinerBaseType.nheqminer: + return new nheqminer(/*minersConfig*/); + case MinerBaseType.eqm: + return new eqm(/*minersConfig*/); + case MinerBaseType.ethminer: + return CreateEthminer(deviceType); + case MinerBaseType.ClaymoreAMD: + return CreateClaymore(algorithmType); + case MinerBaseType.OptiminerAMD: + return new OptiminerZcashMiner(/*minersConfig*/); + } + return null; + } + } +} diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 4cc388f..3694267 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -371,7 +371,7 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith var cdevs_mappings = new List(); { int id = -1; - var fakeAlgo = new Algorithm(AlgorithmType.DaggerHashimoto, "daggerhashimoto"); + var fakeAlgo = new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto"); foreach (var pair in MiningPairs) { while (++id != pair.Device.ID) { var fakeCdev = new ComputeDevice(id); diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index bde9c80..c4d355e 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -114,6 +114,7 @@ + @@ -204,6 +205,7 @@ + From 9f53de5412df6d4531cf6693b64bc56f95467cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 3 Feb 2017 18:06:16 +0100 Subject: [PATCH 240/366] multi miner per algo (GUI fixes, WIP) --- NiceHashMiner/Algorithm.cs | 24 +++-- NiceHashMiner/Configs/ConfigManager.cs | 2 +- NiceHashMiner/Configs/Data/AlgorithmConfig.cs | 4 +- .../Configs/Data/DeviceBenchmarkConfig.cs | 2 +- NiceHashMiner/Devices/ComputeDevice.cs | 98 +++++++++---------- NiceHashMiner/Devices/ComputeDeviceManager.cs | 7 -- NiceHashMiner/Devices/GroupAlgorithms.cs | 9 ++ .../Components/AlgorithmSettingsControl.cs | 2 +- .../Forms/Components/AlgorithmsListView.cs | 51 +++++----- NiceHashMiner/Forms/Form_3rdParty_TOS.cs | 4 - NiceHashMiner/Forms/Form_Benchmark.cs | 32 +++--- NiceHashMiner/Forms/Form_Main.cs | 8 +- NiceHashMiner/Forms/Form_Settings.cs | 44 ++++----- .../Miners/Grouping/GroupSetupUtils.cs | 89 ++++++++--------- .../Miners/Grouping/MiningAlgorithm.cs | 34 ------- NiceHashMiner/Miners/Grouping/MiningDevice.cs | 46 +++++---- NiceHashMiner/Miners/Miner.cs | 4 +- NiceHashMiner/Miners/MiningSession.cs | 10 +- NiceHashMiner/Miners/ccminer.cs | 5 +- NiceHashMiner/Miners/sgminer.cs | 6 +- NiceHashMiner/NiceHashMiner.csproj | 1 - 21 files changed, 232 insertions(+), 250 deletions(-) delete mode 100644 NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index 47fcea6..09d414e 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -6,13 +6,17 @@ namespace NiceHashMiner { public class Algorithm { - readonly public AlgorithmType NiceHashID; - readonly public MinerBaseType MinerBaseType; + + public readonly string AlgorithmName; + public readonly string MinerBaseTypeName; + public readonly AlgorithmType NiceHashID; + public readonly MinerBaseType MinerBaseType; + public readonly string AlgorithmStringID; // Miner name is used for miner ALGO flag parameter - readonly public string MinerName; + public readonly string MinerName; public double BenchmarkSpeed { get; set; } public string ExtraLaunchParameters { get; set; } - public bool Skip { get; set; } + public bool Enabled { get; set; } // CPU miners only setting public int LessThreads { get; set; } @@ -26,6 +30,10 @@ public class Algorithm { public double CurNhmSMADataVal = 0; public Algorithm(MinerBaseType minerBaseType, AlgorithmType niceHashID, string minerName) { + this.AlgorithmName = AlgorithmNiceHashNames.GetName(niceHashID); + this.MinerBaseTypeName = Enum.GetName(typeof(MinerBaseType), minerBaseType); + this.AlgorithmStringID = this.MinerBaseTypeName + "_" + this.AlgorithmName; + MinerBaseType = minerBaseType; NiceHashID = niceHashID; MinerName = minerName; @@ -33,14 +41,10 @@ public Algorithm(MinerBaseType minerBaseType, AlgorithmType niceHashID, string m BenchmarkSpeed = 0.0d; ExtraLaunchParameters = ""; LessThreads = 0; - Skip = false; + Enabled = true; BenchmarkStatus = ""; } - public string GetName() { - return AlgorithmNiceHashNames.GetName(this.NiceHashID); - } - // benchmark info public string BenchmarkStatus { get; set; } public bool IsBenchmarkPending { get; private set; } @@ -76,7 +80,7 @@ public void ClearBenchmarkPending() { } public string BenchmarkSpeedString() { - if (!Skip && IsBenchmarkPending && !string.IsNullOrEmpty(BenchmarkStatus)) { + if (Enabled && IsBenchmarkPending && !string.IsNullOrEmpty(BenchmarkStatus)) { return BenchmarkStatus; } else if (BenchmarkSpeed > 0) { return Helpers.FormatSpeedOutput(BenchmarkSpeed); diff --git a/NiceHashMiner/Configs/ConfigManager.cs b/NiceHashMiner/Configs/ConfigManager.cs index 76cf2e7..52c9460 100644 --- a/NiceHashMiner/Configs/ConfigManager.cs +++ b/NiceHashMiner/Configs/ConfigManager.cs @@ -132,7 +132,7 @@ public static void AfterDeviceQueryInitialization() { { List invalidDevices = new List(); foreach (var CDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (CDev.AlgorithmSettings == null) { + if (CDev.IsAlgorithmSettingsInitialized() == false) { Helpers.ConsolePrint(TAG, "CRITICAL ISSUE!!! Device has AlgorithmSettings == null. Will remove"); invalidDevices.Add(CDev); } diff --git a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs index e07082a..f9149f4 100644 --- a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs +++ b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs @@ -6,11 +6,13 @@ namespace NiceHashMiner.Configs.Data { [Serializable] public class AlgorithmConfig { + public string Name = ""; // Used as an indicator for easier user interaction public AlgorithmType NiceHashID = AlgorithmType.NONE; + public MinerBaseType MinerBaseType = MinerBaseType.NONE; public string MinerName = ""; // TODO probably not needed public double BenchmarkSpeed = 0; public string ExtraLaunchParameters= ""; - public bool Skip = false; + public bool Enabled = true; public int LessThreads = 0; } } diff --git a/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs b/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs index 30fc67b..d81ae99 100644 --- a/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs +++ b/NiceHashMiner/Configs/Data/DeviceBenchmarkConfig.cs @@ -9,6 +9,6 @@ public class DeviceBenchmarkConfig { public string DeviceUUID = ""; public string DeviceName = ""; //public int TimeLimit { get; set; } - public Dictionary AlgorithmSettings = new Dictionary(); + public List AlgorithmSettings = new List(); } } diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 852178b..b6ec340 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -43,7 +43,8 @@ public class ComputeDevice public readonly bool DriverDisableAlgos; //public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } - public Dictionary AlgorithmSettings { get; set; } + //public Dictionary AlgorithmSettings { get; set; } + private List AlgorithmSettings; public string BenchmarkCopyUUID { get; set; } @@ -73,7 +74,7 @@ public ComputeDevice(int id, string group, string name, int threads, ulong affin DeviceType = DeviceType.CPU; NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_CPU"), CPUCount); UUID = GetUUID(ID, GroupNames.GetGroupName(DeviceGroupType, ID), Name, DeviceGroupType); - AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); + AlgorithmSettings = GroupAlgorithms.CreateForDeviceList(this); IsEtherumCapale = false; } @@ -87,7 +88,7 @@ public ComputeDevice(CudaDevice cudaDevice, DeviceGroupType group, int GPUCount) DeviceType = DeviceType.NVIDIA; NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_NVIDIA_GPU"), GPUCount); UUID = cudaDevice.UUID; - AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); + AlgorithmSettings = GroupAlgorithms.CreateForDeviceList(this); } // GPU AMD @@ -108,7 +109,7 @@ public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount, bool isDetectionFallb IsOptimizedVersion = amdDevice.UseOptimizedVersion; Codename = amdDevice.Codename; InfSection = amdDevice.InfSection; - AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); + AlgorithmSettings = GroupAlgorithms.CreateForDeviceList(this); DriverDisableAlgos = amdDevice.DriverDisableAlgos; ; } @@ -117,41 +118,21 @@ public string GetFullName() { return String.Format(International.GetText("ComputeDevice_Full_Device_Name"), NameCount, Name); } - public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { - foreach (var copyAlgSpeeds in copyBenchCDev.AlgorithmSettings) { - if (this.AlgorithmSettings.ContainsKey(copyAlgSpeeds.Key)) { - var setAlgo = this.AlgorithmSettings[copyAlgSpeeds.Key]; - setAlgo.BenchmarkSpeed = copyAlgSpeeds.Value.BenchmarkSpeed; - setAlgo.ExtraLaunchParameters = copyAlgSpeeds.Value.ExtraLaunchParameters; - setAlgo.LessThreads = copyAlgSpeeds.Value.LessThreads; - } + public Algorithm GetAlgorithm(MinerBaseType MinerBaseType, AlgorithmType AlgorithmType) { + int toSetIndex = this.AlgorithmSettings.FindIndex((a) => a.NiceHashID == AlgorithmType && a.MinerBaseType == MinerBaseType); + if (toSetIndex > -1) { + return this.AlgorithmSettings[toSetIndex]; } + return null; } - public void _3rdPartyMinerChange() { - var TmpAlgorithmSettings = GroupAlgorithms.CreateForDevice(this); - // check to remove - { - List toRemoveKeys = new List(); - foreach (var containsKey in AlgorithmSettings.Keys) { - if (TmpAlgorithmSettings.ContainsKey(containsKey) == false) { - toRemoveKeys.Add(containsKey); - } - } - foreach (var removeKey in toRemoveKeys) { - AlgorithmSettings.Remove(removeKey); - } - } - // check to add - { - List toAddKeys = new List(); - foreach (var containsKey in TmpAlgorithmSettings.Keys) { - if (AlgorithmSettings.ContainsKey(containsKey) == false) { - toAddKeys.Add(containsKey); - } - } - foreach (var addKey in toAddKeys) { - AlgorithmSettings.Add(addKey, TmpAlgorithmSettings[addKey]); + public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { + foreach (var copyFromAlgo in copyBenchCDev.AlgorithmSettings) { + var setAlgo = GetAlgorithm(copyFromAlgo.MinerBaseType, copyFromAlgo.NiceHashID); + if (setAlgo != null) { + setAlgo.BenchmarkSpeed = copyFromAlgo.BenchmarkSpeed; + setAlgo.ExtraLaunchParameters = copyFromAlgo.ExtraLaunchParameters; + setAlgo.LessThreads = copyFromAlgo.LessThreads; } } } @@ -166,15 +147,14 @@ public void SetFromComputeDeviceConfig(ComputeDeviceConfig config) { } public void SetAlgorithmDeviceConfig(DeviceBenchmarkConfig config) { if (config != null && config.DeviceUUID == UUID && config.AlgorithmSettings != null) { - this.AlgorithmSettings = GroupAlgorithms.CreateForDevice(this); - foreach (var algoSetting in config.AlgorithmSettings) { - AlgorithmType key = algoSetting.Key; - AlgorithmConfig conf = algoSetting.Value; - if (this.AlgorithmSettings.ContainsKey(key)) { - this.AlgorithmSettings[key].BenchmarkSpeed = conf.BenchmarkSpeed; - this.AlgorithmSettings[key].ExtraLaunchParameters = conf.ExtraLaunchParameters; - this.AlgorithmSettings[key].Skip = conf.Skip; - this.AlgorithmSettings[key].LessThreads = conf.LessThreads; + this.AlgorithmSettings = GroupAlgorithms.CreateForDeviceList(this); + foreach (var conf in config.AlgorithmSettings) { + var setAlgo = GetAlgorithm(conf.MinerBaseType, conf.NiceHashID); + if (setAlgo != null) { + setAlgo.BenchmarkSpeed = conf.BenchmarkSpeed; + setAlgo.ExtraLaunchParameters = conf.ExtraLaunchParameters; + setAlgo.Enabled = conf.Enabled; + setAlgo.LessThreads = conf.LessThreads; } } } @@ -192,22 +172,36 @@ public DeviceBenchmarkConfig GetAlgorithmDeviceConfig() { ret.DeviceName = this.Name; ret.DeviceUUID = this.UUID; // init algo settings - foreach (var algo in this.AlgorithmSettings.Values) { - AlgorithmType key = algo.NiceHashID; + foreach (var algo in this.AlgorithmSettings) { // create/setup AlgorithmConfig conf = new AlgorithmConfig(); - conf.NiceHashID = key; + conf.NiceHashID = algo.NiceHashID; + conf.MinerBaseType = algo.MinerBaseType; conf.MinerName = algo.MinerName; // TODO probably not needed conf.BenchmarkSpeed = algo.BenchmarkSpeed; conf.ExtraLaunchParameters = algo.ExtraLaunchParameters; - conf.Skip = algo.Skip; + conf.Enabled = algo.Enabled; conf.LessThreads = algo.LessThreads; // insert - ret.AlgorithmSettings[key] = conf; + ret.AlgorithmSettings.Add(conf); } return ret; } #endregion Config Setters/Getters + + public List GetAlgorithmSettings() { + // hello state + return GetAlgorithmSettingsThirdParty(ConfigManager.GeneralConfig.Use3rdPartyMiners); + } + + private List GetAlgorithmSettingsThirdParty(Use3rdPartyMiners use3rdParty) { + if (use3rdParty == Use3rdPartyMiners.YES) { + return this.AlgorithmSettings; + } + var third_party_miners = new List() { MinerBaseType.ClaymoreAMD, MinerBaseType.OptiminerAMD }; + + return this.AlgorithmSettings.FindAll((a) => third_party_miners.IndexOf(a.MinerBaseType) == -1); + } // static methods @@ -222,5 +216,9 @@ private static string GetUUID(int id, string group, string name, DeviceGroupType // GEN indicates the UUID has been generated and cannot be presumed to be immutable return "GEN-" + hash.ToString(); } + + internal bool IsAlgorithmSettingsInitialized() { + return this.AlgorithmSettings != null; + } } } diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 63d2856..b4dc167 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -870,13 +870,6 @@ public static ComputeDevice GetCurrentlySelectedComputeDevice(int index, bool un return AllAvaliableDevices[index]; } - //////////// - public static void ResetAvaliableAlgorithmsForDevice() { - foreach (var dev in AllAvaliableDevices) { - dev._3rdPartyMinerChange(); - } - } - public static int GetCountForType(DeviceType type) { int count = 0; foreach (var device in Avaliable.AllAvaliableDevices) { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index e89ba68..7def6bb 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -104,6 +104,15 @@ public static Dictionary> CreateForDevice(Compute return null; } + public static List CreateForDeviceList(ComputeDevice device) { + List ret = new List(); + var retDict = CreateForDevice(device); + foreach (var kvp in retDict) { + ret.AddRange(kvp.Value); + } + return ret; + } + private static Dictionary> CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { if (DeviceGroupType.CPU == deviceGroupType) { return new Dictionary>() { diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index ea8b793..9ecf968 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -72,7 +72,7 @@ public void SetCurrentlySelected(ListViewItem lvi, ComputeDevice computeDevice) this.Enabled = lvi.Checked; groupBoxSelectedAlgorithmSettings.Text = String.Format(International.GetText("AlgorithmsListView_GroupBox"), - algorithm.GetName()); ; + algorithm.AlgorithmName); ; field_LessThreads.Enabled = _computeDevice.DeviceGroupType == DeviceGroupType.CPU; if (field_LessThreads.Enabled) { diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 0d7ffc1..62cb453 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -39,7 +39,7 @@ private class DefaultAlgorithmColorSeter : IListItemCheckColorSetter { public void LviSetColor(ListViewItem lvi) { Algorithm algorithm = lvi.Tag as Algorithm; if (algorithm != null) { - if (algorithm.Skip && !algorithm.IsBenchmarkPending) { + if (algorithm.Enabled == false && !algorithm.IsBenchmarkPending) { lvi.BackColor = DISABLED_COLOR; } else if (algorithm.BenchmarkSpeed > 0 && !algorithm.IsBenchmarkPending) { lvi.BackColor = BENCHMARKED_COLOR; @@ -88,16 +88,16 @@ public void SetAlgorithms(ComputeDevice computeDevice, bool isEnabled) { _computeDevice = computeDevice; listViewAlgorithms.BeginUpdate(); listViewAlgorithms.Items.Clear(); - foreach (var alg in computeDevice.AlgorithmSettings) { + foreach (var alg in computeDevice.GetAlgorithmSettings()) { ListViewItem lvi = new ListViewItem(); - ListViewItem.ListViewSubItem sub = lvi.SubItems.Add(alg.Value.GetName()); + ListViewItem.ListViewSubItem sub = lvi.SubItems.Add(alg.AlgorithmStringID); //sub.Tag = alg.Value; - lvi.SubItems.Add(alg.Value.BenchmarkSpeedString()); - lvi.SubItems.Add(alg.Value.CurPayingRatio); - lvi.SubItems.Add(alg.Value.CurPayingRate); - lvi.Tag = alg.Value; - lvi.Checked = !alg.Value.Skip; + lvi.SubItems.Add(alg.BenchmarkSpeedString()); + lvi.SubItems.Add(alg.CurPayingRatio); + lvi.SubItems.Add(alg.CurPayingRate); + lvi.Tag = alg; + lvi.Checked = alg.Enabled; listViewAlgorithms.Items.Add(lvi); } listViewAlgorithms.EndUpdate(); @@ -129,7 +129,7 @@ private void listViewAlgorithms_ItemChecked(object sender, ItemCheckedEventArgs } var algo = e.Item.Tag as Algorithm; if (algo != null) { - algo.Skip = !e.Item.Checked; + algo.Enabled = e.Item.Checked; } if (ComunicationInterface != null) { ComunicationInterface.HandleCheck(e.Item); @@ -151,26 +151,27 @@ public void ResetListItemColors() { // benchmark settings public void SetSpeedStatus(ComputeDevice computeDevice, AlgorithmType algorithmType, string status) { - var algorithm = computeDevice.AlgorithmSettings[algorithmType]; - algorithm.BenchmarkStatus = status; + // TODO BROKEN FIX + //var algorithm = computeDevice.AlgorithmSettings[algorithmType]; + //algorithm.BenchmarkStatus = status; - // gui update only if same as selected - if (_computeDevice != null && computeDevice.UUID == _computeDevice.UUID) { - foreach (ListViewItem lvi in listViewAlgorithms.Items) { - Algorithm algo = lvi.Tag as Algorithm; - if (algo != null && algo.NiceHashID == algorithmType) { - // TODO handle numbers - lvi.SubItems[SPEED].Text = algorithm.BenchmarkSpeedString(); - lvi.SubItems[RATE].Text = algorithm.CurPayingRate; - lvi.SubItems[RATIO].Text = algorithm.CurPayingRatio; - _listItemCheckColorSetter.LviSetColor(lvi); - break; - } - } - } + //// gui update only if same as selected + //if (_computeDevice != null && computeDevice.UUID == _computeDevice.UUID) { + // foreach (ListViewItem lvi in listViewAlgorithms.Items) { + // Algorithm algo = lvi.Tag as Algorithm; + // if (algo != null && algo.NiceHashID == algorithmType) { + // // TODO handle numbers + // lvi.SubItems[SPEED].Text = algorithm.BenchmarkSpeedString(); + // lvi.SubItems[RATE].Text = algorithm.CurPayingRate; + // lvi.SubItems[RATIO].Text = algorithm.CurPayingRatio; + // _listItemCheckColorSetter.LviSetColor(lvi); + // break; + // } + // } + //} } private void listViewAlgorithms_MouseClick(object sender, MouseEventArgs e) { diff --git a/NiceHashMiner/Forms/Form_3rdParty_TOS.cs b/NiceHashMiner/Forms/Form_3rdParty_TOS.cs index 9711b33..9d6641b 100644 --- a/NiceHashMiner/Forms/Form_3rdParty_TOS.cs +++ b/NiceHashMiner/Forms/Form_3rdParty_TOS.cs @@ -24,15 +24,11 @@ public Form_3rdParty_TOS() { private void button_Agree_Click(object sender, EventArgs e) { ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.YES; - // update devices algorithm settings because some algos are supported only by 3rd party miners - ComputeDeviceManager.Avaliable.ResetAvaliableAlgorithmsForDevice(); this.Close(); } private void button_Decline_Click(object sender, EventArgs e) { ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; - // update devices algorithm settings because some algos are supported only by 3rd party miners - ComputeDeviceManager.Avaliable.ResetAvaliableAlgorithmsForDevice(); this.Close(); } } diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 1a2d6b4..0815d1b 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -320,18 +320,20 @@ public void CalcBenchmarkDevicesAlgorithmQueue() { foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { var algorithmQueue = new Queue(); if (_singleBenchmarkType == AlgorithmType.NONE) { - foreach (var kvpAlgorithm in cDev.AlgorithmSettings) { - if (ShoulBenchmark(kvpAlgorithm.Value)) { - algorithmQueue.Enqueue(kvpAlgorithm.Value); - kvpAlgorithm.Value.SetBenchmarkPendingNoMsg(); + foreach (var algo in cDev.GetAlgorithmSettings()) { + if (ShoulBenchmark(algo)) { + algorithmQueue.Enqueue(algo); + algo.SetBenchmarkPendingNoMsg(); } else { - kvpAlgorithm.Value.ClearBenchmarkPending(); + algo.ClearBenchmarkPending(); } } - } else { // single bench - var algo = cDev.AlgorithmSettings[_singleBenchmarkType]; - algorithmQueue.Enqueue(algo); } + // NOT USED for a while now + //else { // single bench + // var algo = cDev.AlgorithmSettings[_singleBenchmarkType]; + // algorithmQueue.Enqueue(algo); + //} BenchmarkSettingsStatus status; @@ -355,13 +357,13 @@ public void CalcBenchmarkDevicesAlgorithmQueue() { private bool ShoulBenchmark(Algorithm algorithm) { bool isBenchmarked = algorithm.BenchmarkSpeed > 0 ? true : false; if (_algorithmOption == AlgorithmBenchmarkSettingsType.SelectedUnbenchmarkedAlgorithms - && !isBenchmarked && !algorithm.Skip) { + && !isBenchmarked && algorithm.Enabled) { return true; } if (_algorithmOption == AlgorithmBenchmarkSettingsType.UnbenchmarkedAlgorithms && !isBenchmarked) { return true; } - if (_algorithmOption == AlgorithmBenchmarkSettingsType.ReBecnhSelectedAlgorithms && !algorithm.Skip) { + if (_algorithmOption == AlgorithmBenchmarkSettingsType.ReBecnhSelectedAlgorithms && algorithm.Enabled) { return true; } if (_algorithmOption == AlgorithmBenchmarkSettingsType.AllAlgorithms) { @@ -466,7 +468,7 @@ void EndBenchmark() { CalcBenchmarkDevicesAlgorithmQueue(); foreach (var deviceAlgoQueue in _benchmarkDevicesAlgorithmQueue) { foreach (var algorithm in deviceAlgoQueue.Item2) { - algorithm.Skip = true; + algorithm.Enabled = false; } } } @@ -515,7 +517,7 @@ public void OnBenchmarkComplete(bool success, string status) { _benchmarkFailedAlgoPerDev.Add( new DeviceAlgo() { Device = _currentDevice.Name, - Algorithm = _currentAlgorithm.GetName() + Algorithm = _currentAlgorithm.AlgorithmName } ); algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, status); } else if (!rebenchSame) { @@ -560,7 +562,7 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e // disable all pending benchmark foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - foreach (var algorithm in cDev.AlgorithmSettings.Values) { + foreach (var algorithm in cDev.GetAlgorithmSettings()) { algorithm.ClearBenchmarkPending(); } } @@ -571,8 +573,8 @@ private void FormBenchmark_New_FormClosing(object sender, FormClosingEventArgs e foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cdev.Enabled) { bool Enabled = false; - foreach (var algo in cdev.AlgorithmSettings) { - if (algo.Value.BenchmarkSpeed > 0) { + foreach (var algo in cdev.GetAlgorithmSettings()) { + if (algo.BenchmarkSpeed > 0) { Enabled = true; break; } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 8bc7cd4..0938f99 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -870,8 +870,8 @@ private bool StartMining(bool showWarnings) { bool hasAnyAlgoEnabled = false; foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cdev.Enabled) { - foreach (var algo in cdev.AlgorithmSettings.Values) { - if (algo.Skip == false) { + foreach (var algo in cdev.GetAlgorithmSettings()) { + if (algo.Enabled == true) { hasAnyAlgoEnabled = true; if (algo.BenchmarkSpeed == 0) { isBenchInit = false; @@ -898,8 +898,8 @@ private bool StartMining(bool showWarnings) { // check devices without benchmarks foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { bool Enabled = false; - foreach (var algo in cdev.AlgorithmSettings) { - if (algo.Value.BenchmarkSpeed > 0) { + foreach (var algo in cdev.GetAlgorithmSettings()) { + if (algo.BenchmarkSpeed > 0) { Enabled = true; break; } diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index d58a607..6e13a9f 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -486,11 +486,11 @@ private void checkBox_AMD_DisableAMDTempControl_CheckedChanged(object sender, Ev ConfigManager.GeneralConfig.DisableAMDTempControl = checkBox_AMD_DisableAMDTempControl.Checked; foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cDev.DeviceType == DeviceType.AMD) { - foreach (var algorithm in cDev.AlgorithmSettings) { - if (algorithm.Key != AlgorithmType.DaggerHashimoto) { - algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; - algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( - new MiningPair(cDev, algorithm.Value), algorithm.Key, DeviceType.AMD, false); + foreach (var algorithm in cDev.GetAlgorithmSettings()) { + if (algorithm.NiceHashID != AlgorithmType.DaggerHashimoto) { + algorithm.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; + algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + new MiningPair(cDev, algorithm), algorithm.NiceHashID, DeviceType.AMD, false); } } } @@ -505,26 +505,25 @@ private void checkBox_DisableDefaultOptimizations_CheckedChanged(object sender, ConfigManager.GeneralConfig.DisableDefaultOptimizations = checkBox_DisableDefaultOptimizations.Checked; if (ConfigManager.GeneralConfig.DisableDefaultOptimizations) { foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - foreach (var algorithm in cDev.AlgorithmSettings) { - algorithm.Value.ExtraLaunchParameters = ""; - if (cDev.DeviceType == DeviceType.AMD && algorithm.Key != AlgorithmType.DaggerHashimoto) { - algorithm.Value.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; - algorithm.Value.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( - new MiningPair(cDev, algorithm.Value), algorithm.Key, cDev.DeviceType, false); + foreach (var algorithm in cDev.GetAlgorithmSettings()) { + algorithm.ExtraLaunchParameters = ""; + if (cDev.DeviceType == DeviceType.AMD && algorithm.NiceHashID != AlgorithmType.DaggerHashimoto) { + algorithm.ExtraLaunchParameters += AmdGpuDevice.TemperatureParam; + algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + new MiningPair(cDev, algorithm), algorithm.NiceHashID, cDev.DeviceType, false); } } } } else { foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { if (cDev.DeviceType == DeviceType.CPU) continue; // cpu has no defaults - var deviceDefaultsAlgoSettings = GroupAlgorithms.CreateForDevice(cDev); + var deviceDefaultsAlgoSettings = GroupAlgorithms.CreateForDeviceList(cDev); foreach (var defaultAlgoSettings in deviceDefaultsAlgoSettings) { - var algorithmKey = defaultAlgoSettings.Key; - if (cDev.AlgorithmSettings.ContainsKey(algorithmKey)) { - var algorithm = cDev.AlgorithmSettings[algorithmKey]; - algorithm.ExtraLaunchParameters = defaultAlgoSettings.Value.ExtraLaunchParameters; - algorithm.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( - new MiningPair(cDev, algorithm), algorithmKey, cDev.DeviceType, false); + var toSetAlgo = cDev.GetAlgorithm(defaultAlgoSettings.MinerBaseType, defaultAlgoSettings.NiceHashID); + if (toSetAlgo != null) { + toSetAlgo.ExtraLaunchParameters = defaultAlgoSettings.ExtraLaunchParameters; + toSetAlgo.ExtraLaunchParameters = ExtraLaunchParametersParser.ParseForMiningPair( + new MiningPair(cDev, toSetAlgo), toSetAlgo.NiceHashID, cDev.DeviceType, false); } } } @@ -598,7 +597,8 @@ private void buttonSelectedProfit_Click(object sender, EventArgs e) { return; } var url = Links.NHM_Profit_Check + _selectedComputeDevice.Name; - foreach (var algorithm in _selectedComputeDevice.AlgorithmSettings.Values) { + // TODO API doesn't have multiple algorithm support + foreach (var algorithm in _selectedComputeDevice.GetAlgorithmSettings()) { var id = (int)algorithm.NiceHashID; url += "&speed" + id + "=" + ProfitabilityCalculator.GetFormatedSpeed(algorithm.BenchmarkSpeed, algorithm.NiceHashID).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); } @@ -610,9 +610,9 @@ private void buttonSelectedProfit_Click(object sender, EventArgs e) { private void buttonAllProfit_Click(object sender, EventArgs e) { var url = Links.NHM_Profit_Check + "CUSTOM"; Dictionary total = new Dictionary(); - + // TODO API doesn't have multiple algorithm support foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - foreach (var algorithm in curCDev.AlgorithmSettings.Values) { + foreach (var algorithm in curCDev.GetAlgorithmSettings()) { if (total.ContainsKey(algorithm.NiceHashID)) { total[algorithm.NiceHashID] += algorithm.BenchmarkSpeed; } else { @@ -716,8 +716,6 @@ private void checkBox_Use3rdPartyMiners_CheckedChanged(object sender, EventArgs this.checkBox_Use3rdPartyMiners.Checked = ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES; } else { ConfigManager.GeneralConfig.Use3rdPartyMiners = Use3rdPartyMiners.NO; - // update devices algorithm settings because some algos are supported only by 3rd party miners - ComputeDeviceManager.Avaliable.ResetAvaliableAlgorithmsForDevice(); } } diff --git a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs index 2d26ef2..bc0c69e 100644 --- a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs +++ b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs @@ -9,7 +9,7 @@ namespace NiceHashMiner.Miners.Grouping { public static class GroupSetupUtils { static readonly string TAG = "GroupSetupUtils"; public static bool IsAlgoMiningCapable(Algorithm algo) { - return algo != null && !algo.Skip && algo.BenchmarkSpeed > 0; + return algo != null && algo.Enabled && algo.BenchmarkSpeed > 0; } public static bool IsValidMinerPath(ComputeDevice device, Algorithm algo) { return MinerPaths.NONE != MinerPaths.GetOptimizedMinerPath(device, algo); @@ -23,7 +23,7 @@ public static Tuple getDeviceMiningStatus(Com status = DeviceMiningStatus.Disabled; } else { bool hasEnabledAlgo = false; - foreach (Algorithm algo in device.AlgorithmSettings.Values) { + foreach (Algorithm algo in device.GetAlgorithmSettings()) { hasEnabledAlgo |= IsAlgoMiningCapable(algo) && IsValidMinerPath(device, algo); } if (hasEnabledAlgo == false) { @@ -78,11 +78,11 @@ private static void LogMiningNonMiningStatuses(List enabledDevices foreach (var miningDevice in enabledDevices) { var device = miningDevice.Device; stringBuilder.AppendLine(String.Format("\tENABLED ({0})", device.GetFullName())); - foreach (var algo in device.AlgorithmSettings.Values) { + foreach (var algo in device.GetAlgorithmSettings()) { var isEnabled = IsAlgoMiningCapable(algo) && IsValidMinerPath(device, algo); stringBuilder.AppendLine(String.Format("\t\tALGORITHM {0} ({1})", isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED - AlgorithmNiceHashNames.GetName(algo.NiceHashID))); + algo.AlgorithmStringID)); } } Helpers.ConsolePrint(TAG, stringBuilder.ToString()); @@ -99,46 +99,47 @@ public static List GetMiningDevices(List devices, b // avarage passed in benchmark values public static void AvarageSpeeds(List miningDevs) { - // calculate avarage speeds, to ensure mining stability - // device name, algo key, algos refs list - Dictionary>> avarager = new Dictionary>>(); - // init empty avarager - foreach (var device in miningDevs) { - string devName = device.Device.Name; - avarager[devName] = new Dictionary>(); - foreach (var key in AlgorithmNiceHashNames.GetAllAvaliableTypes()) { - avarager[devName][key] = new List(); - } - } - // fill avarager - foreach (var device in miningDevs) { - string devName = device.Device.Name; - foreach (var kvp in device.Algorithms) { - var key = kvp.Key; - MiningAlgorithm algo = kvp.Value; - avarager[devName][key].Add(algo); - } - } - // calculate avarages - foreach (var devDict in avarager.Values) { - foreach (List miningAlgosList in devDict.Values) { - // if list not empty calculate avarage - if (miningAlgosList.Count > 0) { - // calculate avarage - double sum = 0; - foreach (var algo in miningAlgosList) { - sum += algo.AvaragedSpeed; - } - double avarageSpeed = sum / miningAlgosList.Count; - // set avarage - foreach (var algo in miningAlgosList) { - algo.AvaragedSpeed = avarageSpeed; - } - } - } - } + //// TODO BROKEN FIX + //// calculate avarage speeds, to ensure mining stability + //// device name, algo key, algos refs list + //Dictionary>> avarager = new Dictionary>>(); + //// init empty avarager + //foreach (var device in miningDevs) { + // string devName = device.Device.Name; + // avarager[devName] = new Dictionary>(); + // foreach (var key in AlgorithmNiceHashNames.GetAllAvaliableTypes()) { + // avarager[devName][key] = new List(); + // } + //} + //// fill avarager + //foreach (var device in miningDevs) { + // string devName = device.Device.Name; + // foreach (var kvp in device.Algorithms) { + // var key = kvp.Key; + // MiningAlgorithm algo = kvp.Value; + // avarager[devName][key].Add(algo); + // } + //} + //// calculate avarages + //foreach (var devDict in avarager.Values) { + // foreach (List miningAlgosList in devDict.Values) { + // // if list not empty calculate avarage + // if (miningAlgosList.Count > 0) { + // // calculate avarage + // double sum = 0; + // foreach (var algo in miningAlgosList) { + // sum += algo.AvaragedSpeed; + // } + // double avarageSpeed = sum / miningAlgosList.Count; + // // set avarage + // foreach (var algo in miningAlgosList) { + // algo.AvaragedSpeed = avarageSpeed; + // } + // } + // } + //} } } diff --git a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs b/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs deleted file mode 100644 index a41c61b..0000000 --- a/NiceHashMiner/Miners/Grouping/MiningAlgorithm.cs +++ /dev/null @@ -1,34 +0,0 @@ -using NiceHashMiner.Devices; -using System; -using System.Collections.Generic; -using System.Text; - -namespace NiceHashMiner.Miners.Grouping { - public class MiningAlgorithm { - public MiningAlgorithm(ComputeDevice dev, Algorithm algo) { - this.AlgoRef = algo; - // init speed that will be avaraged later - this.AvaragedSpeed = algo.BenchmarkSpeed; - this.MinerPath = MinerPaths.GetOptimizedMinerPath(dev, algo); - } - public Algorithm AlgoRef { get; private set; } - public string MinerPath { get; private set; } - // avarage speed of same devices to increase mining stability - public double AvaragedSpeed - { - get { - if(AlgoRef != null) { - return AlgoRef.AvaragedSpeed; - } - return 0; - } - set { - if (AlgoRef != null) { - AlgoRef.AvaragedSpeed = value; - } - } - } - public double CurrentProfit = 0; - public double CurNhmSMADataVal = 0; - } -} diff --git a/NiceHashMiner/Miners/Grouping/MiningDevice.cs b/NiceHashMiner/Miners/Grouping/MiningDevice.cs index 912bce2..583f336 100644 --- a/NiceHashMiner/Miners/Grouping/MiningDevice.cs +++ b/NiceHashMiner/Miners/Grouping/MiningDevice.cs @@ -47,45 +47,56 @@ public static void SetNextTest() { public MiningDevice(ComputeDevice device) { Device = device; - foreach (var kvp in Device.AlgorithmSettings) { - AlgorithmType key = kvp.Key; - Algorithm algo = kvp.Value; + foreach (var algo in Device.GetAlgorithmSettings()) { bool isAlgoMiningCapable = GroupSetupUtils.IsAlgoMiningCapable(algo); bool isValidMinerPath = GroupSetupUtils.IsValidMinerPath(device, algo); if (isAlgoMiningCapable && isValidMinerPath) { - Algorithms[key] = new MiningAlgorithm(device, algo); + Algorithms.Add(algo); } } } public ComputeDevice Device { get; private set; } - public Dictionary Algorithms = new Dictionary(); + public List Algorithms = new List(); - public AlgorithmType MostProfitableKey { get; private set; } + public string GetMostProfitableString() { + return + Enum.GetName(typeof(MinerBaseType), MostProfitableMinerBaseType) + + "_" + + Enum.GetName(typeof(AlgorithmType), MostProfitableAlgorithmType); + } + + public AlgorithmType MostProfitableAlgorithmType { get; private set; } + public MinerBaseType MostProfitableMinerBaseType { get; private set; } + + private int GetMostProfitableIndex() { + return Algorithms.FindIndex((a) => a.NiceHashID == MostProfitableAlgorithmType && a.MinerBaseType == MostProfitableMinerBaseType); + } public double GetCurrentMostProfitValue { get { - if (AlgorithmType.NONE != MostProfitableKey) { - return Algorithms[MostProfitableKey].CurrentProfit; + int mostProfitableIndex = GetMostProfitableIndex(); + if (mostProfitableIndex > -1) { + return Algorithms[mostProfitableIndex].CurrentProfit; } return 0; } } public MiningPair GetMostProfitablePair() { - return new MiningPair(this.Device, Algorithms[MostProfitableKey].AlgoRef); + return new MiningPair(this.Device, Algorithms[GetMostProfitableIndex()]); } public bool HasProfitableAlgo() { - return MostProfitableKey != AlgorithmType.NONE; + return GetMostProfitableIndex() > -1; } public void CalculateProfits(Dictionary NiceHashData) { // assume none is profitable - MostProfitableKey = AlgorithmType.NONE; + MostProfitableAlgorithmType = AlgorithmType.NONE; + MostProfitableMinerBaseType = MinerBaseType.NONE; // calculate new profits - foreach (var miningAlgo in Algorithms) { - AlgorithmType key = miningAlgo.Key; - MiningAlgorithm algo = miningAlgo.Value; + foreach (var algo in Algorithms) { + AlgorithmType key = algo.NiceHashID; if (NiceHashData.ContainsKey(key)) { algo.CurNhmSMADataVal = NiceHashData[key].paying; algo.CurrentProfit = algo.CurNhmSMADataVal * algo.AvaragedSpeed * 0.000000001; @@ -95,12 +106,11 @@ public void CalculateProfits(Dictionary NiceHashData } // find max paying value and save key double maxProfit = 0; - foreach (var miningAlgo in Algorithms) { - AlgorithmType key = miningAlgo.Key; - MiningAlgorithm algo = miningAlgo.Value; + foreach (var algo in Algorithms) { if (maxProfit < algo.CurrentProfit) { maxProfit = algo.CurrentProfit; - MostProfitableKey = key; + MostProfitableAlgorithmType = algo.NiceHashID; + MostProfitableMinerBaseType = algo.MinerBaseType; } } #if (SWITCH_TESTING) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index ced4654..2ceb6e4 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -425,14 +425,14 @@ virtual public void EndBenchmarkProcces() { if (BenchmarkHandle != null && BenchmarkProcessStatus != BenchmarkProcessStatus.Killing && BenchmarkProcessStatus != BenchmarkProcessStatus.DoneKilling) { BenchmarkProcessStatus = BenchmarkProcessStatus.Killing; try { - Helpers.ConsolePrint("BENCHMARK", String.Format("Trying to kill benchmark process {0} algorithm {1}", BenchmarkProcessPath, BenchmarkAlgorithm.GetName())); + Helpers.ConsolePrint("BENCHMARK", String.Format("Trying to kill benchmark process {0} algorithm {1}", BenchmarkProcessPath, BenchmarkAlgorithm.AlgorithmName)); BenchmarkHandle.Kill(); BenchmarkHandle.Close(); KillAllUsedMinerProcesses(); } catch { } finally { BenchmarkProcessStatus = BenchmarkProcessStatus.DoneKilling; - Helpers.ConsolePrint("BENCHMARK", String.Format("Benchmark process {0} algorithm {1} KILLED", BenchmarkProcessPath, BenchmarkAlgorithm.GetName())); + Helpers.ConsolePrint("BENCHMARK", String.Format("Benchmark process {0} algorithm {1} KILLED", BenchmarkProcessPath, BenchmarkAlgorithm.AlgorithmName)); //BenchmarkHandle = null; } } diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 591152b..8646169 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -304,15 +304,15 @@ public void SwichMostProfitableGroupUpMethod(Dictionary - From d40c4b39ee726f40f2c6f57a09dfc3bad86ac270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 3 Feb 2017 21:40:24 +0100 Subject: [PATCH 241/366] ExtraLaunchParams redo (added internal configs) --- .../Configs/ConfigJsonFile/ConfigFile.cs | 7 +- .../DeviceBenchmarkConfigFile.cs | 2 +- .../Configs/ConfigJsonFile/FOLDERS.cs | 10 + .../ConfigJsonFile/GeneralConfigFile.cs | 2 +- NiceHashMiner/Enums/MinerOptionType.cs | 95 ----- NiceHashMiner/Enums/MinerType.cs | 23 ++ NiceHashMiner/Forms/Form_Main.cs | 6 + .../Miners/Parsing/ExtraLaunchParameters.cs | 213 ++++++++++ .../Parsing/ExtraLaunchParametersParser.cs | 375 +++++++----------- NiceHashMiner/Miners/Parsing/MinerOption.cs | 14 +- .../Miners/Parsing/MinerOptionPackage.cs | 20 + NiceHashMiner/NiceHashMiner.csproj | 5 +- 12 files changed, 426 insertions(+), 346 deletions(-) create mode 100644 NiceHashMiner/Configs/ConfigJsonFile/FOLDERS.cs delete mode 100644 NiceHashMiner/Enums/MinerOptionType.cs create mode 100644 NiceHashMiner/Enums/MinerType.cs create mode 100644 NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs create mode 100644 NiceHashMiner/Miners/Parsing/MinerOptionPackage.cs diff --git a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs index 77d6832..bc5703a 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/ConfigFile.cs @@ -8,10 +8,10 @@ namespace NiceHashMiner.Configs.ConfigJsonFile { public abstract class ConfigFile where T : class { // statics/consts const string TAG_FORMAT = "ConfigFile<{0}>"; - const string CONF_FOLDER = @"configs\"; + private readonly string CONF_FOLDER; // = @"configs\"; private readonly string TAG; - private static void CheckAndCreateConfigsFolder() { + private void CheckAndCreateConfigsFolder() { try { if (Directory.Exists(CONF_FOLDER) == false) { Directory.CreateDirectory(CONF_FOLDER); @@ -23,7 +23,8 @@ private static void CheckAndCreateConfigsFolder() { protected string _filePath = ""; protected string _filePathOld = ""; - public ConfigFile(string fileName, string fileNameOld) { + public ConfigFile(string iCONF_FOLDER, string fileName, string fileNameOld) { + CONF_FOLDER = iCONF_FOLDER; if(fileName.Contains(CONF_FOLDER)) { this._filePath = fileName; } else { diff --git a/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs index b974ff5..89c87cc 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/DeviceBenchmarkConfigFile.cs @@ -19,7 +19,7 @@ private static string GetName(string DeviceUUID, string old = "") { } public DeviceBenchmarkConfigFile(string DeviceUUID) - : base(GetName(DeviceUUID), GetName(DeviceUUID, "_OLD")) { + : base(FOLDERS.CONFIG, GetName(DeviceUUID), GetName(DeviceUUID, "_OLD")) { } } diff --git a/NiceHashMiner/Configs/ConfigJsonFile/FOLDERS.cs b/NiceHashMiner/Configs/ConfigJsonFile/FOLDERS.cs new file mode 100644 index 0000000..829dc03 --- /dev/null +++ b/NiceHashMiner/Configs/ConfigJsonFile/FOLDERS.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Configs.ConfigJsonFile { + public static class FOLDERS { + public static readonly string CONFIG = @"configs\"; + public static readonly string INTERNALS = @"internals\"; + } +} diff --git a/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs b/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs index d624041..9f67e6c 100644 --- a/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs +++ b/NiceHashMiner/Configs/ConfigJsonFile/GeneralConfigFile.cs @@ -6,7 +6,7 @@ namespace NiceHashMiner.Configs.ConfigJsonFile { public class GeneralConfigFile : ConfigFile { public GeneralConfigFile() - : base("General.json", "General_old.json") { + : base(FOLDERS.CONFIG, "General.json", "General_old.json") { } } } diff --git a/NiceHashMiner/Enums/MinerOptionType.cs b/NiceHashMiner/Enums/MinerOptionType.cs deleted file mode 100644 index 7920565..0000000 --- a/NiceHashMiner/Enums/MinerOptionType.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace NiceHashMiner.Enums { - public enum MinerOptionType { - NONE, - // ccminer, sgminer - Intensity, - // sgminer - KeccakUnroll, - HamsiExpandBig, - Nfactor, - Xintensity, - Rawintensity, - ThreadConcurrency, - Worksize, - GpuThreads, - LookupGap, - RemoveDisabled, - // sgminer temp - GpuFan, - TempCutoff, - TempOverheat, - TempTarget, - AutoFan, - AutoGpu, - // ccminer cryptonight - Ccminer_CryptoNightLaunch, - Ccminer_CryptoNightBfactor, - Ccminer_CryptoNightBsleep, - // OCL ethminer - Ethminer_OCL_LocalWork, - Ethminer_OCL_GlobalWork, - // CUDA ethminer - CudaBlockSize, - CudaGridSize, - // TODO - // cpuminer - Threads, - CpuAffinity, - CpuPriority, - // nheqminer/eqm - // nheqminer CUDA - CUDA_Solver_Version, // -cb - CUDA_Solver_Block, // -cb - CUDA_Solver_Thread, // -ct - // nheqminer OpenCL - OpenCL_Solver_Version, //-ov - OpenCL_Solver_Dev_Thread, // -ot - // eqm - CUDA_Solver_Mode, // -cm - // ClaymoreZcash - ClaymoreZcash_a, - ClaymoreZcash_asm, - ClaymoreZcash_i, // -i - ClaymoreZcash_wd, // -wd - ClaymoreZcash_r, - ClaymoreZcash_nofee, - ClaymoreZcash_li, - ClaymoreZcash_tt, // -tt - ClaymoreZcash_ttli, - ClaymoreZcash_tstop, - ClaymoreZcash_fanmax, - ClaymoreZcash_fanmin, - ClaymoreZcash_cclock, - ClaymoreZcash_mclock, - ClaymoreZcash_powlim, - ClaymoreZcash_cvddc, - ClaymoreZcash_mvddc, - // ClaymoreCryptoNight - ClaymoreCryptoNight_a, - ClaymoreCryptoNight_wd, - ClaymoreCryptoNight_r, - ClaymoreCryptoNight_nofee, - ClaymoreCryptoNight_li, - ClaymoreCryptoNight_h, - ClaymoreCryptoNight_tt, // -tt - ClaymoreCryptoNight_ttli, // not present? - ClaymoreCryptoNight_tstop, - ClaymoreCryptoNight_fanmax, - ClaymoreCryptoNight_fanmin, - ClaymoreCryptoNight_cclock, - ClaymoreCryptoNight_mclock, - ClaymoreCryptoNight_powlim, - ClaymoreCryptoNight_cvddc, - ClaymoreCryptoNight_mvddc, - // Optiminer - Optiminer_ForceGenericKernel, - Optiminer_ExperimentalKernel, - Optiminer_nodevfee, - Optiminer_i, - - } -} diff --git a/NiceHashMiner/Enums/MinerType.cs b/NiceHashMiner/Enums/MinerType.cs new file mode 100644 index 0000000..1814bac --- /dev/null +++ b/NiceHashMiner/Enums/MinerType.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Enums { + public enum MinerType { + NONE, + ccminer, + ccminer_CryptoNight, + ethminer_OCL, + ethminer_CUDA, + sgminer, + cpuminer_opt, + nheqminer_CPU, + nheqminer_CUDA, + nheqminer_AMD, + eqm_CPU, + eqm_CUDA, + ClaymoreZcash, + ClaymoreCryptoNight, + OptiminerZcash + } +} diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 0938f99..ebf1fcb 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -26,6 +26,7 @@ namespace NiceHashMiner { using NiceHashMiner.Miners.Grouping; using NiceHashMiner.Net20_backport; + using NiceHashMiner.Miners.Parsing; public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, IMainFormRatesComunication { private static string VisitURL = Links.VisitURL; @@ -196,6 +197,11 @@ private void StartupTimer_Tick(object sender, EventArgs e) { //CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture; //CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; + // Internals Init + // TODO add loading step + ExtraLaunchParameters.InitializePackages(); + + if (!Helpers.InternalCheckIsWow64()) { MessageBox.Show(International.GetText("Form_Main_x64_Support_Only"), International.GetText("Warning_with_Exclamation"), diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs new file mode 100644 index 0000000..dec0e7b --- /dev/null +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -0,0 +1,213 @@ +using NiceHashMiner.Configs.ConfigJsonFile; +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Miners.Parsing { + class MinerOptionPackageFile : ConfigFile { + public MinerOptionPackageFile(string name) : base(FOLDERS.INTERNALS, String.Format("{0}.json", name), String.Format("{0}.json", name)) { + } + } + public static class ExtraLaunchParameters { + + private static readonly List DEFAULTS = new List() { + new MinerOptionPackage( + MinerType.ccminer, + new List() { + new MinerOption("Intensity", "-i", "--intensity=", "0", MinerOptionFlagType.MultiParam, ",") + }, + new List() + ), + new MinerOptionPackage( + MinerType.ccminer_CryptoNight, + new List() { + new MinerOption("Launch", "-l", "--launch=", "8x40", MinerOptionFlagType.MultiParam, ","), // default is 8x40 + new MinerOption("Bfactor", "", "--bfactor=", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("Bsleep", "", "--bsleep=", "0", MinerOptionFlagType.MultiParam, ",") // TODO check default + }, + new List() + ), + new MinerOptionPackage( + MinerType.ethminer_OCL, + new List() { + new MinerOption("LocalWork", "", "--cl-local-work", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("GlobalWork", "", "--cl-global-work", "0", MinerOptionFlagType.MultiParam, ","), + }, + new List() + ), + new MinerOptionPackage( + MinerType.ethminer_CUDA, + new List() { + new MinerOption("CudaBlockSize", "", "--cuda-block-size", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("CudaGridSize", "", "--cuda-grid-size", "0", MinerOptionFlagType.MultiParam, ","), + }, + new List() + ), + new MinerOptionPackage( + MinerType.sgminer, + new List() { + // SingleParam + new MinerOption("KeccakUnroll", "", "--keccak-unroll", "0", MinerOptionFlagType.SingleParam, ""), + new MinerOption("HamsiExpandBig", "", "--hamsi-expand-big", "4", MinerOptionFlagType.SingleParam, ""), + new MinerOption("Nfactor", "", "--nfactor", "10", MinerOptionFlagType.SingleParam, ""), + // MultiParam TODO IMPORTANT check defaults + new MinerOption("Intensity", "-I", "--intensity", "d", MinerOptionFlagType.MultiParam, ","), // default is "d" check if -1 works + new MinerOption("Xintensity", "-X", "--xintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption("Rawintensity", "", "--rawintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption("ThreadConcurrency", "", "--thread-concurrency", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption("Worksize", "-w", "--worksize", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption("GpuThreads", "-g", "--gpu-threads", "1", MinerOptionFlagType.MultiParam, ","), + new MinerOption("LookupGap", "", "--lookup-gap", "-1", MinerOptionFlagType.MultiParam, ","), // default none + // Uni + }, + // TemperatureOptions + new List() { + new MinerOption("GpuFan", "", "--gpu-fan", "30-60", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption("TempCutoff", "", "--temp-cutoff", "95", MinerOptionFlagType.MultiParam, ","), + new MinerOption("TempOverheat", "", "--temp-overheat", "85", MinerOptionFlagType.MultiParam, ","), + new MinerOption("TempTarget", "", "--temp-target", "75", MinerOptionFlagType.MultiParam, ","), + new MinerOption("AutoFan", "", "--auto-fan", null, MinerOptionFlagType.Uni, ""), + new MinerOption("AutoGpu", "", "--auto-gpu", null, MinerOptionFlagType.Uni, "") + } + ), + new MinerOptionPackage( + MinerType.cpuminer_opt, + new List() { + new MinerOption("Threads", "-t", "--threads=", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption("CpuAffinity", "", "--cpu-affinity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption("CpuPriority", "", "--cpu-priority", "-1", MinerOptionFlagType.MultiParam, ",") // default + }, + new List() + ), + new MinerOptionPackage( + MinerType.nheqminer_CPU, + new List() { + new MinerOption("Threads", "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none + }, + new List() + ), + new MinerOptionPackage( + MinerType.nheqminer_CUDA, + new List() { + new MinerOption("Solver_Version", "-cv", "-cv", "0", MinerOptionFlagType.SingleParam, " "), // default 0 + new MinerOption("Solver_Block", "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + new MinerOption("Solver_Thread", "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + }, + new List() + ), + new MinerOptionPackage( + MinerType.nheqminer_AMD, + new List() { + new MinerOption("Solver_Version", "-ov", "-ov", "0", MinerOptionFlagType.SingleParam, " "), // default none + new MinerOption("Solver_Dev_Thread", "-ot", "-ot", "1", MinerOptionFlagType.MultiParam, " "), // default none + }, + new List() + ), + new MinerOptionPackage( + MinerType.eqm_CPU, + new List() { + new MinerOption("Threads", "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " ") // default none + }, + new List() + ), + new MinerOptionPackage( + MinerType.eqm_CUDA, + new List() { + new MinerOption("Solver_Mode", "-cm", "-cm", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + }, + new List() + ), + new MinerOptionPackage( + MinerType.ClaymoreZcash, + new List() { + new MinerOption("ClaymoreZcash_a" , "-a", "-a", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreZcash_asm" , "-asm", "-asm", "1", MinerOptionFlagType.MultiParam, ","), + + new MinerOption("ClaymoreZcash_i" , "-i", "-i", "6", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreZcash_wd" , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), + //new MinerOption(ClaymoreZcash_r , , , , MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreZcash_nofee" , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreZcash_li" , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), + + //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all + new MinerOption("ClaymoreZcash_cclock" , "-cclock", "-cclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreZcash_mclock" , "-mclock", "-mclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreZcash_powlim" , "-powlim", "-powlim", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreZcash_cvddc" , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreZcash_mvddc" , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), + }, + new List() { + // temperature stuff + //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all + new MinerOption("ClaymoreZcash_tt" , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreZcash_ttli" , "-ttli", "-ttli", "70", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreZcash_tstop" , "-tstop", "-tstop", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreZcash_fanmax" , "-fanmax", "-fanmax", "100", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreZcash_fanmin" , "-fanmin", "-fanmin", "0", MinerOptionFlagType.MultiParam, ","), + } + ), + new MinerOptionPackage( + MinerType.ccminer_CryptoNight, + new List() { + new MinerOption("ClaymoreCryptoNight_a" , "-a", "-a", "0", MinerOptionFlagType.MultiParam, ""), + new MinerOption("ClaymoreCryptoNight_wd" , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), + //new MinerOption(ClaymoreCryptoNight_r , , , , MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreCryptoNight_nofee" , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreCryptoNight_li" , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreCryptoNight_h" , "-h", "-h", "0", MinerOptionFlagType.MultiParam, ","), + + new MinerOption("ClaymoreCryptoNight_cclock" , "-cclock", "-cclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreCryptoNight_mclock" , "-mclock", "-mclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreCryptoNight_powlim" , "-powlim", "-powlim", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreCryptoNight_cvddc" , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreCryptoNight_mvddc" , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), + }, + new List() { + // temperature stuff + //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all + new MinerOption("ClaymoreCryptoNight_tt" , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreCryptoNight_tstop" , "-tstop", "-tstop", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreCryptoNight_fanmax" , "-fanmax", "-fanmax", "100", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreCryptoNight_fanmin" , "-fanmin", "-fanmin", "0", MinerOptionFlagType.MultiParam, ","), + } + ), + new MinerOptionPackage( + MinerType.OptiminerZcash, + new List() { + new MinerOption("ForceGenericKernel" , "", "--force-generic-kernel", null, MinerOptionFlagType.Uni, ""), + new MinerOption("ExperimentalKernel" , "", "--experimental-kernel", null, MinerOptionFlagType.Uni, ""), + new MinerOption("nodevfee" , "", "--nodevfee", null, MinerOptionFlagType.Uni, ""), + new MinerOption("Intensity" , "-i", "--intensity", "0", MinerOptionFlagType.DuplicateMultiParam, ""), + }, + new List() + ), + }; + + private static List MinerOptionPackages = new List(); + + public static void InitializePackages() { + foreach (var pack in DEFAULTS) { + var packageFile = new MinerOptionPackageFile(String.Format("MinerOptionPackage_{0}", pack.Name)); + var readPack = packageFile.ReadFile(); + if (readPack == null) { // read has failed + MinerOptionPackages.Add(pack); + // create defaults + packageFile.Commit(pack); + } else { + MinerOptionPackages.Add(readPack); + } + } + } + + public static MinerOptionPackage GetMinerOptionPackageForMinerType(MinerType type) { + int index = MinerOptionPackages.FindIndex((p) => p.Type == type); + if(index > -1) { + return MinerOptionPackages[index]; + } + // if none found + return new MinerOptionPackage(MinerType.NONE, new List(), new List()); + } + + } +} diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 3694267..edfe88c 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -8,136 +8,11 @@ using System.Text; namespace NiceHashMiner.Miners.Parsing { + using MinerOptionType = String; static class ExtraLaunchParametersParser { private static readonly string TAG = "ExtraLaunchParametersParser"; - - // Order of miner options tpyes is important make sure to implement it corectly - // ccminer - private static List _ccimerOptions = new List() { - new MinerOption(MinerOptionType.Intensity, "-i", "--intensity=", "0", MinerOptionFlagType.MultiParam, ",") - }; - // ccminer CryptoNight - private static List _ccimerCryptoNightOptions = new List() { - new MinerOption(MinerOptionType.Ccminer_CryptoNightLaunch, "-l", "--launch=", "8x40", MinerOptionFlagType.MultiParam, ","), // default is 8x40 - new MinerOption(MinerOptionType.Ccminer_CryptoNightBfactor, "", "--bfactor=", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.Ccminer_CryptoNightBsleep, "", "--bsleep=", "0", MinerOptionFlagType.MultiParam, ",") // TODO check default - }; - // OCL ethminer - private static List _oclEthminerOptions = new List() { - new MinerOption(MinerOptionType.Ethminer_OCL_LocalWork, "", "--cl-local-work", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.Ethminer_OCL_GlobalWork, "", "--cl-global-work", "0", MinerOptionFlagType.MultiParam, ","), - }; - - // CUDA ethminer - private static List _cudaEthminerOptions = new List() { - new MinerOption(MinerOptionType.CudaBlockSize, "", "--cuda-block-size", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.CudaGridSize, "", "--cuda-grid-size", "0", MinerOptionFlagType.MultiParam, ","), - }; - - // sgminer - private static List _sgminerOptions = new List() { - // SingleParam - new MinerOption(MinerOptionType.KeccakUnroll, "", "--keccak-unroll", "0", MinerOptionFlagType.SingleParam, ""), - new MinerOption(MinerOptionType.HamsiExpandBig, "", "--hamsi-expand-big", "4", MinerOptionFlagType.SingleParam, ""), - new MinerOption(MinerOptionType.Nfactor, "", "--nfactor", "10", MinerOptionFlagType.SingleParam, ""), - // MultiParam TODO IMPORTANT check defaults - new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d", MinerOptionFlagType.MultiParam, ","), // default is "d" check if -1 works - new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none - new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none - new MinerOption(MinerOptionType.ThreadConcurrency, "", "--thread-concurrency", "-1", MinerOptionFlagType.MultiParam, ","), // default none - new MinerOption(MinerOptionType.Worksize, "-w", "--worksize", "-1", MinerOptionFlagType.MultiParam, ","), // default none - new MinerOption(MinerOptionType.GpuThreads, "-g", "--gpu-threads", "1", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.LookupGap, "", "--lookup-gap", "-1", MinerOptionFlagType.MultiParam, ","), // default none - // Uni - }; - private static List _sgminerTemperatureOptions = new List() { - // temperature stuff - new MinerOption(MinerOptionType.GpuFan, "", "--gpu-fan", "30-60", MinerOptionFlagType.MultiParam, ","), // default none - new MinerOption(MinerOptionType.TempCutoff, "", "--temp-cutoff", "95", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.TempOverheat, "", "--temp-overheat", "85", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.TempTarget, "", "--temp-target", "75", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.AutoFan, "", "--auto-fan", null, MinerOptionFlagType.Uni, ""), - new MinerOption(MinerOptionType.AutoGpu, "", "--auto-gpu", null, MinerOptionFlagType.Uni, "") - }; - - private static List _cpuminerOptions = new List() { - // temperature stuff - new MinerOption(MinerOptionType.Threads, "-t", "--threads=", "-1", MinerOptionFlagType.MultiParam, ","), // default none - new MinerOption(MinerOptionType.CpuAffinity, "", "--cpu-affinity", "-1", MinerOptionFlagType.MultiParam, ","), // default none - new MinerOption(MinerOptionType.CpuPriority, "", "--cpu-priority", "-1", MinerOptionFlagType.MultiParam, ","), // default none - }; - // nheqminer - private static List _nheqminer_CPU_Options = new List() { - new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none - }; - private static List _nheqminer_CUDA_Options = new List() { - new MinerOption(MinerOptionType.CUDA_Solver_Version, "-cv", "-cv", "0", MinerOptionFlagType.SingleParam, " "), // default 0 - new MinerOption(MinerOptionType.CUDA_Solver_Block, "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - }; - private static List _nheqminer_AMD_Options = new List() { - new MinerOption(MinerOptionType.OpenCL_Solver_Version, "-ov", "-ov", "0", MinerOptionFlagType.SingleParam, " "), // default none - new MinerOption(MinerOptionType.OpenCL_Solver_Dev_Thread, "-ot", "-ot", "1", MinerOptionFlagType.MultiParam, " "), // default none - }; - // eqm - private static List _eqm_CPU_Options = new List() { - new MinerOption(MinerOptionType.Threads, "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " "), // default none - }; - // eqm CUDA - private static List _eqm_CUDA_Options = new List() { - new MinerOption(MinerOptionType.CUDA_Solver_Mode, "-cm", "-cm", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - }; - // Zcash claymore - private static List _ClaymoreZcash_Options = new List() { - new MinerOption(MinerOptionType.ClaymoreZcash_a , "-a", "-a", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_asm , "-asm", "-asm", "1", MinerOptionFlagType.MultiParam, ","), - - new MinerOption(MinerOptionType.ClaymoreZcash_i , "-i", "-i", "6", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_wd , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), - //new MinerOption(MinerOptionType.ClaymoreZcash_r , , , , MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_nofee , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_li , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), - // temperature stuff - //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all - new MinerOption(MinerOptionType.ClaymoreZcash_tt , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_ttli , "-ttli", "-ttli", "70", MinerOptionFlagType.SingleParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_tstop , "-tstop", "-tstop", "0", MinerOptionFlagType.SingleParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_fanmax , "-fanmax", "-fanmax", "100", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_fanmin , "-fanmin", "-fanmin", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_cclock , "-cclock", "-cclock", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_mclock , "-mclock", "-mclock", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_powlim , "-powlim", "-powlim", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_cvddc , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreZcash_mvddc , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), - }; - // Zcash cryptonight - private static List _Claymore_cryptonight_Options = new List() { - new MinerOption(MinerOptionType.ClaymoreCryptoNight_a , "-a", "-a", "0", MinerOptionFlagType.MultiParam, ""), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_wd , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), - //new MinerOption(MinerOptionType.ClaymoreCryptoNight_r , , , , MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_nofee , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_li , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_h , "-h", "-h", "0", MinerOptionFlagType.MultiParam, ","), - // temperature stuff - //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all - new MinerOption(MinerOptionType.ClaymoreCryptoNight_tt , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), - //new MinerOption(MinerOptionType.ClaymoreCryptoNight_ttli , "-ttli", "-ttli", "70", MinerOptionFlagType.SingleParam, ","), // no such param - new MinerOption(MinerOptionType.ClaymoreCryptoNight_tstop , "-tstop", "-tstop", "0", MinerOptionFlagType.SingleParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_fanmax , "-fanmax", "-fanmax", "100", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_fanmin , "-fanmin", "-fanmin", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_cclock , "-cclock", "-cclock", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_mclock , "-mclock", "-mclock", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_powlim , "-powlim", "-powlim", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_cvddc , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), - new MinerOption(MinerOptionType.ClaymoreCryptoNight_mvddc , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), - }; - // Zcash Optiminer - private static List _OptiminerZcash_Options = new List() { - new MinerOption(MinerOptionType.Optiminer_ForceGenericKernel , "", "--force-generic-kernel", null, MinerOptionFlagType.Uni, ""), - new MinerOption(MinerOptionType.Optiminer_ExperimentalKernel , "", "--experimental-kernel", null, MinerOptionFlagType.Uni, ""), - new MinerOption(MinerOptionType.Optiminer_nodevfee , "", "--nodevfee", null, MinerOptionFlagType.Uni, ""), - new MinerOption(MinerOptionType.Optiminer_i , "-i", "--intensity", "0", MinerOptionFlagType.DuplicateMultiParam, ""), - }; + private static readonly string MinerOptionType_NONE = "MinerOptionType_NONE"; + private static bool _showLog = true; @@ -151,7 +26,7 @@ private static void LogParser(string msg) { public static int GetEqmCudaThreadCount(MiningPair pair) { if (pair.CurrentExtraLaunchParameters.Contains("-ct")) { List eqm_CUDA_Options = new List() { - new MinerOption(MinerOptionType.CUDA_Solver_Thread, "-ct", "-ct", "1", MinerOptionFlagType.MultiParam, " "), + new MinerOption("CUDA_Solver_Thread", "-ct", "-ct", "1", MinerOptionFlagType.MultiParam, " "), }; string parsedStr = Parse(new List() { pair }, eqm_CUDA_Options, true); try { @@ -223,11 +98,11 @@ private static string Parse(List MiningPairs, List opti IgnorePrintLogIbnit(); - MinerOptionType currentFlag = MinerOptionType.NONE; + MinerOptionType currentFlag = MinerOptionType_NONE; foreach (var param in parameters) { if (param.Equals("")) { // skip continue; - } else if (currentFlag == MinerOptionType.NONE) { + } else if (currentFlag == MinerOptionType_NONE) { bool isIngored = true; foreach (var option in options) { if (param.Equals(option.ShortName) || param.Equals(option.LongName)) { @@ -243,10 +118,10 @@ private static string Parse(List MiningPairs, List opti if (isIngored) { // ignored IgnorePrintLog(param, IGNORE_PARAM, ignoreLogOpions); } - } else if (currentFlag != MinerOptionType.NONE) { + } else if (currentFlag != MinerOptionType_NONE) { isOptionExist[currentFlag] = true; cdevOptions[pair.Device.UUID][currentFlag] = param; - currentFlag = MinerOptionType.NONE; + currentFlag = MinerOptionType_NONE; } else { // problem IgnorePrintLog(param, IGNORE_PARAM, ignoreLogOpions); } @@ -326,53 +201,103 @@ private static string Parse(List MiningPairs, List opti public static string ParseForMiningSetup(MiningSetup miningSetup, DeviceType deviceType, bool showLog = true) { return ParseForMiningPairs( miningSetup.MiningPairs, - miningSetup.CurrentAlgorithmType, deviceType, miningSetup.MinerPath, showLog); } public static string ParseForMiningPair(MiningPair miningPair, AlgorithmType algorithmType, DeviceType deviceType, bool showLog = true) { return ParseForMiningPairs( new List() { miningPair }, - algorithmType, deviceType, + deviceType, MinerPaths.GetOptimizedMinerPath(miningPair), showLog); } - private static string ParseForMiningPairs(List MiningPairs, AlgorithmType algorithmType, DeviceType deviceType, string minerPath, bool showLog = true) { + private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType minerBaseType, AlgorithmType algorithmType) { + if (MinerBaseType.cpuminer == minerBaseType) { + return MinerType.cpuminer_opt; + } + if (MinerBaseType.OptiminerAMD == minerBaseType) { + return MinerType.OptiminerZcash; + } + if (MinerBaseType.sgminer == minerBaseType) { + return MinerType.sgminer; + } + if (MinerBaseType.ccminer == minerBaseType) { + if (AlgorithmType.CryptoNight == algorithmType) { + return MinerType.ccminer_CryptoNight; + } + return MinerType.ccminer; + } + if (MinerBaseType.ClaymoreAMD == minerBaseType) { + if (AlgorithmType.CryptoNight == algorithmType) { + return MinerType.ClaymoreCryptoNight; + } + if (AlgorithmType.Equihash == algorithmType) { + return MinerType.ClaymoreZcash; + } + } + if (MinerBaseType.ethminer == minerBaseType) { + if(DeviceType.AMD == deviceType) { + return MinerType.ethminer_OCL; + } + if(DeviceType.NVIDIA == deviceType) { + return MinerType.ethminer_CUDA; + } + } + if (MinerBaseType.nheqminer == minerBaseType) { + if(DeviceType.CPU == deviceType) { + return MinerType.nheqminer_CPU; + } + if(DeviceType.AMD == deviceType) { + return MinerType.nheqminer_AMD; + } + if(DeviceType.NVIDIA == deviceType) { + return MinerType.nheqminer_CUDA; + } + } + if (MinerBaseType.eqm == minerBaseType) { + if(DeviceType.CPU == deviceType) { + return MinerType.eqm_CPU; + } + if(DeviceType.NVIDIA == deviceType) { + return MinerType.eqm_CUDA; + } + } + + return MinerType.NONE; + } + + private static string ParseForMiningPairs(List MiningPairs, DeviceType deviceType, string minerPath, bool showLog = true) { _showLog = showLog; - // parse for nheqminer - if (algorithmType == AlgorithmType.Equihash) { - // nheqminer - if (minerPath == MinerPaths.nheqminer) { - if (deviceType == DeviceType.CPU) { - CheckAndSetCPUPairs(MiningPairs); - return Parse(MiningPairs, _nheqminer_CPU_Options); - } - if (deviceType == DeviceType.NVIDIA) { - return Parse(MiningPairs, _nheqminer_CUDA_Options); - } - if (deviceType == DeviceType.AMD) { - return Parse(MiningPairs, _nheqminer_AMD_Options); - } - } else if (minerPath == MinerPaths.eqm) { - if (deviceType == DeviceType.CPU) { - CheckAndSetCPUPairs(MiningPairs); - return Parse(MiningPairs, _eqm_CPU_Options); - } - if (deviceType == DeviceType.NVIDIA) { - return Parse(MiningPairs, _eqm_CUDA_Options); - } - } else if (minerPath == MinerPaths.ClaymoreZcashMiner) { - return Parse(MiningPairs, _ClaymoreZcash_Options); + MinerBaseType minerBaseType = MinerBaseType.NONE; + AlgorithmType algorithmType = AlgorithmType.NONE; + if (MiningPairs.Count > 0) { + var algo = MiningPairs[0].Algorithm; + if (algo != null) { + algorithmType = algo.NiceHashID; + minerBaseType = algo.MinerBaseType; } - } else if (minerPath == MinerPaths.ethminer && algorithmType == AlgorithmType.DaggerHashimoto) { // ethminer dagger + } + + MinerType minerType = GetMinerType(deviceType, minerBaseType, algorithmType); + + MinerOptionPackage minerOptionPackage = ExtraLaunchParameters.GetMinerOptionPackageForMinerType(minerType); + + List setMiningPairs = MiningPairs.ConvertAll((mp) => mp); + // handle exceptions and package parsing + // CPU exception + if (deviceType == DeviceType.CPU) { + CheckAndSetCPUPairs(setMiningPairs); + } + // ethminer exception + if (MinerType.ethminer_OCL == minerType || MinerType.ethminer_CUDA == minerType) { // use if missing compute device for correct mapping // init fakes workaround var cdevs_mappings = new List(); { int id = -1; var fakeAlgo = new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto"); - foreach (var pair in MiningPairs) { + foreach (var pair in setMiningPairs) { while (++id != pair.Device.ID) { var fakeCdev = new ComputeDevice(id); cdevs_mappings.Add(new MiningPair(fakeCdev, fakeAlgo)); @@ -380,90 +305,64 @@ private static string ParseForMiningPairs(List MiningPairs, Algorith cdevs_mappings.Add(pair); } } - if (deviceType == DeviceType.NVIDIA) { - return Parse(cdevs_mappings, _cudaEthminerOptions); - } else if (deviceType == DeviceType.AMD) { - return Parse(cdevs_mappings, _oclEthminerOptions); - } - } else if (minerPath == MinerPaths.ClaymoreCryptoNightMiner) { - return Parse(MiningPairs, _Claymore_cryptonight_Options); - } else if (minerPath == MinerPaths.OptiminerZcashMiner) { - return Parse(MiningPairs, _OptiminerZcash_Options); - } else { - // parse for device - if (deviceType == DeviceType.CPU) { - CheckAndSetCPUPairs(MiningPairs); - return Parse(MiningPairs, _cpuminerOptions); - } else if (deviceType == DeviceType.NVIDIA) { - if (algorithmType != AlgorithmType.CryptoNight) { - return Parse(MiningPairs, _ccimerOptions); - } else if (algorithmType == AlgorithmType.CryptoNight) { - // check if any device is SM21 or SM3.x if yes return empty for stability reasons - if (ConfigManager.GeneralConfig.NVIDIA_CryptoNight_Preventive) { - foreach (var pair in MiningPairs) { - var groupType = pair.Device.DeviceGroupType; - if (groupType == DeviceGroupType.NVIDIA_2_1 || groupType == DeviceGroupType.NVIDIA_3_x) { - return ""; - } - } - } - return Parse(MiningPairs, _ccimerCryptoNightOptions, true); - } - } else if (deviceType == DeviceType.AMD) { - // rawIntensity overrides xintensity, xintensity overrides intensity - var sgminer_intensities = new List() { - new MinerOption(MinerOptionType.Intensity, "-I", "--intensity", "d", MinerOptionFlagType.MultiParam, ","), // default is "d" check if -1 works - new MinerOption(MinerOptionType.Xintensity, "-X", "--xintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none - new MinerOption(MinerOptionType.Rawintensity, "", "--rawintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none - }; - var contains_intensity = new Dictionary() { - { MinerOptionType.Intensity, false }, - { MinerOptionType.Xintensity, false }, - { MinerOptionType.Rawintensity, false }, - }; - // check intensity and xintensity, the latter overrides so change accordingly - foreach (var cDev in MiningPairs) { - foreach (var intensityOption in sgminer_intensities) { - if (!string.IsNullOrEmpty(intensityOption.ShortName) && cDev.CurrentExtraLaunchParameters.Contains(intensityOption.ShortName)) { - cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace(intensityOption.ShortName, intensityOption.LongName); - contains_intensity[intensityOption.Type] = true; - } - if (cDev.CurrentExtraLaunchParameters.Contains(intensityOption.LongName)) { - contains_intensity[intensityOption.Type] = true; - } + // reset setMiningPairs + setMiningPairs = cdevs_mappings; + } + // sgminer exception handle intensity types + if (MinerType.sgminer == minerType) { + // rawIntensity overrides xintensity, xintensity overrides intensity + var sgminer_intensities = new List() { + new MinerOption("Intensity", "-I", "--intensity", "d", MinerOptionFlagType.MultiParam, ","), // default is "d" check if -1 works + new MinerOption("Xintensity", "-X", "--xintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + new MinerOption("Rawintensity", "", "--rawintensity", "-1", MinerOptionFlagType.MultiParam, ","), // default none + }; + var contains_intensity = new Dictionary() { + { "Intensity", false }, + { "Xintensity", false }, + { "Rawintensity", false }, + }; + // check intensity and xintensity, the latter overrides so change accordingly + foreach (var cDev in setMiningPairs) { + foreach (var intensityOption in sgminer_intensities) { + if (!string.IsNullOrEmpty(intensityOption.ShortName) && cDev.CurrentExtraLaunchParameters.Contains(intensityOption.ShortName)) { + cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace(intensityOption.ShortName, intensityOption.LongName); + contains_intensity[intensityOption.Type] = true; } - } - // replace - if (contains_intensity[MinerOptionType.Intensity] && contains_intensity[MinerOptionType.Xintensity]) { - LogParser("Sgminer replacing --intensity with --xintensity"); - foreach (var cDev in MiningPairs) { - cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--intensity", "--xintensity"); + if (cDev.CurrentExtraLaunchParameters.Contains(intensityOption.LongName)) { + contains_intensity[intensityOption.Type] = true; } } - if (contains_intensity[MinerOptionType.Xintensity] && contains_intensity[MinerOptionType.Rawintensity]) { - LogParser("Sgminer replacing --xintensity with --rawintensity"); - foreach (var cDev in MiningPairs) { - cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--xintensity", "--rawintensity"); - } + } + // replace + if (contains_intensity["Intensity"] && contains_intensity["Xintensity"]) { + LogParser("Sgminer replacing --intensity with --xintensity"); + foreach (var cDev in setMiningPairs) { + cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--intensity", "--xintensity"); } - - List sgminerOptionsNew = new List(); - string temperatureControl = ""; - // temp control and parse - if (ConfigManager.GeneralConfig.DisableAMDTempControl) { - LogParser("DisableAMDTempControl is TRUE, temp control parameters will be ignored"); - } else { - LogParser("Sgminer parsing temperature control parameters"); - temperatureControl = Parse(MiningPairs, _sgminerTemperatureOptions, true, _sgminerOptions); + } + if (contains_intensity["Xintensity"] && contains_intensity["Rawintensity"]) { + LogParser("Sgminer replacing --xintensity with --rawintensity"); + foreach (var cDev in setMiningPairs) { + cDev.CurrentExtraLaunchParameters = cDev.CurrentExtraLaunchParameters.Replace("--xintensity", "--rawintensity"); } - LogParser("Sgminer parsing default parameters"); - string returnStr = String.Format("{0} {1}", Parse(MiningPairs, _sgminerOptions, false, _sgminerTemperatureOptions), temperatureControl); - LogParser("Sgminer extra launch parameters merged: " + returnStr); - return returnStr; } } + + string ret = ""; + string general = Parse(setMiningPairs, minerOptionPackage.GeneralOptions, false, minerOptionPackage.TemperatureOptions); + // temp control and parse + if (ConfigManager.GeneralConfig.DisableAMDTempControl) { + LogParser("DisableAMDTempControl is TRUE, temp control parameters will be ignored"); + ret = general; + } else { + LogParser("AMD parsing temperature control parameters"); + // temp = Parse(setMiningPairs, minerOptionPackage.TemperatureOptions, true, minerOptionPackage.GeneralOptions); + string temp = Parse(setMiningPairs, minerOptionPackage.TemperatureOptions, false, minerOptionPackage.GeneralOptions); - return ""; + ret = general + " " + temp; + } + + return ret; } private static void CheckAndSetCPUPairs(List MiningPairs) { diff --git a/NiceHashMiner/Miners/Parsing/MinerOption.cs b/NiceHashMiner/Miners/Parsing/MinerOption.cs index 8289592..d47dd9d 100644 --- a/NiceHashMiner/Miners/Parsing/MinerOption.cs +++ b/NiceHashMiner/Miners/Parsing/MinerOption.cs @@ -5,7 +5,7 @@ namespace NiceHashMiner.Miners.Parsing { public class MinerOption { - public MinerOption(MinerOptionType iType, string iShortName, string iLongName, string iDefault, MinerOptionFlagType iFlagType, string iSeparator) { + public MinerOption(string iType, string iShortName, string iLongName, string iDefault, MinerOptionFlagType iFlagType, string iSeparator) { this.Type = iType; this.ShortName = iShortName; this.LongName = iLongName; @@ -13,11 +13,11 @@ public MinerOption(MinerOptionType iType, string iShortName, string iLongName, s this.FlagType = iFlagType; this.Separator = iSeparator; } - public readonly MinerOptionType Type; - public readonly string ShortName; - public readonly string LongName; - public readonly string Default; - public readonly MinerOptionFlagType FlagType; - public readonly string Separator; + public string Type; + public string ShortName; + public string LongName; + public string Default; + public MinerOptionFlagType FlagType; + public string Separator; } } diff --git a/NiceHashMiner/Miners/Parsing/MinerOptionPackage.cs b/NiceHashMiner/Miners/Parsing/MinerOptionPackage.cs new file mode 100644 index 0000000..f639cbe --- /dev/null +++ b/NiceHashMiner/Miners/Parsing/MinerOptionPackage.cs @@ -0,0 +1,20 @@ +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Miners.Parsing { + public class MinerOptionPackage { + public string Name; + public MinerType Type; + public List GeneralOptions; + public List TemperatureOptions; + + public MinerOptionPackage(MinerType iType, List iGeneralOptions, List iTemperatureOptions) { + this.Type = iType; + this.GeneralOptions = iGeneralOptions; + this.TemperatureOptions = iTemperatureOptions; + this.Name = Enum.GetName(typeof(MinerType), iType); + } + } +} diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 47a72ce..ff9a206 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -81,6 +81,7 @@ + @@ -115,9 +116,9 @@ - + @@ -205,6 +206,7 @@ + @@ -219,6 +221,7 @@ + From 09c61ee93d9458f30f8deaa7966208adb38daa1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 4 Feb 2017 19:17:28 +0100 Subject: [PATCH 242/366] add pascal enum, change miner factory, grouping speed avarager --- NiceHashMiner/AlgorithmNiceHashNames.cs | 59 +-------- NiceHashMiner/Devices/ComputeDevice.cs | 23 +++- NiceHashMiner/Devices/ComputeDeviceManager.cs | 9 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- NiceHashMiner/Enums/AlgorithmType.cs | 3 +- NiceHashMiner/Enums/DeviceGroupType.cs | 3 +- NiceHashMiner/Forms/Form_Benchmark.cs | 2 +- NiceHashMiner/Miners/Grouping/GroupMiner.cs | 3 +- .../Miners/Grouping/GroupSetupUtils.cs | 124 +++++++++++------- .../Miners/Grouping/GroupingLogic.cs | 32 +++-- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 71 +--------- NiceHashMiner/Miners/Grouping/MiningDevice.cs | 2 +- NiceHashMiner/Miners/Grouping/MiningSetup.cs | 14 +- NiceHashMiner/Miners/MinerFactory.cs | 11 +- NiceHashMiner/Miners/MinersManager.cs | 43 ------ .../Parsing/ExtraLaunchParametersParser.cs | 7 +- 16 files changed, 145 insertions(+), 263 deletions(-) diff --git a/NiceHashMiner/AlgorithmNiceHashNames.cs b/NiceHashMiner/AlgorithmNiceHashNames.cs index e7f17a2..5b3a8c8 100644 --- a/NiceHashMiner/AlgorithmNiceHashNames.cs +++ b/NiceHashMiner/AlgorithmNiceHashNames.cs @@ -10,66 +10,11 @@ namespace NiceHashMiner /// public static class AlgorithmNiceHashNames { - readonly static private Dictionary _names = new Dictionary() - { - { AlgorithmType.INVALID , "INVALID" }, - { AlgorithmType.NONE , "NONE" }, - { AlgorithmType.Scrypt_UNUSED , "scrypt" }, // NOT used - { AlgorithmType.SHA256_UNUSED , "sha256" }, // NOT used - { AlgorithmType.ScryptNf_UNUSED , "scryptnf" }, // NOT used - { AlgorithmType.X11_UNUSED , "x11" }, // NOT used - { AlgorithmType.X13 , "x13" }, - { AlgorithmType.Keccak , "keccak" }, - { AlgorithmType.X15 , "x15" }, - { AlgorithmType.Nist5 , "nist5" }, - { AlgorithmType.NeoScrypt , "neoscrypt" }, - { AlgorithmType.Lyra2RE , "lyra2re" }, - { AlgorithmType.WhirlpoolX , "whirlpoolx" }, - { AlgorithmType.Qubit , "qubit" }, - { AlgorithmType.Quark , "quark" }, - { AlgorithmType.Axiom_UNUSED , "axiom" }, // NOT used - { AlgorithmType.Lyra2REv2 , "lyra2rev2" }, - { AlgorithmType.ScryptJaneNf16_UNUSED , "scryptjanenf16" }, // NOT used - { AlgorithmType.Blake256r8 , "blake256r8" }, - { AlgorithmType.Blake256r14 , "blake256r14" }, - { AlgorithmType.Blake256r8vnl , "blake256r8vnl" }, - { AlgorithmType.Hodl , "hodl" }, - { AlgorithmType.DaggerHashimoto , "daggerhashimoto" }, - { AlgorithmType.Decred , "decred" }, - { AlgorithmType.CryptoNight , "cryptonight" }, - { AlgorithmType.Lbry , "lbry" }, - { AlgorithmType.Equihash , "equihash" }, - }; - - static private List _keys = null; - public static string GetName(AlgorithmType type) { - if (_names.ContainsKey(type)) { - return _names[type]; + if (AlgorithmType.INVALID <= type && type <= AlgorithmType.Pascal) { + return Enum.GetName(typeof(AlgorithmType), type); } return "NameNotFound type not supported"; } - - /// - /// GetKey is used for Algorithm initialization, from config files. - /// If algorithm name is invalid it will return INVALID - /// - /// - /// - public static AlgorithmType GetKey(string name) { - foreach (var pair in _names) { - if (pair.Value == name) return pair.Key; - } - - return AlgorithmType.INVALID; - } - - public static List GetAllAvaliableTypes() { - // lazy load - if (_keys == null) { - _keys = new List(_names.Keys); - } - return _keys; - } } } diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index b6ec340..0890210 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -6,6 +6,8 @@ using System.Security.Cryptography; using NiceHashMiner.Configs; using NiceHashMiner.Configs.Data; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners; namespace NiceHashMiner.Devices { @@ -191,7 +193,26 @@ public DeviceBenchmarkConfig GetAlgorithmDeviceConfig() { public List GetAlgorithmSettings() { // hello state - return GetAlgorithmSettingsThirdParty(ConfigManager.GeneralConfig.Use3rdPartyMiners); + var algos = GetAlgorithmSettingsThirdParty(ConfigManager.GeneralConfig.Use3rdPartyMiners); + + var retAlgos = MinerPaths.GetAndInitAlgorithmsMinerPaths(algos, this);; + + // additional filters + // CPU + if (this.DeviceType == DeviceType.CPU && MinersManager.EquihashCPU_USE_eqm()) { + retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.nheqminer); + } else if (this.DeviceType == DeviceType.CPU) { + retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.eqm); + } + // NVIDIA + if (this.DeviceGroupType == DeviceGroupType.NVIDIA_5_x || this.DeviceGroupType == DeviceGroupType.NVIDIA_6_x) { + retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.nheqminer); + } else if (this.DeviceType == DeviceType.NVIDIA) { + retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.eqm); + } + + + return retAlgos; } private List GetAlgorithmSettingsThirdParty(Use3rdPartyMiners use3rdParty) { diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index b4dc167..d92b90a 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -411,14 +411,7 @@ static public void QueryCudaDevices() { group = DeviceGroupType.NVIDIA_3_x; break; case 5: - if(cudaDev.SM_minor == 0) { - group = DeviceGroupType.NVIDIA_5_0; - } else if (cudaDev.SM_minor == 2) { - group = DeviceGroupType.NVIDIA_5_2; - } else { - // default fallback should not happen - group = DeviceGroupType.NVIDIA_5_0; - } + group = DeviceGroupType.NVIDIA_5_x; break; case 6: group = DeviceGroupType.NVIDIA_6_x; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 7def6bb..104c38d 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -174,7 +174,7 @@ private static Dictionary> CreateDefaultsForGroup }; } // NVIDIA - if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType || DeviceGroupType.NVIDIA_5_0 == deviceGroupType || DeviceGroupType.NVIDIA_5_2 == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { + if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType || DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { var ToRemoveAlgoTypes = new List(); var ret = new Dictionary>() { { MinerBaseType.ccminer, diff --git a/NiceHashMiner/Enums/AlgorithmType.cs b/NiceHashMiner/Enums/AlgorithmType.cs index d025dbc..66c6498 100644 --- a/NiceHashMiner/Enums/AlgorithmType.cs +++ b/NiceHashMiner/Enums/AlgorithmType.cs @@ -37,7 +37,8 @@ public enum AlgorithmType : int Decred = 21, CryptoNight = 22, Lbry = 23, - Equihash = 24 + Equihash = 24, + Pascal #endregion // NiceHashAPI } } diff --git a/NiceHashMiner/Enums/DeviceGroupType.cs b/NiceHashMiner/Enums/DeviceGroupType.cs index 68feafc..89c89c0 100644 --- a/NiceHashMiner/Enums/DeviceGroupType.cs +++ b/NiceHashMiner/Enums/DeviceGroupType.cs @@ -11,8 +11,7 @@ public enum DeviceGroupType : int AMD_OpenCL, NVIDIA_2_1, NVIDIA_3_x, - NVIDIA_5_0, - NVIDIA_5_2, + NVIDIA_5_x, NVIDIA_6_x, LAST } diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 0815d1b..6b41329 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -404,7 +404,7 @@ void NextBenchmark() { } if (_currentDevice != null && _currentAlgorithm != null) { - _currentMiner = MinersManager.CreateMiner(_currentDevice, _currentAlgorithm); + _currentMiner = MinerFactory.CreateMiner(_currentDevice, _currentAlgorithm); if(_currentDevice.DeviceType == DeviceType.CPU && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { __CPUBenchmarkStatus = new CPUBenchmarkStatus(); _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index c62102c..f4c718e 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -37,8 +37,7 @@ public GroupMiner(List miningPairs, string key) { { var mPair = miningPairs[0]; DeviceType = mPair.Device.DeviceType; - Miner = MinersManager.CreateMiner(mPair.Device.DeviceType, - MinerPaths.GetOptimizedMinerPath(mPair)); + Miner = MinerFactory.CreateMiner(mPair.Device, mPair.Algorithm); if(Miner != null) { Miner.InitMiningSetup(new MiningSetup(miningPairs)); AlgorithmType = mPair.Algorithm.NiceHashID; diff --git a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs index bc0c69e..e78a3b6 100644 --- a/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs +++ b/NiceHashMiner/Miners/Grouping/GroupSetupUtils.cs @@ -11,9 +11,6 @@ public static class GroupSetupUtils { public static bool IsAlgoMiningCapable(Algorithm algo) { return algo != null && algo.Enabled && algo.BenchmarkSpeed > 0; } - public static bool IsValidMinerPath(ComputeDevice device, Algorithm algo) { - return MinerPaths.NONE != MinerPaths.GetOptimizedMinerPath(device, algo); - } public static Tuple getDeviceMiningStatus(ComputeDevice device) { DeviceMiningStatus status = DeviceMiningStatus.CanMine; @@ -24,7 +21,7 @@ public static Tuple getDeviceMiningStatus(Com } else { bool hasEnabledAlgo = false; foreach (Algorithm algo in device.GetAlgorithmSettings()) { - hasEnabledAlgo |= IsAlgoMiningCapable(algo) && IsValidMinerPath(device, algo); + hasEnabledAlgo |= IsAlgoMiningCapable(algo) && MinerPaths.IsValidMinerPath(algo.MinerBinaryPath); } if (hasEnabledAlgo == false) { status = DeviceMiningStatus.NoEnabledAlgorithms; @@ -79,7 +76,7 @@ private static void LogMiningNonMiningStatuses(List enabledDevices var device = miningDevice.Device; stringBuilder.AppendLine(String.Format("\tENABLED ({0})", device.GetFullName())); foreach (var algo in device.GetAlgorithmSettings()) { - var isEnabled = IsAlgoMiningCapable(algo) && IsValidMinerPath(device, algo); + var isEnabled = IsAlgoMiningCapable(algo) && MinerPaths.IsValidMinerPath(algo.MinerBinaryPath); stringBuilder.AppendLine(String.Format("\t\tALGORITHM {0} ({1})", isEnabled ? "ENABLED " : "DISABLED", // ENABLED/DISABLED algo.AlgorithmStringID)); @@ -99,48 +96,83 @@ public static List GetMiningDevices(List devices, b // avarage passed in benchmark values public static void AvarageSpeeds(List miningDevs) { - //// TODO BROKEN FIX - //// calculate avarage speeds, to ensure mining stability - //// device name, algo key, algos refs list - //Dictionary>> avarager = new Dictionary>>(); - //// init empty avarager - //foreach (var device in miningDevs) { - // string devName = device.Device.Name; - // avarager[devName] = new Dictionary>(); - // foreach (var key in AlgorithmNiceHashNames.GetAllAvaliableTypes()) { - // avarager[devName][key] = new List(); - // } - //} - //// fill avarager - //foreach (var device in miningDevs) { - // string devName = device.Device.Name; - // foreach (var kvp in device.Algorithms) { - // var key = kvp.Key; - // MiningAlgorithm algo = kvp.Value; - // avarager[devName][key].Add(algo); - // } - //} - //// calculate avarages - //foreach (var devDict in avarager.Values) { - // foreach (List miningAlgosList in devDict.Values) { - // // if list not empty calculate avarage - // if (miningAlgosList.Count > 0) { - // // calculate avarage - // double sum = 0; - // foreach (var algo in miningAlgosList) { - // sum += algo.AvaragedSpeed; - // } - // double avarageSpeed = sum / miningAlgosList.Count; - // // set avarage - // foreach (var algo in miningAlgosList) { - // algo.AvaragedSpeed = avarageSpeed; - // } - // } - // } - //} + // calculate avarage speeds, to ensure mining stability + // device name, algo key, algos refs list + Dictionary allAvaragers = new Dictionary(); + + // init empty avarager + foreach (var device in miningDevs) { + string devName = device.Device.Name; + allAvaragers[devName] = new AvaragerGroup(); + } + // fill avarager + foreach (var device in miningDevs) { + string devName = device.Device.Name; + // add UUID + allAvaragers[devName].UUIDsList.Add(device.Device.UUID); + allAvaragers[devName].AddAlgorithms(device.Algorithms); + } + // calculate and set new AvarageSpeeds for miningDeviceReferences + foreach (var curAvaragerKvp in allAvaragers) { + AvaragerGroup curAvarager = curAvaragerKvp.Value; + var calculatedAvaragers = curAvarager.CalculateAvarages(); + foreach (var uuid in curAvarager.UUIDsList) { + int minerDevIndex = miningDevs.FindIndex((dev) => dev.Device.UUID == uuid); + if (minerDevIndex > -1) { + foreach (var avgKvp in calculatedAvaragers) { + string algo_id = avgKvp.Key; + double avaragedSpeed = avgKvp.Value; + int index = miningDevs[minerDevIndex].Algorithms.FindIndex((a) => a.AlgorithmStringID == algo_id); + if(index > -1) { + miningDevs[minerDevIndex].Algorithms[index].AvaragedSpeed = avaragedSpeed; + } + } + } + } + } + } + + } + + class SpeedSumCount { + public double speed = 0; + public int count = 0; + public double GetAvarage() { + if (count > 0) { + return speed / (double)count; + } + return 0; + } + } + + class AvaragerGroup { + public string DeviceName; + public List UUIDsList = new List(); + // algo_id, speed_sum, speed_count + public Dictionary BenchmarkSums = new Dictionary(); + public Dictionary CalculateAvarages() { + Dictionary ret = new Dictionary(); + foreach (var kvp in this.BenchmarkSums) { + string algo_id = kvp.Key; + SpeedSumCount ssc = kvp.Value; + ret[algo_id] = ssc.GetAvarage(); + } + return ret; } + public void AddAlgorithms(List algos) { + foreach (var algo in algos) { + var algo_id = algo.AlgorithmStringID; + if (BenchmarkSums.ContainsKey(algo_id) == false) { + var ssc = new SpeedSumCount(); + ssc.count = 1; + ssc.speed = algo.BenchmarkSpeed; + BenchmarkSums[algo_id] = ssc; + } else { + BenchmarkSums[algo_id].count++; + BenchmarkSums[algo_id].speed += algo.BenchmarkSpeed; + } + } + } } } diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index a588492..fa8c9c6 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -8,13 +8,13 @@ namespace NiceHashMiner.Miners.Grouping { public static class GroupingLogic { public static bool ShouldGroup(MiningPair a, MiningPair b) { + bool canGroup = IsGroupableMinerBaseType(a) && IsGroupableMinerBaseType(b); // group if same bin path and same algo type - if (IsSameBinPath(a, b) && IsSameAlgorithmType(a, b)) { + if (canGroup && IsSameBinPath(a, b) && IsSameAlgorithmType(a, b)) { AlgorithmType algorithmType = a.Algorithm.NiceHashID; // AlgorithmType.Equihash is special case if (AlgorithmType.Equihash == algorithmType) { - string minerPath = MinerPaths.GetOptimizedMinerPath(a); - return EquihashGroup.IsEquihashGroupLogic(minerPath, + return EquihashGroup.IsEquihashGroupLogic(a.Algorithm.MinerBaseType, a, b); } // all other algorithms are grouped if DeviceType is same and is not CPU @@ -26,15 +26,15 @@ public static bool ShouldGroup(MiningPair a, MiningPair b) { } private static class EquihashGroup { - public static bool IsEquihashGroupLogic(string minerPath, MiningPair a, MiningPair b) { + public static bool IsEquihashGroupLogic(MinerBaseType minerBase, MiningPair a, MiningPair b) { // eqm - if (MinerPaths.eqm == minerPath) { + if (MinerBaseType.eqm == minerBase) { return Is_eqm(a, b); } // nheqmnier - else if (MinerPaths.nheqminer == minerPath) { + else if (MinerBaseType.nheqminer == minerBase) { return Is_nheqminer(a, b); - } else if (MinerPaths.ClaymoreZcashMiner == minerPath || MinerPaths.OptiminerZcashMiner == minerPath) { + } else if (MinerBaseType.ClaymoreAMD == minerBase || MinerBaseType.OptiminerAMD == minerBase) { return true; } return false; @@ -55,18 +55,14 @@ private static bool Is_eqm(MiningPair a, MiningPair b) { return IsDevice_eqm(a) && IsDevice_eqm(b); } private static bool IsDevice_eqm(MiningPair a) { - return IsCPU_eqm(a) || IsNVIDIA_eqm_sm50(a) || IsNVIDIA_eqm_sm52_plus(a); + return IsCPU_eqm(a) || IsNVIDIA_eqm(a); } private static bool IsCPU_eqm(MiningPair a) { - return MinersManager.EquihashCPU_USE_eqm() && a.Device.DeviceType == DeviceType.CPU; + return a.Device.DeviceType == DeviceType.CPU; } - private static bool IsNVIDIA_eqm_sm52_plus(MiningPair a) { + private static bool IsNVIDIA_eqm(MiningPair a) { var groupType = a.Device.DeviceGroupType; - return DeviceGroupType.NVIDIA_5_2 == groupType || DeviceGroupType.NVIDIA_6_x == groupType; - } - private static bool IsNVIDIA_eqm_sm50(MiningPair a) { - var groupType = a.Device.DeviceGroupType; - return DeviceGroupType.NVIDIA_5_0 == groupType; + return DeviceGroupType.NVIDIA_5_x == groupType || DeviceGroupType.NVIDIA_6_x == groupType; } } @@ -75,8 +71,7 @@ private static bool IsNotCpuGroups(MiningPair a, MiningPair b) { } private static bool IsSameBinPath(MiningPair a, MiningPair b) { - return MinerPaths.GetOptimizedMinerPath(a) - == MinerPaths.GetOptimizedMinerPath(b); + return a.Algorithm.MinerBinaryPath == b.Algorithm.MinerBinaryPath; } private static bool IsSameAlgorithmType(MiningPair a, MiningPair b) { return a.Algorithm.NiceHashID == b.Algorithm.NiceHashID; @@ -84,5 +79,8 @@ private static bool IsSameAlgorithmType(MiningPair a, MiningPair b) { private static bool IsSameDeviceType(MiningPair a, MiningPair b) { return a.Device.DeviceType == b.Device.DeviceType; } + private static bool IsGroupableMinerBaseType(MiningPair a) { + return a.Algorithm.MinerBaseType != MinerBaseType.cpuminer; + } } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 12073fd..4a780f4 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -54,8 +54,6 @@ public static class MinerPaths /// /// eqm /// - //public const string eqm_sm50 = _bin + @"\eqm\eqm.exe"; - //public const string eqm_sm52plus = _bin + @"\eqm_sm52plus\eqm.exe"; public const string eqm = _bin + @"\eqm\eqm.exe"; public const string NONE = ""; @@ -115,78 +113,11 @@ public static List GetAndInitAlgorithmsMinerPaths(List alg a.MinerBinaryPath = GetPathFor(computeDevice, a/*, Options*/); return a; }); - //// TODO settup what to use what not Options - //const thirdPartyMiners = [MinerBaseType.ClaymoreAMD, MinerBaseType.OptiminerAMD]; - //if (Options.Use3rdPartyMiners != Use3rdPartyMiners.YES) { - // retAlgos = retAlgos.filter((a) => thirdPartyMiners.indexOf(a.MinerBaseType) == -1); - //} return retAlgos; } // NEW END - public static string GetOptimizedMinerPath(MiningPair pair) { - return GetOptimizedMinerPath(pair.Device, pair.Algorithm); - } - - public static string GetOptimizedMinerPath(ComputeDevice computeDevice, Algorithm algorithm) { - if (computeDevice == null || algorithm == null) { - return NONE; - } - AlgorithmType algoType = algorithm.NiceHashID; - DeviceType devType = computeDevice.DeviceType; - DeviceGroupType devGroupType = computeDevice.DeviceGroupType; - string devCodename = computeDevice.Codename; - bool isOptimized = computeDevice.IsOptimizedVersion; - return GetOptimizedMinerPath(algoType, devType, devGroupType, devCodename, isOptimized); - } - - public static string GetOptimizedMinerPath(AlgorithmType algorithmType, DeviceType deviceType, DeviceGroupType deviceGroupType, string devCodename, bool isOptimized) { - // special cases - // AlgorithmType.DaggerHashimoto special shared case - if (algorithmType == AlgorithmType.DaggerHashimoto - && ( - (deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.AMD_DaggerHashimoto_UseSgminer == false) || deviceType == DeviceType.NVIDIA)) { - return MinerPaths.ethminer; - } - // AlgorithmType.Equihash special shared case - if (algorithmType == AlgorithmType.Equihash) { - if (deviceGroupType == DeviceGroupType.NVIDIA_5_0 || deviceGroupType == DeviceGroupType.NVIDIA_5_2 || deviceGroupType == DeviceGroupType.NVIDIA_6_x - || (MinersManager.EquihashCPU_USE_eqm() && DeviceGroupType.CPU == deviceGroupType)) { - return MinerPaths.eqm; - } else if(deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES) { // TODO remove state - if (ConfigManager.GeneralConfig.AMD_Equihash_3rdParty == AMD_Equihash_3rdParty.Claymore) { - return MinerPaths.ClaymoreZcashMiner; - } else { - return MinerPaths.OptiminerZcashMiner; - } - } - else { // supports all DeviceTypes - return MinerPaths.nheqminer; - } - } - // 3rd party miner - if (algorithmType == AlgorithmType.CryptoNight && deviceType == DeviceType.AMD && ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES && ConfigManager.GeneralConfig.AMD_CryptoNight_ForceSgminer == false) { - return MinerPaths.ClaymoreCryptoNightMiner; - } - // normal stuff - // CPU - if (deviceType == DeviceType.CPU) { - return CPU_GROUP.cpu_miner_opt(CPUUtils.GetMostOptimized()); - } - // NVIDIA - if (deviceType == DeviceType.NVIDIA) { - var nvidiaGroup = deviceGroupType; - - } - // AMD - if (deviceType == DeviceType.AMD) { - return AMD_GROUP.sgminer_path(algorithmType, devCodename, isOptimized); - } - - return NONE; - } - ////// private stuff from here on static class NVIDIA_GROUPS { public static string ccminer_sm21_or_sm3x(AlgorithmType algorithmType) { @@ -224,7 +155,7 @@ public static string ccminer_path(AlgorithmType algorithmType, DeviceGroupType n return NVIDIA_GROUPS.ccminer_sm21_or_sm3x(algorithmType); } // sm5x and sm6x have same settings - if (nvidiaGroup == DeviceGroupType.NVIDIA_5_0 || nvidiaGroup == DeviceGroupType.NVIDIA_5_2 || nvidiaGroup == DeviceGroupType.NVIDIA_6_x) { + if (nvidiaGroup == DeviceGroupType.NVIDIA_5_x || nvidiaGroup == DeviceGroupType.NVIDIA_6_x) { return NVIDIA_GROUPS.ccminer_sm5x_or_sm6x(algorithmType); } // TODO wrong case? diff --git a/NiceHashMiner/Miners/Grouping/MiningDevice.cs b/NiceHashMiner/Miners/Grouping/MiningDevice.cs index 583f336..06e24bd 100644 --- a/NiceHashMiner/Miners/Grouping/MiningDevice.cs +++ b/NiceHashMiner/Miners/Grouping/MiningDevice.cs @@ -49,7 +49,7 @@ public MiningDevice(ComputeDevice device) { Device = device; foreach (var algo in Device.GetAlgorithmSettings()) { bool isAlgoMiningCapable = GroupSetupUtils.IsAlgoMiningCapable(algo); - bool isValidMinerPath = GroupSetupUtils.IsValidMinerPath(device, algo); + bool isValidMinerPath = MinerPaths.IsValidMinerPath(algo.MinerBinaryPath); if (isAlgoMiningCapable && isValidMinerPath) { Algorithms.Add(algo); } diff --git a/NiceHashMiner/Miners/Grouping/MiningSetup.cs b/NiceHashMiner/Miners/Grouping/MiningSetup.cs index 99c878a..60082c3 100644 --- a/NiceHashMiner/Miners/Grouping/MiningSetup.cs +++ b/NiceHashMiner/Miners/Grouping/MiningSetup.cs @@ -15,14 +15,12 @@ public MiningSetup(List miningPairs) { this.IsInit = false; this.CurrentAlgorithmType = AlgorithmType.NONE; if (miningPairs != null && miningPairs.Count > 0) { - this.MinerPath = MinerPaths.GetOptimizedMinerPath(miningPairs[0]); - if(this.MinerPath != MinerPaths.NONE) { - this.MiningPairs = miningPairs; - this.MiningPairs.Sort((a, b) => a.Device.ID - b.Device.ID); - this.MinerName = miningPairs[0].Algorithm.MinerName; - this.CurrentAlgorithmType = miningPairs[0].Algorithm.NiceHashID; - this.IsInit = true; - } + this.MiningPairs = miningPairs; + this.MiningPairs.Sort((a, b) => a.Device.ID - b.Device.ID); + this.MinerName = miningPairs[0].Algorithm.MinerName; + this.CurrentAlgorithmType = miningPairs[0].Algorithm.NiceHashID; + this.MinerPath = miningPairs[0].Algorithm.MinerBinaryPath; + this.IsInit = MinerPaths.IsValidMinerPath(this.MinerPath); } } } diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs index 7718051..6c9ab0e 100644 --- a/NiceHashMiner/Miners/MinerFactory.cs +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -1,4 +1,5 @@ -using NiceHashMiner.Enums; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; using NiceHashMiner.Miners.Equihash; using System; using System.Collections.Generic; @@ -46,5 +47,13 @@ public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmTy } return null; } + + // create miner creates new miners based on device type and algorithm/miner path + public static Miner CreateMiner(ComputeDevice device, Algorithm algorithm) { + if (device != null && algorithm != null) { + return CreateMiner(device.DeviceType, algorithm.NiceHashID, algorithm.MinerBaseType); + } + return null; + } } } diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index c4485ba..ddf7865 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -37,49 +37,6 @@ public static bool EquihashCPU_USE_eqm() { || mostOptimized == CPUExtensionType.AVX_AES || mostOptimized == CPUExtensionType.AVX2_AES; } - // create miner creates new miners based on device type and algorithm/miner path - public static Miner CreateMiner(ComputeDevice device, Algorithm algorithm) { - var minerPath = MinerPaths.GetOptimizedMinerPath(device, algorithm); - if (minerPath != MinerPaths.NONE) { - return CreateMiner(device.DeviceType, minerPath); - } - return null; - } - - public static Miner CreateMiner(DeviceType deviceType, string minerPath) { - if ((minerPath == MinerPaths.eqm) && DeviceType.AMD != deviceType) { - return new eqm(); - } else if (minerPath == MinerPaths.nheqminer) { - return new nheqminer(); - } else if ( - ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES - && minerPath == MinerPaths.ClaymoreZcashMiner && DeviceType.AMD == deviceType) { - return new ClaymoreZcashMiner(); - } else if ( - ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES - && minerPath == MinerPaths.OptiminerZcashMiner && DeviceType.AMD == deviceType) { - return new OptiminerZcashMiner(); - } else if ( - ConfigManager.GeneralConfig.Use3rdPartyMiners == Use3rdPartyMiners.YES - && minerPath == MinerPaths.ClaymoreCryptoNightMiner && DeviceType.AMD == deviceType) { - return new ClaymoreCryptoNightMiner(); - } else if (minerPath == MinerPaths.ethminer && DeviceType.CPU != deviceType) { - if (DeviceType.AMD == deviceType) { - return new MinerEtherumOCL(); - } else { - return new MinerEtherumCUDA(); - } - } else if (minerPath.Contains("cpuminer") && DeviceType.CPU == deviceType) { - return new cpuminer(); - } else if (minerPath.Contains("sgminer") && DeviceType.AMD == deviceType) { - return new sgminer(); - } else if (minerPath.Contains("ccminer") && DeviceType.NVIDIA == deviceType) { - return new ccminer(); - } - - return null; - } - public static double GetTotalRate() { if (CurMiningSession != null) return CurMiningSession.GetTotalRate(); return 0; diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index edfe88c..658bca2 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -201,14 +201,13 @@ private static string Parse(List MiningPairs, List opti public static string ParseForMiningSetup(MiningSetup miningSetup, DeviceType deviceType, bool showLog = true) { return ParseForMiningPairs( miningSetup.MiningPairs, - deviceType, miningSetup.MinerPath, showLog); + deviceType, showLog); } public static string ParseForMiningPair(MiningPair miningPair, AlgorithmType algorithmType, DeviceType deviceType, bool showLog = true) { return ParseForMiningPairs( new List() { miningPair }, - deviceType, - MinerPaths.GetOptimizedMinerPath(miningPair), showLog); + deviceType, showLog); } private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType minerBaseType, AlgorithmType algorithmType) { @@ -266,7 +265,7 @@ private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType miner return MinerType.NONE; } - private static string ParseForMiningPairs(List MiningPairs, DeviceType deviceType, string minerPath, bool showLog = true) { + private static string ParseForMiningPairs(List MiningPairs, DeviceType deviceType, bool showLog = true) { _showLog = showLog; MinerBaseType minerBaseType = MinerBaseType.NONE; From 01dcb8836c8fefd804773d611d1fb7d88de30572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 4 Feb 2017 21:24:32 +0100 Subject: [PATCH 243/366] NVIDIA Pascal miner support --- NiceHashMiner/Devices/GroupAlgorithms.cs | 8 +- NiceHashMiner/Enums/MinerBaseType.cs | 3 +- NiceHashMiner/Miners/Equihash/eqm.cs | 4 - NiceHashMiner/Miners/Grouping/MinerPaths.cs | 3 + NiceHashMiner/Miners/MinerFactory.cs | 2 + NiceHashMiner/Miners/excavator.cs | 163 ++++++++++++++++++++ NiceHashMiner/NiceHashMiner.csproj | 1 + 7 files changed, 178 insertions(+), 6 deletions(-) create mode 100644 NiceHashMiner/Miners/excavator.cs diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 104c38d..0e3b0e2 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -201,6 +201,11 @@ private static Dictionary> CreateDefaultsForGroup new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") } }, + { MinerBaseType.excavator, + new List() { + new Algorithm(MinerBaseType.excavator, AlgorithmType.Pascal, "pascal") + } + }, }; if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { @@ -213,7 +218,8 @@ private static Dictionary> CreateDefaultsForGroup if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { AlgorithmType.DaggerHashimoto, - AlgorithmType.CryptoNight + AlgorithmType.CryptoNight, + AlgorithmType.Pascal }); } diff --git a/NiceHashMiner/Enums/MinerBaseType.cs b/NiceHashMiner/Enums/MinerBaseType.cs index 9b53583..24b1865 100644 --- a/NiceHashMiner/Enums/MinerBaseType.cs +++ b/NiceHashMiner/Enums/MinerBaseType.cs @@ -12,6 +12,7 @@ public enum MinerBaseType { eqm, ethminer, ClaymoreAMD, - OptiminerAMD + OptiminerAMD, + excavator } } diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index ced1893..a7a8212 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -20,10 +20,6 @@ public override void Start(string url, string btcAdress, string worker) { protected override string GetDevicesCommandString() { - //// old - //Path = MinerPaths.eqm; - //WorkingDirectory = MinerPaths.eqm.Replace("eqm.exe", ""); - // 2 paths Path = this.MiningSetup.MinerPath; WorkingDirectory = this.MiningSetup.MinerPath.Replace("eqm.exe", ""); diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 4a780f4..005d50c 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -55,6 +55,7 @@ public static class MinerPaths /// eqm /// public const string eqm = _bin + @"\eqm\eqm.exe"; + public const string excavator = _bin + @"\excavator\excavator.exe"; public const string NONE = ""; @@ -96,6 +97,8 @@ public static string GetPathFor(ComputeDevice computeDevice, Algorithm algorithm return AMD_GROUP.ClaymorePath(algoType); case MinerBaseType.OptiminerAMD: return MinerPaths.OptiminerZcashMiner; + case MinerBaseType.excavator: + return MinerPaths.excavator; } return MinerPaths.NONE; } diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs index 6c9ab0e..daa17b4 100644 --- a/NiceHashMiner/Miners/MinerFactory.cs +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -44,6 +44,8 @@ public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmTy return CreateClaymore(algorithmType); case MinerBaseType.OptiminerAMD: return new OptiminerZcashMiner(/*minersConfig*/); + case MinerBaseType.excavator: + return new excavator(); } return null; } diff --git a/NiceHashMiner/Miners/excavator.cs b/NiceHashMiner/Miners/excavator.cs new file mode 100644 index 0000000..09e1921 --- /dev/null +++ b/NiceHashMiner/Miners/excavator.cs @@ -0,0 +1,163 @@ +using Newtonsoft.Json; +using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Net.Sockets; +using System.Text; + +namespace NiceHashMiner.Miners { + public class excavator : Miner { + + private class DviceStat { + public int id { get; set; } + public string name { get; set; } + public double speed_hps { get; set; } + } + + private class Result { + public bool connected { get; set; } + public double interval_seconds { get; set; } + public double speed_hps { get; set; } + public List devices { get; set; } + public double accepted_per_minute { get; set; } + public double rejected_per_minute { get; set; } + } + + private class JsonApiResponse { + public string method { get; set; } + public Result result { get; set; } + public object error { get; set; } + } + + public excavator() + : base("excavator") { + ConectionType = NHMConectionType.NONE; + } + + public override void Start(string url, string btcAdress, string worker) { + string username = GetUsername(btcAdress, worker); + LastCommandLine = GetDevicesCommandString() + " -a " + this.MiningSetup.MinerName + " -p " + APIPort + " -s " + url + " -u " + username + ":x"; + ProcessHandle = _Start(); + } + + public override void InitMiningSetup(MiningSetup miningSetup) { + base.InitMiningSetup(miningSetup); + } + + protected override string GetDevicesCommandString() { + Path = this.MiningSetup.MinerPath; + WorkingDirectory = this.MiningSetup.MinerPath.Replace("excavator.exe", ""); + + string deviceStringCommand = " -cd "; + + foreach (var nvidia_pair in this.MiningSetup.MiningPairs) { + deviceStringCommand += nvidia_pair.Device.ID + " "; + } + //// no extra launch params + //deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(NVIDIA_Setup, DeviceType.NVIDIA); + + return deviceStringCommand; + } + + // benchmark stuff + + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + String ret = "-b " + time + " " + GetDevicesCommandString(); + return ret; + } + + const string TOTAL_MES = "Total measured:"; + protected override bool BenchmarkParseLine(string outdata) { + + if (outdata.Contains(TOTAL_MES)) { + try { + int speedStart = outdata.IndexOf(TOTAL_MES); + string speed = outdata.Substring(speedStart, outdata.Length - speedStart).Replace(TOTAL_MES, ""); + var splitSrs = speed.Trim().Split(' '); + if (splitSrs.Length >= 2) { + string speedStr = splitSrs[0]; + string postfixStr = splitSrs[1]; + double spd = Double.Parse(speedStr, CultureInfo.InvariantCulture); + if (postfixStr.Contains("kH/s")) + spd *= 1000; + else if (postfixStr.Contains("MH/s")) + spd *= 1000000; + else if (postfixStr.Contains("GH/s")) + spd *= 1000000000; + + BenchmarkAlgorithm.BenchmarkSpeed = spd; + return true; + } + } catch { + } + } + return false; + } + + public override APIData GetSummary() { + _currentMinerReadStatus = MinerAPIReadStatus.NONE; + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); + + TcpClient client = null; + JsonApiResponse resp = null; + try { + byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("status\n"); + client = new TcpClient("127.0.0.1", APIPort); + NetworkStream nwStream = client.GetStream(); + nwStream.Write(bytesToSend, 0, bytesToSend.Length); + byte[] bytesToRead = new byte[client.ReceiveBufferSize]; + int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); + string respStr = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead); + resp = JsonConvert.DeserializeObject(respStr, Globals.JsonSettings); + client.Close(); + } catch (Exception ex) { + Helpers.ConsolePrint("ERROR", ex.Message); + } + + if (resp != null && resp.error == null) { + ad.Speed = resp.result.speed_hps; + _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + if (ad.Speed == 0) { + _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; + } + } + + return ad; + } + + // DONE + protected override bool UpdateBindPortCommand(int oldPort, int newPort) { + return false; + } + + protected override void _Stop(MinerStopType willswitch) { + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); + } + + protected override int GET_MAX_CooldownTimeInMilliseconds() { + return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds + } + + protected double getNumber(string outdata, string startF, string remF) { + try { + int speedStart = outdata.IndexOf(startF); + String speed = outdata.Substring(speedStart, outdata.Length - speedStart); + speed = speed.Replace(startF, ""); + speed = speed.Replace(remF, ""); + speed = speed.Trim(); + return Double.Parse(speed, CultureInfo.InvariantCulture); + } catch { + } + return 0; + } + + // benchmark stuff + + protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { + CheckOutdata(outdata); + } + } +} diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index ff9a206..8af397e 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -203,6 +203,7 @@ + From 9e1309910d32ca0dac034b164f7bf5cdf338cc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 4 Feb 2017 21:55:53 +0100 Subject: [PATCH 244/366] replace sgminer general, add Pascal for AMD --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 2 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 5 +++-- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 6 +++--- NiceHashMiner/Miners/sgminer.cs | 3 +-- NiceHashMiner/ProfitabilityCalculator.cs | 1 + NiceHashMiner/Properties/AssemblyInfo.cs | 6 +++--- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index d92b90a..5426e2c 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -515,7 +515,7 @@ static public void QueryAMD() { // check the driver version bool EnableOptimizedVersion = true; Dictionary deviceDriverOld = new Dictionary(); Dictionary deviceDriverNO_neoscrypt_lyra2re = new Dictionary(); - string minerPath = MinerPaths.sgminer_5_5_0_general; + string minerPath = MinerPaths.sgminer_5_6_0_general; bool ShowWarningDialog = false; foreach (var vidContrllr in AvaliableVideoControllers) { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 0e3b0e2..d47115b 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -46,7 +46,7 @@ public static Dictionary> CreateForDevice(Compute // Ellesmere sgminer workaround, keep this until sgminer is fixed to work with Ellesmere if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris")) && Globals.IsEllesmereSgminerIgnore) { // remove all algos except equi and dagger - var ignoreRemove = new List {AlgorithmType.DaggerHashimoto, AlgorithmType.Equihash, AlgorithmType.CryptoNight}; + var ignoreRemove = new List {AlgorithmType.DaggerHashimoto, AlgorithmType.Equihash, AlgorithmType.CryptoNight, AlgorithmType.Pascal}; var toRemove = GetKeysForMinerAlgosGroup(algoSettings).FindAll((algoType) => ignoreRemove.IndexOf(algoType) == -1); algoSettings = FilterMinerAlgos(algoSettings, toRemove); // remove all sgminer? @@ -147,7 +147,8 @@ private static Dictionary> CreateDefaultsForGroup new Algorithm(MinerBaseType.sgminer, AlgorithmType.DaggerHashimoto, "ethash") { ExtraLaunchParameters = "--xintensity 512 -w 192 -g 1" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" } + new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.Pascal, "pascal") { ExtraLaunchParameters = DefaultParam + "--intensity 21 -w 64 -g 2" } } }, { MinerBaseType.ethminer, diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index ebf1fcb..071158b 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = "_PENDING"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 005d50c..c10aba2 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -42,7 +42,7 @@ public static class MinerPaths /// public const string sgminer_5_1_0_optimized = _bin + @"\sgminer-5-1-0-optimized\sgminer.exe"; public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; - public const string sgminer_5_5_0_general = _bin + @"\sgminer-5-5-0-general\sgminer.exe"; + public const string sgminer_5_6_0_general = _bin + @"\sgminer-5-6-0-general\sgminer.exe"; public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; @@ -175,7 +175,7 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type || AlgorithmType.Qubit == type) { if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { if (!Helpers.InternalCheckIsWow64()) - return MinerPaths.sgminer_5_5_0_general; + return MinerPaths.sgminer_5_6_0_general; return MinerPaths.sgminer_5_4_0_tweaked; } @@ -186,7 +186,7 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i } } - return MinerPaths.sgminer_5_5_0_general; + return MinerPaths.sgminer_5_6_0_general; } public static string ClaymorePath(AlgorithmType type) { diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 48b9058..4974688 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -26,8 +26,7 @@ class sgminer : Miner public sgminer() : base("sgminer_AMD") - { - Path = MinerPaths.sgminer_5_5_0_general; + { GPUPlatformNumber = ComputeDeviceManager.Avaliable.AMDOpenCLPlatformNum; IsKillAllUsedMinerProcs = true; } diff --git a/NiceHashMiner/ProfitabilityCalculator.cs b/NiceHashMiner/ProfitabilityCalculator.cs index 66346a0..aa4b927 100644 --- a/NiceHashMiner/ProfitabilityCalculator.cs +++ b/NiceHashMiner/ProfitabilityCalculator.cs @@ -41,6 +41,7 @@ static class ProfitabilityCalculator { { AlgorithmType.CryptoNight , kHs }, { AlgorithmType.Lbry , GHs }, { AlgorithmType.Equihash , 1 }, // Sols /s + { AlgorithmType.Pascal , GHs }, // Sols /s }; public static double GetFormatedSpeed(double speed, AlgorithmType type) { diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index d066a2a..13d6fc5 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("NiceHash")] [assembly: AssemblyProduct("NiceHashMiner")] -[assembly: AssemblyCopyright("NiceHash © 2016")] +[assembly: AssemblyCopyright("NiceHash © 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.4.3")] -[assembly: AssemblyFileVersion("1.7.4.3")] +[assembly: AssemblyVersion("1.7.4.4")] +[assembly: AssemblyFileVersion("1.7.4.4")] diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index d24b3da..2c023de 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_4_2.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_4_4.zip", "bins.zip", "bin"); From 4396b24e6caf89be821614b96300ea2a7fb04aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 4 Feb 2017 22:02:30 +0100 Subject: [PATCH 245/366] fix benchmark indicator --- NiceHashMiner/Devices/ComputeDevice.cs | 8 ++++ .../Forms/Components/AlgorithmsListView.cs | 40 +++++++++---------- NiceHashMiner/Forms/Form_Benchmark.cs | 10 ++--- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 0890210..1496616 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -128,6 +128,14 @@ public Algorithm GetAlgorithm(MinerBaseType MinerBaseType, AlgorithmType Algorit return null; } + public Algorithm GetAlgorithm(string algoID) { + int toSetIndex = this.AlgorithmSettings.FindIndex((a) => a.AlgorithmStringID == algoID); + if (toSetIndex > -1) { + return this.AlgorithmSettings[toSetIndex]; + } + return null; + } + public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { foreach (var copyFromAlgo in copyBenchCDev.AlgorithmSettings) { var setAlgo = GetAlgorithm(copyFromAlgo.MinerBaseType, copyFromAlgo.NiceHashID); diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 62cb453..96ec3ab 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -150,28 +150,24 @@ public void ResetListItemColors() { } // benchmark settings - public void SetSpeedStatus(ComputeDevice computeDevice, AlgorithmType algorithmType, string status) { - // TODO BROKEN FIX - //var algorithm = computeDevice.AlgorithmSettings[algorithmType]; - //algorithm.BenchmarkStatus = status; - - - - - //// gui update only if same as selected - //if (_computeDevice != null && computeDevice.UUID == _computeDevice.UUID) { - // foreach (ListViewItem lvi in listViewAlgorithms.Items) { - // Algorithm algo = lvi.Tag as Algorithm; - // if (algo != null && algo.NiceHashID == algorithmType) { - // // TODO handle numbers - // lvi.SubItems[SPEED].Text = algorithm.BenchmarkSpeedString(); - // lvi.SubItems[RATE].Text = algorithm.CurPayingRate; - // lvi.SubItems[RATIO].Text = algorithm.CurPayingRatio; - // _listItemCheckColorSetter.LviSetColor(lvi); - // break; - // } - // } - //} + public void SetSpeedStatus(ComputeDevice computeDevice, Algorithm algorithm, string status) { + if (algorithm != null) { + algorithm.BenchmarkStatus = status; + // gui update only if same as selected + if (_computeDevice != null && computeDevice.UUID == _computeDevice.UUID) { + foreach (ListViewItem lvi in listViewAlgorithms.Items) { + Algorithm algo = lvi.Tag as Algorithm; + if (algo != null && algo.AlgorithmStringID == algorithm.AlgorithmStringID) { + // TODO handle numbers + lvi.SubItems[SPEED].Text = algorithm.BenchmarkSpeedString(); + lvi.SubItems[RATE].Text = algorithm.CurPayingRate; + lvi.SubItems[RATIO].Text = algorithm.CurPayingRatio; + _listItemCheckColorSetter.LviSetColor(lvi); + break; + } + } + } + } } private void listViewAlgorithms_MouseClick(object sender, MouseEventArgs e) { diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 6b41329..d401645 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -182,7 +182,7 @@ private void CopyBenchmarks() { private void BenchmarkingTimer_Tick(object sender, EventArgs e) { if (_inBenchmark) { - algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, getDotsWaitString()); + algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm, getDotsWaitString()); } } @@ -432,7 +432,7 @@ void NextBenchmark() { _benchmarkingTimer.Start(); _currentMiner.BenchmarkStart(time, this); - algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, + algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm, getDotsWaitString()); } else { NextBenchmark(); @@ -481,7 +481,7 @@ void EndBenchmark() { public void SetCurrentStatus(string status) { this.Invoke((MethodInvoker)delegate { - algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, getDotsWaitString()); + algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm, getDotsWaitString()); }); } @@ -519,11 +519,11 @@ public void OnBenchmarkComplete(bool success, string status) { Device = _currentDevice.Name, Algorithm = _currentAlgorithm.AlgorithmName } ); - algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, status); + algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm, status); } else if (!rebenchSame) { // set status to empty string it will return speed _currentAlgorithm.ClearBenchmarkPending(); - algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm.NiceHashID, ""); + algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm, ""); } if (rebenchSame) { _currentMiner.BenchmarkStart(__CPUBenchmarkStatus.Time, this); From 4d5d499e4ecb60f4c31c93c361d2291121ea7ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 4 Feb 2017 22:27:37 +0100 Subject: [PATCH 246/366] remove API bind port changing when restarting miner --- NiceHashMiner/Globals.cs | 2 +- NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 11 ------- .../Miners/Equihash/OptiminerZcashMiner.cs | 11 ------- NiceHashMiner/Miners/Equihash/nheqBase.cs | 12 ------- NiceHashMiner/Miners/Miner.cs | 32 ------------------- NiceHashMiner/Miners/ccminer.cs | 4 --- NiceHashMiner/Miners/cpuminer.cs | 4 --- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 13 -------- NiceHashMiner/Miners/excavator.cs | 5 --- NiceHashMiner/Miners/sgminer.cs | 12 ------- 10 files changed, 1 insertion(+), 105 deletions(-) diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index c8c5b0f..93e673a 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -8,7 +8,7 @@ public class Globals { public static string[] MiningLocation = { "eu", "usa", "hk", "jp" }; public static Dictionary NiceHashData = null; public static double BitcoinRate; - public static readonly string DemoUser = "34HKWdzLxWBduUfJE9JxaFhoXnfC6gmePG"; + public static readonly string DemoUser = "3DJhaQaKA6oyRaGyDZYdkZcise4b9DrCi2"; public static readonly string PasswordDefault = "x"; public static JsonSerializerSettings JsonSettings = null; public static int ThreadsPerCPU; diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index 16dca2a..7bf1e3c 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -102,17 +102,6 @@ public override APIData GetSummary() { return ad; } - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - const string MASK = "-mport -{0}"; - var oldApiBindStr = String.Format(MASK, oldPort); - var newApiBindStr = String.Format(MASK, newPort); - if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { - LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - return true; - } - return false; - } - protected override void _Stop(MinerStopType willswitch) { Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs index 4ccf5cd..828625e 100644 --- a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -43,17 +43,6 @@ public override void Start(string url, string btcAdress, string worker) { ProcessHandle = _Start(); } - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - const string MASK = "-m {0}"; - var oldApiBindStr = String.Format(MASK, oldPort); - var newApiBindStr = String.Format(MASK, newPort); - if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { - LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - return true; - } - return false; - } - protected override void _Stop(MinerStopType willswitch) { Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } diff --git a/NiceHashMiner/Miners/Equihash/nheqBase.cs b/NiceHashMiner/Miners/Equihash/nheqBase.cs index e7de406..704d86a 100644 --- a/NiceHashMiner/Miners/Equihash/nheqBase.cs +++ b/NiceHashMiner/Miners/Equihash/nheqBase.cs @@ -99,18 +99,6 @@ public override APIData GetSummary() { return ad; } - // DONE - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - const string MASK = "-a {0}"; - var oldApiBindStr = String.Format(MASK, oldPort); - var newApiBindStr = String.Format(MASK, newPort); - if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { - LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - return true; - } - return false; - } - protected override void _Stop(MinerStopType willswitch) { Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 2ceb6e4..4f5899b 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -228,28 +228,10 @@ public void End() { Stop(MinerStopType.FORCE_END); } - protected void ChangeToNextAvaliablePort() { - // change to new port - var oldApiPort = APIPort; - var newApiPort = MinersApiPortsManager.GetAvaliablePort(); - // check if update last command port - if (UpdateBindPortCommand(oldApiPort, newApiPort)) { - Helpers.ConsolePrint(MinerTAG(), String.Format("Changing miner port from {0} to {1}", - oldApiPort.ToString(), - newApiPort.ToString())); - // free old set new - MinersApiPortsManager.RemovePort(oldApiPort); - APIPort = newApiPort; - } else { // release new - MinersApiPortsManager.RemovePort(newApiPort); - } - } - protected void Stop_cpu_ccminer_sgminer_nheqminer(MinerStopType willswitch) { if (IsRunning) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Shutting down miner"); } - if (willswitch != MinerStopType.FORCE_END) ChangeToNextAvaliablePort(); if (ProcessHandle != null) { try { ProcessHandle.Kill(); } catch { } ProcessHandle.Close(); @@ -613,20 +595,6 @@ protected void ScheduleRestart(int ms) { _currentCooldownTimeInSecondsLeft = RestartInMS; } - protected abstract bool UpdateBindPortCommand(int oldPort, int newPort); - - protected bool UpdateBindPortCommand_ccminer_cpuminer(int oldPort, int newPort) { - // --api-bind= - const string MASK = "--api-bind={0}"; - var oldApiBindStr = String.Format(MASK, oldPort); - var newApiBindStr = String.Format(MASK, newPort); - if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { - LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - return true; - } - return false; - } - protected void Restart() { if (!isEnded) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Restarting miner.."); diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index 783ddda..a36a9aa 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -65,10 +65,6 @@ protected override void _Stop(MinerStopType willswitch) { Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - return UpdateBindPortCommand_ccminer_cpuminer(oldPort, newPort); - } - // new decoupled benchmarking routines #region Decoupled benchmarking routines diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index 9015b08..06d84e1 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -56,10 +56,6 @@ protected override NiceHashProcess _Start() { return P; } - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - return UpdateBindPortCommand_ccminer_cpuminer(oldPort, newPort); - } - // new decoupled benchmarking routines #region Decoupled benchmarking routines diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index 07da344..c504a06 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -158,7 +158,6 @@ protected override void _Stop(MinerStopType willswitch) { } else if ((IsRunning || IsPaused) && willswitch != MinerStopType.SWITCH) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " Shutting down miner"); } - if (willswitch == MinerStopType.END) ChangeToNextAvaliablePort(); if ((willswitch == MinerStopType.FORCE_END || willswitch == MinerStopType.END) && ProcessHandle != null) { IsPaused = false; // shutting down means it is not paused try { @@ -170,18 +169,6 @@ protected override void _Stop(MinerStopType willswitch) { } } - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - // --api-port - const string MASK = "--api-port {0}"; - var oldApiBindStr = String.Format(MASK, oldPort); - var newApiBindStr = String.Format(MASK, newPort); - if (LastCommandLine != null && LastCommandLine.Contains(oldApiBindStr)) { - LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - return true; - } - return false; - } - // benchmark stuff protected override bool BenchmarkParseLine(string outdata) { if (outdata.Contains("min/mean/max:")) { diff --git a/NiceHashMiner/Miners/excavator.cs b/NiceHashMiner/Miners/excavator.cs index 09e1921..717cdac 100644 --- a/NiceHashMiner/Miners/excavator.cs +++ b/NiceHashMiner/Miners/excavator.cs @@ -128,11 +128,6 @@ public override APIData GetSummary() { return ad; } - // DONE - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - return false; - } - protected override void _Stop(MinerStopType willswitch) { Stop_cpu_ccminer_sgminer_nheqminer(willswitch); } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 4974688..3ba5106 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -89,18 +89,6 @@ public override void Start(string url, string btcAdress, string worker) ProcessHandle = _Start(); } - protected override bool UpdateBindPortCommand(int oldPort, int newPort) { - // --api-port= - const string MASK = "--api-port={0}"; - var oldApiBindStr = String.Format(MASK, oldPort); - var newApiBindStr = String.Format(MASK, newPort); - if (LastCommandLine.Contains(oldApiBindStr)) { - LastCommandLine = LastCommandLine.Replace(oldApiBindStr, newApiBindStr); - return true; - } - return false; - } - // new decoupled benchmarking routines #region Decoupled benchmarking routines From 6be524c40f44a2cbc9a0bf7a3496f615f91e5d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 5 Feb 2017 00:56:00 +0100 Subject: [PATCH 247/366] added deterministic and automatic API port settings, remove unused config flags, update bins file list --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 7 - NiceHashMiner/Devices/GroupAlgorithms.cs | 3 +- NiceHashMiner/Enums/AlgorithmType.cs | 59 +++- NiceHashMiner/Enums/MinerBaseType.cs | 3 +- NiceHashMiner/Forms/Form_Main.cs | 16 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 39 +-- NiceHashMiner/Miners/Miner.cs | 20 +- NiceHashMiner/Miners/MinersApiPortsManager.cs | 4 +- NiceHashMiner/Miners/MinersSettingsManager.cs | 138 +++++++++ .../Miners/Parsing/ExtraLaunchParameters.cs | 5 +- NiceHashMiner/NiceHashMiner.csproj | 1 + NiceHashMiner/ProfitabilityCalculator.cs | 52 ++-- NiceHashMiner/Utils/BINS_CODEGEN.cs | 269 ++++++++---------- 13 files changed, 375 insertions(+), 241 deletions(-) create mode 100644 NiceHashMiner/Miners/MinersSettingsManager.cs diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index 638e6a4..d082598 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -58,10 +58,6 @@ public class GeneralConfig { // 3rd party miners public Use3rdPartyMiners Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; public bool DownloadInit3rdParty = false; - public AMD_Equihash_3rdParty AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; - public bool AMD_DaggerHashimoto_UseSgminer = true; - public bool AMD_CryptoNight_ForceSgminer = false; - public bool NVIDIA_CryptoNight_Preventive = true; public bool AllowMultipleInstances = true; @@ -111,9 +107,6 @@ public void SetDefaults() { Use3rdPartyMiners = Use3rdPartyMiners.NOT_SET; DownloadInit3rdParty = false; AllowMultipleInstances = true; - AMD_Equihash_3rdParty = AMD_Equihash_3rdParty.Claymore; - AMD_DaggerHashimoto_UseSgminer = true; - AMD_CryptoNight_ForceSgminer = false; } public void FixSettingBounds() { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index d47115b..c0cb513 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -113,7 +113,7 @@ public static List CreateForDeviceList(ComputeDevice device) { return ret; } - private static Dictionary> CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { + public static Dictionary> CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { if (DeviceGroupType.CPU == deviceGroupType) { return new Dictionary>() { { MinerBaseType.cpuminer, @@ -210,7 +210,6 @@ private static Dictionary> CreateDefaultsForGroup }; if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { - AlgorithmType.WhirlpoolX, AlgorithmType.NeoScrypt, AlgorithmType.Lyra2RE, AlgorithmType.Lyra2REv2 diff --git a/NiceHashMiner/Enums/AlgorithmType.cs b/NiceHashMiner/Enums/AlgorithmType.cs index 66c6498..015c791 100644 --- a/NiceHashMiner/Enums/AlgorithmType.cs +++ b/NiceHashMiner/Enums/AlgorithmType.cs @@ -13,32 +13,65 @@ public enum AlgorithmType : int INVALID = -2, NONE = -1, #region NiceHashAPI + //Scrypt_UNUSED = 0, + //SHA256_UNUSED = 1, + //ScryptNf_UNUSED = 2, + //X11_UNUSED = 3, + //X13 = 4, + //Keccak = 5, + //X15 = 6, + //Nist5 = 7, + //NeoScrypt = 8, + //Lyra2RE = 9, + //WhirlpoolX = 10, + //Qubit = 11, + //Quark = 12, + //Axiom_UNUSED = 13, + //Lyra2REv2 = 14, + //ScryptJaneNf16_UNUSED = 15, + //Blake256r8 = 16, + //Blake256r14 = 17, // NOT USED ANYMORE? + //Blake256r8vnl = 18, + //Hodl = 19, + //DaggerHashimoto = 20, + //Decred = 21, + //CryptoNight = 22, + //Lbry = 23, + //Equihash = 24, + //Pascal = 25 + // UNUSED START Scrypt_UNUSED = 0, SHA256_UNUSED = 1, ScryptNf_UNUSED = 2, X11_UNUSED = 3, - X13 = 4, - Keccak = 5, - X15 = 6, - Nist5 = 7, + X13_UNUSED = 4, + Keccak_UNUSED = 5, + X15_UNUSED = 6, + Nist5_UNUSED = 7, + + WhirlpoolX_UNUSED = 10, + Qubit_UNUSED = 11, + Quark_UNUSED = 12, + Axiom_UNUSED = 13, + + ScryptJaneNf16_UNUSED = 15, + Blake256r8_UNUSED = 16, + Blake256r14_UNUSED = 17, + Blake256r8vnl_UNUSED = 18, + // UNUSED END + NeoScrypt = 8, Lyra2RE = 9, - WhirlpoolX = 10, - Qubit = 11, - Quark = 12, - Axiom_UNUSED = 13, + Lyra2REv2 = 14, - ScryptJaneNf16_UNUSED = 15, - Blake256r8 = 16, - Blake256r14 = 17, // NOT USED ANYMORE? - Blake256r8vnl = 18, + Hodl = 19, DaggerHashimoto = 20, Decred = 21, CryptoNight = 22, Lbry = 23, Equihash = 24, - Pascal + Pascal = 25 #endregion // NiceHashAPI } } diff --git a/NiceHashMiner/Enums/MinerBaseType.cs b/NiceHashMiner/Enums/MinerBaseType.cs index 24b1865..532e257 100644 --- a/NiceHashMiner/Enums/MinerBaseType.cs +++ b/NiceHashMiner/Enums/MinerBaseType.cs @@ -13,6 +13,7 @@ public enum MinerBaseType { ethminer, ClaymoreAMD, OptiminerAMD, - excavator + excavator, + END } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 071158b..55a2d2a 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -183,23 +183,9 @@ private void StartupTimer_Tick(object sender, EventArgs e) { StartupTimer.Stop(); StartupTimer = null; - // reverted to .NET 2.0 - //if (!Helpers.Is45NetOrHigher()) { - // MessageBox.Show(International.GetText("NET45_Not_Intsalled_msg"), - // International.GetText("Warning_with_Exclamation"), - // MessageBoxButtons.OK); - - // this.Close(); - // return; - //} - - // reverted to .NET 2.0 - //CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture; - //CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; - // Internals Init // TODO add loading step - ExtraLaunchParameters.InitializePackages(); + MinersSettingsManager.Init(); if (!Helpers.InternalCheckIsWow64()) { diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index c10aba2..0df5abb 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -41,7 +41,7 @@ public static class MinerPaths /// sgminers /// public const string sgminer_5_1_0_optimized = _bin + @"\sgminer-5-1-0-optimized\sgminer.exe"; - public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; + //public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; public const string sgminer_5_6_0_general = _bin + @"\sgminer-5-6-0-general\sgminer.exe"; public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; @@ -72,21 +72,14 @@ public static bool IsMinerAlgorithmAvaliable(List algos, MinerBaseTyp return algos.FindIndex((a) => a.MinerBaseType == minerBaseType && a.NiceHashID == algorithmType) > -1; } - public static string GetPathFor(ComputeDevice computeDevice, Algorithm algorithm /*, Options: MinerPathsConfig*/) { - if (computeDevice == null || algorithm == null) { - return MinerPaths.NONE; - } - var algoType = algorithm.NiceHashID; - var devGroupType = computeDevice.DeviceGroupType; - var devCodename = computeDevice.Codename; - var isOptimized = computeDevice.IsOptimizedVersion; - switch (algorithm.MinerBaseType) { + public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoType, DeviceGroupType devGroupType, string devCodenameAMD, bool isOptimizedAMD, CPUExtensionType MostOptimizedCPUExtensionType) { + switch (minerBaseType) { case MinerBaseType.cpuminer: - return CPU_GROUP.cpu_miner_opt(CPUUtils.GetMostOptimized()/*Options.MostOptimizedCPUExtensionType*/); + return CPU_GROUP.cpu_miner_opt(MostOptimizedCPUExtensionType); case MinerBaseType.ccminer: return NVIDIA_GROUPS.ccminer_path(algoType, devGroupType); case MinerBaseType.sgminer: - return AMD_GROUP.sgminer_path(algoType, devCodename, isOptimized); + return AMD_GROUP.sgminer_path(algoType, devCodenameAMD, isOptimizedAMD); case MinerBaseType.nheqminer: return MinerPaths.nheqminer; case MinerBaseType.eqm: @@ -103,6 +96,21 @@ public static string GetPathFor(ComputeDevice computeDevice, Algorithm algorithm return MinerPaths.NONE; } + public static string GetPathFor(ComputeDevice computeDevice, Algorithm algorithm /*, Options: MinerPathsConfig*/) { + if (computeDevice == null || algorithm == null) { + return MinerPaths.NONE; + } + + return GetPathFor( + algorithm.MinerBaseType, + algorithm.NiceHashID, + computeDevice.DeviceGroupType, + computeDevice.Codename, + computeDevice.IsOptimizedVersion, + CPUUtils.GetMostOptimized() + ); + } + public static bool IsValidMinerPath(string minerPath) { // TODO make a list of valid miner paths and check that instead return minerPath != null && MinerPaths.NONE != minerPath && minerPath != ""; @@ -172,17 +180,14 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i return MinerPaths.sgminer_gm; } if (isOptimized) { - if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type || AlgorithmType.Qubit == type) { + if (AlgorithmType.Lyra2REv2 == type) { if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { if (!Helpers.InternalCheckIsWow64()) return MinerPaths.sgminer_5_6_0_general; return MinerPaths.sgminer_5_4_0_tweaked; } - if (AlgorithmType.Quark == type || AlgorithmType.Lyra2REv2 == type) - return MinerPaths.sgminer_5_1_0_optimized; - else - return MinerPaths.sgminer_5_1_1_optimized; + return MinerPaths.sgminer_5_1_0_optimized; } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 4f5899b..24e1138 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -126,7 +126,6 @@ public Miner(string minerDeviceName) LastCommandLine = ""; - APIPort = MinersApiPortsManager.GetAvaliablePort(); IsAPIReadException = false; IsNeverHideMiningWindow = false; IsKillAllUsedMinerProcs = false; @@ -141,10 +140,29 @@ public Miner(string minerDeviceName) Helpers.ConsolePrint(MinerTAG(), "MINER DESTROYED"); } + private void SetAPIPort() { + if (IsInit) { + var minerBase = MiningSetup.MiningPairs[0].Algorithm.MinerBaseType; + var algoType = MiningSetup.MiningPairs[0].Algorithm.NiceHashID; + var path = MiningSetup.MinerPath; + var reservedPorts = MinersSettingsManager.GetPortsListFor(minerBase, path, algoType); + APIPort = -1; // not set + foreach (var reservedPort in reservedPorts) { + if (MinersApiPortsManager.IsPortAvaliable(reservedPort)) { + APIPort = reservedPort; + break; + } + } + if (APIPort == -1) { + APIPort = MinersApiPortsManager.GetAvaliablePort(); + } + } + } virtual public void InitMiningSetup(MiningSetup miningSetup) { MiningSetup = miningSetup; IsInit = MiningSetup.IsInit; + SetAPIPort(); } // TODO remove or don't recheck diff --git a/NiceHashMiner/Miners/MinersApiPortsManager.cs b/NiceHashMiner/Miners/MinersApiPortsManager.cs index ae6cb1c..3a1fa64 100644 --- a/NiceHashMiner/Miners/MinersApiPortsManager.cs +++ b/NiceHashMiner/Miners/MinersApiPortsManager.cs @@ -10,7 +10,7 @@ namespace NiceHashMiner.Miners { public static class MinersApiPortsManager { private static HashSet _usedPorts = new HashSet(); - private static bool IsPortAvaliable(int port) { + public static bool IsPortAvaliable(int port) { bool isAvailable = true; IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties(); @@ -41,7 +41,7 @@ public static int GetAvaliablePort() { int port = ConfigManager.GeneralConfig.ApiBindPortPoolStart; int newPortEnd = port + 3000; for (; port < newPortEnd; ++port) { - if (IsPortAvaliable(port) && _usedPorts.Add(port)) { + if (MinersSettingsManager.AllReservedPorts.Contains(port) == false && IsPortAvaliable(port) && _usedPorts.Add(port)) { break; } } diff --git a/NiceHashMiner/Miners/MinersSettingsManager.cs b/NiceHashMiner/Miners/MinersSettingsManager.cs new file mode 100644 index 0000000..baf4894 --- /dev/null +++ b/NiceHashMiner/Miners/MinersSettingsManager.cs @@ -0,0 +1,138 @@ +using NiceHashMiner.Configs.ConfigJsonFile; +using NiceHashMiner.Devices; +using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Grouping; +using NiceHashMiner.Miners.Parsing; +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Miners { + public static class MinersSettingsManager { + + class MinerReservedPortsFile : ConfigFile>>>> { + public MinerReservedPortsFile() + : base(FOLDERS.CONFIG, "MinerReservedPorts.json", "MinerReservedPorts_old.json") { + } + } + + private static Dictionary>>> MinerReservedPorts = new Dictionary>>>(); + public static List AllReservedPorts = new List(); + + public static void Init() { + ExtraLaunchParameters.InitializePackages(); + InitMinerReservedPortsFile(); + } + + public static List GetPortsListFor(MinerBaseType minerBaseType, string path, AlgorithmType algorithmType) { + if (MinerReservedPorts != null && MinerReservedPorts.ContainsKey(minerBaseType)) { + if (MinerReservedPorts[minerBaseType] != null && MinerReservedPorts[minerBaseType].ContainsKey(path)) { + if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algorithmType)) { + if (MinerReservedPorts[minerBaseType][path][algorithmType] != null) { + return MinerReservedPorts[minerBaseType][path][algorithmType]; + } + } + } + } + + return new List(); + } + + public static void InitMinerReservedPortsFile() { + var AMDCodenames = new List() { "Hawaii", "Pitcairn", "Tahiti" }; + var AMDOptimizations = new List() { true, false }; + var CPUExtensions = new List() { + CPUExtensionType.AVX2_AES, + CPUExtensionType.AVX2, + CPUExtensionType.AVX_AES, + CPUExtensionType.AVX, + CPUExtensionType.AES, + CPUExtensionType.SSE2 + }; + MinerReservedPortsFile file = new MinerReservedPortsFile(); + MinerReservedPorts = new Dictionary>>>(); + if (file.IsFileExists()) { + var read = file.ReadFile(); + if (read != null) { + MinerReservedPorts = read; + } + } + try { + for (MinerBaseType type = (MinerBaseType.NONE + 1); type < MinerBaseType.END; ++type) { + if (MinerReservedPorts.ContainsKey(type) == false) { + MinerReservedPorts[type] = new Dictionary>>(); + } + } + for (DeviceGroupType devGroupType = (DeviceGroupType.NONE + 1); devGroupType < DeviceGroupType.LAST; ++devGroupType) { + var minerAlgosForGroup = GroupAlgorithms.CreateDefaultsForGroup(devGroupType); + if (minerAlgosForGroup != null) { + foreach (var mbaseKvp in minerAlgosForGroup) { + MinerBaseType minerBaseType = mbaseKvp.Key; + if (MinerReservedPorts.ContainsKey(minerBaseType)) { + var algos = mbaseKvp.Value; + // CPU case + if (MinerBaseType.cpuminer == minerBaseType) { + foreach (var algo in algos) { + foreach (var cpuExt in CPUExtensions) { + var algoType = algo.NiceHashID; + var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, "", false, cpuExt); + if (path != MinerPaths.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { + MinerReservedPorts[minerBaseType][path] = new Dictionary>(); + } + if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { + MinerReservedPorts[minerBaseType][path][algoType] = new List(); + } + } + } + } else if (MinerBaseType.sgminer == minerBaseType) { + foreach (var algo in algos) { + foreach (var isOptimized in AMDOptimizations) { + foreach (var codename in AMDCodenames) { + var algoType = algo.NiceHashID; + var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, codename, isOptimized, CPUExtensionType.Automatic); + if (path != MinerPaths.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { + MinerReservedPorts[minerBaseType][path] = new Dictionary>(); + } + if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { + MinerReservedPorts[minerBaseType][path][algoType] = new List(); + } + } + } + } + } else { + foreach (var algo in algos) { + var algoType = algo.NiceHashID; + var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, "", false, CPUExtensionType.Automatic); + if (path != MinerPaths.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { + MinerReservedPorts[minerBaseType][path] = new Dictionary>(); + } + if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { + MinerReservedPorts[minerBaseType][path][algoType] = new List(); + } + } + } + } + } + } + } + file.Commit(MinerReservedPorts); + // set all reserved + foreach (var paths in MinerReservedPorts.Values) { + foreach (var algos in paths.Values) { + foreach (var ports in algos.Values) { + foreach (int port in ports) { + AllReservedPorts.Add(port); + } + } + } + } + } catch { + + } + } + + } +} diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index dec0e7b..feee8ae 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -188,13 +188,16 @@ public static class ExtraLaunchParameters { public static void InitializePackages() { foreach (var pack in DEFAULTS) { - var packageFile = new MinerOptionPackageFile(String.Format("MinerOptionPackage_{0}", pack.Name)); + var packageName = String.Format("MinerOptionPackage_{0}", pack.Name); + var packageFile = new MinerOptionPackageFile(packageName); var readPack = packageFile.ReadFile(); if (readPack == null) { // read has failed + Helpers.ConsolePrint("ExtraLaunchParameters", "Creating internal params config " + packageName); MinerOptionPackages.Add(pack); // create defaults packageFile.Commit(pack); } else { + Helpers.ConsolePrint("ExtraLaunchParameters", "Loading internal params config " + packageName); MinerOptionPackages.Add(readPack); } } diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 8af397e..bc2e73f 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -207,6 +207,7 @@ + diff --git a/NiceHashMiner/ProfitabilityCalculator.cs b/NiceHashMiner/ProfitabilityCalculator.cs index aa4b927..0116176 100644 --- a/NiceHashMiner/ProfitabilityCalculator.cs +++ b/NiceHashMiner/ProfitabilityCalculator.cs @@ -16,32 +16,32 @@ static class ProfitabilityCalculator { { { AlgorithmType.INVALID , 1 }, { AlgorithmType.NONE , 1 }, - { AlgorithmType.Scrypt_UNUSED, MHs }, // NOT used - { AlgorithmType.SHA256_UNUSED , THs }, // NOT used - { AlgorithmType.ScryptNf_UNUSED , MHs }, // NOT used - { AlgorithmType.X11_UNUSED , MHs }, // NOT used - { AlgorithmType.X13 , MHs }, - { AlgorithmType.Keccak , MHs }, - { AlgorithmType.X15 , MHs }, - { AlgorithmType.Nist5 , MHs }, - { AlgorithmType.NeoScrypt , MHs }, - { AlgorithmType.Lyra2RE , MHs }, - { AlgorithmType.WhirlpoolX , MHs }, - { AlgorithmType.Qubit , MHs }, - { AlgorithmType.Quark , MHs }, - { AlgorithmType.Axiom_UNUSED , kHs }, // NOT used - { AlgorithmType.Lyra2REv2 , MHs }, - { AlgorithmType.ScryptJaneNf16_UNUSED , kHs }, // NOT used - { AlgorithmType.Blake256r8 , GHs }, - { AlgorithmType.Blake256r14 , GHs }, - { AlgorithmType.Blake256r8vnl , GHs }, - { AlgorithmType.Hodl , kHs }, - { AlgorithmType.DaggerHashimoto , MHs }, - { AlgorithmType.Decred , GHs }, - { AlgorithmType.CryptoNight , kHs }, - { AlgorithmType.Lbry , GHs }, - { AlgorithmType.Equihash , 1 }, // Sols /s - { AlgorithmType.Pascal , GHs }, // Sols /s + { AlgorithmType.Scrypt_UNUSED, MHs }, // NOT used + { AlgorithmType.SHA256_UNUSED , THs }, // NOT used + { AlgorithmType.ScryptNf_UNUSED , MHs }, // NOT used + { AlgorithmType.X11_UNUSED , MHs }, // NOT used + { AlgorithmType.X13_UNUSED , MHs }, + { AlgorithmType.Keccak_UNUSED , MHs }, + { AlgorithmType.X15_UNUSED , MHs }, + { AlgorithmType.Nist5_UNUSED , MHs }, + { AlgorithmType.NeoScrypt , MHs }, + { AlgorithmType.Lyra2RE , MHs }, + { AlgorithmType.WhirlpoolX_UNUSED , MHs }, + { AlgorithmType.Qubit_UNUSED , MHs }, + { AlgorithmType.Quark_UNUSED , MHs }, + { AlgorithmType.Axiom_UNUSED , kHs }, // NOT used + { AlgorithmType.Lyra2REv2 , MHs }, + { AlgorithmType.ScryptJaneNf16_UNUSED , kHs }, // NOT used + { AlgorithmType.Blake256r8_UNUSED , GHs }, + { AlgorithmType.Blake256r14_UNUSED , GHs }, + { AlgorithmType.Blake256r8vnl_UNUSED , GHs }, + { AlgorithmType.Hodl , kHs }, + { AlgorithmType.DaggerHashimoto , MHs }, + { AlgorithmType.Decred , GHs }, + { AlgorithmType.CryptoNight , kHs }, + { AlgorithmType.Lbry , GHs }, + { AlgorithmType.Equihash , 1 }, // Sols /s + { AlgorithmType.Pascal , GHs }, // Sols /s }; public static double GetFormatedSpeed(double speed, AlgorithmType type) { diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index f9ebc62..1e21024 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -1,156 +1,113 @@ - -namespace NiceHashMiner.Utils { - public static class Bins_Data { - #region CODE_GEN STUFF // listFiles.py - public static string[] ALL_FILES_BINS = { -@"\ccminer.exe", -@"\ccminer_cryptonight.exe", -@"\ccminer_decred.exe", -@"\ccminer_nanashi.exe", -@"\ccminer_neoscrypt.exe", -@"\ccminer_sp.exe", -@"\ccminer_tpruvot.exe", -@"\cpuminer_opt_AES.exe", -@"\cpuminer_opt_AVX.exe", -@"\cpuminer_opt_AVX2.exe", -@"\cpuminer_opt_AVX2_AES.exe", -@"\cpuminer_opt_AVX_AES.exe", -@"\cpuminer_opt_SSE2.exe", -@"\cudart32_80.dll", -@"\cudart64_80.dll", -@"\ethminer.exe", -@"\libcrypto-1.0.0.dll", -@"\libcurl-4.dll", -@"\libcurl.dll", -@"\libgcc_s_seh-1.dll", -@"\libgmp-10.dll", -@"\libgmpxx-4.dll", -@"\libjansson-4.dll", -@"\libjson-c-2.dll", -@"\libmicrohttpd-dll.dll", -@"\libsigc-2.0-0.dll", -@"\libssl-1.0.0.dll", -@"\libstdc++-6.dll", -@"\libwinpthread-1.dll", -@"\libz-1.dll", -@"\msvcr120.dll", -@"\OpenCL.dll", -@"\zlib1.dll", -@"\eqm\cudart64_80.dll", -@"\eqm\eqm.exe", -@"\eqm\msvcp120.dll", -@"\eqm\msvcr120.dll", -@"\nheqminer_v0.4b\cpu_tromp_AVX.dll", -@"\nheqminer_v0.4b\cpu_tromp_SSE2.dll", -@"\nheqminer_v0.4b\cudart64_75.dll", -@"\nheqminer_v0.4b\cudart64_80.dll", -@"\nheqminer_v0.4b\cuda_tromp.dll", -@"\nheqminer_v0.4b\cuda_tromp_75.dll", -@"\nheqminer_v0.4b\equiw200k9.bin", -@"\nheqminer_v0.4b\msvcp120.dll", -@"\nheqminer_v0.4b\msvcr120.dll", -@"\nheqminer_v0.4b\nheqminer.exe", -@"\sgminer-5-1-0-optimized\darkcoin-modHawaiigw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modTahitigw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modTongagw64l4.bin", -@"\sgminer-5-1-0-optimized\libcurl-4.dll", -@"\sgminer-5-1-0-optimized\libcurl.dll", -@"\sgminer-5-1-0-optimized\libeay32.dll", -@"\sgminer-5-1-0-optimized\libgcc_s_dw2-1.dll", -@"\sgminer-5-1-0-optimized\libidn-11.dll", -@"\sgminer-5-1-0-optimized\libpdcurses.dll", -@"\sgminer-5-1-0-optimized\Lyra2REv2Hawaiigw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Pitcairngw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Tahitigw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Tongagw64l4.bin", -@"\sgminer-5-1-0-optimized\pthreadGC2.dll", -@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTahitigw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTahitigw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTongagw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\sgminer.exe", -@"\sgminer-5-1-0-optimized\ssleay32.dll", -@"\sgminer-5-1-0-optimized\zlib1.dll", -@"\sgminer-5-1-1-optimized\darkcoin-modHawaiigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\darkcoin-modPitcairngw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\darkcoin-modTahitigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\darkcoin-modTongagw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\libcurl.dll", -@"\sgminer-5-1-1-optimized\libeay32.dll", -@"\sgminer-5-1-1-optimized\libgcc_s_dw2-1.dll", -@"\sgminer-5-1-1-optimized\libidn-11.dll", -@"\sgminer-5-1-1-optimized\libpdcurses.dll", -@"\sgminer-5-1-1-optimized\pthreadGC2.dll", -@"\sgminer-5-1-1-optimized\quarkcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\quarkcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\quarkcoinTahitigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\qubitcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\qubitcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\qubitcoinTahitigw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\qubitcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-1-optimized\sgminer.exe", -@"\sgminer-5-1-1-optimized\ssleay32.dll", -@"\sgminer-5-1-1-optimized\zlib1.dll", -@"\sgminer-5-4-0-tweaked\darkcoin-modBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Bonairegw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Fijigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Hawaiigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Pitcairngw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Tahitigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Tongagw64l4.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\sgminer.exe", -@"\sgminer-5-5-0-general\bitblockFijigw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\bitblockHawaiigw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\bitblockTongagw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\blake256r8Fijigw128l4.bin", -@"\sgminer-5-5-0-general\blake256r8Hawaiigw128l4.bin", -@"\sgminer-5-5-0-general\blake256r8Tongagw128l4.bin", -@"\sgminer-5-5-0-general\decredFijigw64l4tc24512.bin", -@"\sgminer-5-5-0-general\decredHawaiigw64l4tc24512.bin", -@"\sgminer-5-5-0-general\decredTongagw64l4tc24512.bin", -@"\sgminer-5-5-0-general\lbryTongagw128l4.bin", -@"\sgminer-5-5-0-general\marucoin-modFijigw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\marucoin-modHawaiigw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\marucoin-modTongagw64l4ku0big4.bin", -@"\sgminer-5-5-0-general\maxcoinFijigw64l4.bin", -@"\sgminer-5-5-0-general\maxcoinHawaiigw64l4.bin", -@"\sgminer-5-5-0-general\maxcoinTongagw64l4.bin", -@"\sgminer-5-5-0-general\neoscryptFijigw64l4lgtc8192.bin", -@"\sgminer-5-5-0-general\neoscryptHawaiigw64l4lgtc8192.bin", -@"\sgminer-5-5-0-general\neoscryptTongagw64l4lgtc8192.bin", -@"\sgminer-5-5-0-general\sgminer.exe", -@"\sgminer-5-5-0-general\talkcoin-modFijigw64l4ku0.bin", -@"\sgminer-5-5-0-general\talkcoin-modHawaiigw64l4ku0.bin", -@"\sgminer-5-5-0-general\talkcoin-modTongagw64l4ku0.bin", -@"\sgminer-5-5-0-general\vanillaFijigw128l4.bin", -@"\sgminer-5-5-0-general\vanillaHawaiigw128l4.bin", -@"\sgminer-5-5-0-general\vanillaTongagw128l4.bin", -}; - #endregion //CODE_GEN STUFF // listFiles.py - } -} - + +namespace NiceHashMiner.Utils { + public static class Bins_Data { + #region CODE_GEN STUFF // listFiles.py + public static string[] ALL_FILES_BINS = { +@"\ccminer.exe", +@"\ccminer_cryptonight.exe", +@"\ccminer_decred.exe", +@"\ccminer_nanashi.exe", +@"\ccminer_neoscrypt.exe", +@"\ccminer_sp.exe", +@"\ccminer_tpruvot.exe", +@"\cpuminer_opt_AES.exe", +@"\cpuminer_opt_AVX.exe", +@"\cpuminer_opt_AVX2.exe", +@"\cpuminer_opt_AVX2_AES.exe", +@"\cpuminer_opt_AVX_AES.exe", +@"\cpuminer_opt_SSE2.exe", +@"\cudart32_80.dll", +@"\cudart64_80.dll", +@"\ethminer.exe", +@"\libcrypto-1.0.0.dll", +@"\libcurl-4.dll", +@"\libcurl.dll", +@"\libgcc_s_seh-1.dll", +@"\libgmp-10.dll", +@"\libgmpxx-4.dll", +@"\libjansson-4.dll", +@"\libjson-c-2.dll", +@"\libmicrohttpd-dll.dll", +@"\libsigc-2.0-0.dll", +@"\libssl-1.0.0.dll", +@"\libstdc++-6.dll", +@"\libwinpthread-1.dll", +@"\libz-1.dll", +@"\msvcr120.dll", +@"\OpenCL.dll", +@"\zlib1.dll", +@"\eqm\cudart64_80.dll", +@"\eqm\eqm.exe", +@"\eqm\msvcp120.dll", +@"\eqm\msvcr120.dll", +@"\excavator\cudart64_80.dll", +@"\excavator\excavator.exe", +@"\nheqminer_v0.4b\cpu_tromp_AVX.dll", +@"\nheqminer_v0.4b\cpu_tromp_SSE2.dll", +@"\nheqminer_v0.4b\cudart64_75.dll", +@"\nheqminer_v0.4b\cudart64_80.dll", +@"\nheqminer_v0.4b\cuda_tromp.dll", +@"\nheqminer_v0.4b\cuda_tromp_75.dll", +@"\nheqminer_v0.4b\equiw200k9.bin", +@"\nheqminer_v0.4b\msvcp120.dll", +@"\nheqminer_v0.4b\msvcr120.dll", +@"\nheqminer_v0.4b\nheqminer.exe", +@"\sgminer-5-1-0-optimized\darkcoin-modHawaiigw64l4.bin", +@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4.bin", +@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\darkcoin-modTahitigw64l4.bin", +@"\sgminer-5-1-0-optimized\darkcoin-modTongagw64l4.bin", +@"\sgminer-5-1-0-optimized\libcurl-4.dll", +@"\sgminer-5-1-0-optimized\libcurl.dll", +@"\sgminer-5-1-0-optimized\libeay32.dll", +@"\sgminer-5-1-0-optimized\libgcc_s_dw2-1.dll", +@"\sgminer-5-1-0-optimized\libidn-11.dll", +@"\sgminer-5-1-0-optimized\libpdcurses.dll", +@"\sgminer-5-1-0-optimized\Lyra2REv2Hawaiigw64l4.bin", +@"\sgminer-5-1-0-optimized\Lyra2REv2Pitcairngw64l4.bin", +@"\sgminer-5-1-0-optimized\Lyra2REv2Tahitigw64l4.bin", +@"\sgminer-5-1-0-optimized\Lyra2REv2Tongagw64l4.bin", +@"\sgminer-5-1-0-optimized\pthreadGC2.dll", +@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw256l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw256l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinTahitigw256l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinTahitigw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinTongagw256l4ku0.bin", +@"\sgminer-5-1-0-optimized\quarkcoinTongagw64l4ku0.bin", +@"\sgminer-5-1-0-optimized\sgminer.exe", +@"\sgminer-5-1-0-optimized\ssleay32.dll", +@"\sgminer-5-1-0-optimized\zlib1.dll", +@"\sgminer-5-4-0-tweaked\darkcoin-modBonairegw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modFijigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modHawaiigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modPitcairngw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modTahitigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\darkcoin-modTongagw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Bonairegw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Fijigw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Hawaiigw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Pitcairngw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Tahitigw64l4.bin", +@"\sgminer-5-4-0-tweaked\lyra2rev2Tongagw64l4.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinBonairegw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinFijigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinHawaiigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinPitcairngw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinTahitigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\quarkcoinTongagw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinBonairegw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinFijigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinHawaiigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinPitcairngw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinTahitigw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\qubitcoinTongagw64l4ku0.bin", +@"\sgminer-5-4-0-tweaked\sgminer.exe", +@"\sgminer-5-6-0-general\sgminer.exe", +@"\sgminer-gm\sgminer.exe", +}; + #endregion //CODE_GEN STUFF // listFiles.py + } +} + From 50ff7f98e914e9b49fb96134559621de70ce0d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 5 Feb 2017 01:51:23 +0100 Subject: [PATCH 248/366] fixes --- NiceHashMiner/Devices/ComputeDevice.cs | 24 +++++++ .../Forms/Components/AlgorithmsListView.cs | 2 +- NiceHashMiner/Forms/Form_Settings.cs | 6 +- NiceHashMiner/Miners/Miner.cs | 39 ++--------- NiceHashMiner/Miners/excavator.cs | 1 + NiceHashMiner/NiceHashStats.cs | 70 ------------------- 6 files changed, 33 insertions(+), 109 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 1496616..164fe2c 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -219,6 +219,30 @@ public List GetAlgorithmSettings() { retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.eqm); } + // sort by miner and algo + retAlgos.Sort((a_1, a_2) => (a_1.MinerBaseType - a_2.MinerBaseType) != 0 ? (a_1.MinerBaseType - a_2.MinerBaseType) : (a_1.NiceHashID - a_2.NiceHashID)); + + return retAlgos; + } + + public List GetAlgorithmSettingsFastest() { + // hello state + var algosTmp = GetAlgorithmSettings(); + Dictionary sortDict = new Dictionary(); + foreach (var algo in algosTmp) { + var algoKey = algo.NiceHashID; + if (sortDict.ContainsKey(algoKey)) { + if (sortDict[algoKey].BenchmarkSpeed < algo.BenchmarkSpeed) { + sortDict[algoKey] = algo; + } + } else { + sortDict[algoKey] = algo; + } + } + List retAlgos = new List(); + foreach (var fastestAlgo in sortDict.Values) { + retAlgos.Add(fastestAlgo); + } return retAlgos; } diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 96ec3ab..6e9d1d2 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -90,7 +90,7 @@ public void SetAlgorithms(ComputeDevice computeDevice, bool isEnabled) { listViewAlgorithms.Items.Clear(); foreach (var alg in computeDevice.GetAlgorithmSettings()) { ListViewItem lvi = new ListViewItem(); - ListViewItem.ListViewSubItem sub = lvi.SubItems.Add(alg.AlgorithmStringID); + ListViewItem.ListViewSubItem sub = lvi.SubItems.Add(String.Format("{0} ({1})", alg.AlgorithmName, alg.MinerBaseTypeName)); //sub.Tag = alg.Value; lvi.SubItems.Add(alg.BenchmarkSpeedString()); diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 6e13a9f..33ae34d 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -597,8 +597,7 @@ private void buttonSelectedProfit_Click(object sender, EventArgs e) { return; } var url = Links.NHM_Profit_Check + _selectedComputeDevice.Name; - // TODO API doesn't have multiple algorithm support - foreach (var algorithm in _selectedComputeDevice.GetAlgorithmSettings()) { + foreach (var algorithm in _selectedComputeDevice.GetAlgorithmSettingsFastest()) { var id = (int)algorithm.NiceHashID; url += "&speed" + id + "=" + ProfitabilityCalculator.GetFormatedSpeed(algorithm.BenchmarkSpeed, algorithm.NiceHashID).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); } @@ -610,9 +609,8 @@ private void buttonSelectedProfit_Click(object sender, EventArgs e) { private void buttonAllProfit_Click(object sender, EventArgs e) { var url = Links.NHM_Profit_Check + "CUSTOM"; Dictionary total = new Dictionary(); - // TODO API doesn't have multiple algorithm support foreach (var curCDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - foreach (var algorithm in curCDev.GetAlgorithmSettings()) { + foreach (var algorithm in curCDev.GetAlgorithmSettingsFastest()) { if (total.ContainsKey(algorithm.NiceHashID)) { total[algorithm.NiceHashID] += algorithm.BenchmarkSpeed; } else { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 24e1138..e6a54fa 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -71,9 +71,6 @@ public abstract class Miner { private MinerPID_Data _currentPidData; private List _allPidData = new List(); - // for local and global checking. give miner at least 5 minutes to take affect - private DateTime _startMining; - // Benchmark stuff public bool BenchmarkSignalQuit; public bool BenchmarkSignalHanged; @@ -497,43 +494,12 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { } } - - int minerStatsCheckCount = 3; - public bool ShouldCheckMinerStats() { - int minuteCheck = 1; // 1 minutes default - if (minerStatsCheckCount == 3) { - minuteCheck = 15; - } else if (minerStatsCheckCount == 2) { - minuteCheck = 5; - } else if (minerStatsCheckCount == 1) { - minuteCheck = 2; - } - --minerStatsCheckCount; - return IsXminutesMining(minuteCheck); - } - - public bool IsCheckShowWarning() { - return minerStatsCheckCount < 0; - } - - private bool IsXminutesMining(int minutes) { - return _startMining.AddMinutes(minutes) < DateTime.UtcNow; - } - public void ResetCheckTime() { - _startMining = DateTime.UtcNow; - } - public void ResetCheckStateCount() { - minerStatsCheckCount = 3; - } - abstract protected bool BenchmarkParseLine(string outdata); #endregion //BENCHMARK DE-COUPLED Decoupled benchmarking routines virtual protected NiceHashProcess _Start() { - ResetCheckTime(); - ResetCheckStateCount(); PreviousTotalMH = 0.0; if (LastCommandLine.Length == 0) return null; @@ -550,6 +516,11 @@ virtual protected NiceHashProcess _Start() P.StartInfo.Arguments = LastCommandLine; if (IsNeverHideMiningWindow) { P.StartInfo.CreateNoWindow = false; + // not working + //if (ConfigManager.GeneralConfig.HideMiningWindows) { + // P.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; + // P.StartInfo.UseShellExecute = true; + //} } else { P.StartInfo.CreateNoWindow = ConfigManager.GeneralConfig.HideMiningWindows; } diff --git a/NiceHashMiner/Miners/excavator.cs b/NiceHashMiner/Miners/excavator.cs index 717cdac..bf9fba9 100644 --- a/NiceHashMiner/Miners/excavator.cs +++ b/NiceHashMiner/Miners/excavator.cs @@ -35,6 +35,7 @@ private class JsonApiResponse { public excavator() : base("excavator") { ConectionType = NHMConectionType.NONE; + IsNeverHideMiningWindow = true; } public override void Start(string url, string btcAdress, string worker) { diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index 420a4ab..e11c3e2 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -83,28 +83,6 @@ class nicehashminer_version { public string version; } - - class nicehash_workers_algo_stats { - public string addr; - public AlgorithmType algo; - public List> workers; - } - class nicehash_worker_algo_stats_H { - public string workerName; - public Dictionary speedsStatus; - public int timeConnected; - public int xnsub; - public double difficulty; - public int serviceLocation; - } - public class nicehash_worker_algo_stats { - public nicehash_worker_algo_stats(AlgorithmType t) { - type = t; - } - public readonly AlgorithmType type = AlgorithmType.NONE; - public double accepted = 0; - public double rejected = 0; - } #pragma warning restore 649 @@ -133,54 +111,6 @@ public static Dictionary GetAlgorithmRates(string wo } } - //public static nicehash_worker_algo_stats GetWorkerAlgorithmAcceptedSpeeds(string btc, AlgorithmType algo, string worker) { - // string args = String.Format("{0}&algo={1}", btc, (int)algo); - // string r1 = GetNiceHashAPIData(Links.NHM_API_stats_provider_workers + args, worker); - // if (r1 == null) return null; - - // List ret = new List(); - // nicehash_worker_algo_stats retEl = new nicehash_worker_algo_stats(algo); - // nicehash_json_T nhjson_current; - // try { - // nhjson_current = JsonConvert.DeserializeObject>(r1, Globals.JsonSettings); - // List all = new List(); - // foreach (var worker_stat in nhjson_current.result.workers) { - // if (worker_stat.Count >= 6) { - // nicehash_worker_algo_stats_H tmp = new nicehash_worker_algo_stats_H(); - // tmp.workerName = worker_stat[0] as string; - // { - // var toConv = worker_stat[1] as JObject; // Dictionary; - // tmp.speedsStatus = new Dictionary(); - // foreach (var pair in toConv) { - // tmp.speedsStatus.Add(pair.Key, Helpers.ParseDouble(pair.Value.ToString())); - // } - // } - // // other stuff don't care - // //tmp.timeConnected = (int)worker_stat[2]; - // //tmp.xnsub = (int)worker_stat[3]; - // //tmp.difficulty = (double)worker_stat[4]; - // //tmp.serviceLocation = (int)worker_stat[5]; - // if (tmp.workerName == worker) { - // ret.Add(tmp); - // } - // } - // } - // foreach (var r in ret) { - // if (r.speedsStatus.ContainsKey("a")) { - // retEl.accepted += r.speedsStatus["a"]; - // } - // if (r.speedsStatus.ContainsKey("rs")) { - // retEl.rejected += r.speedsStatus["rs"]; - // } - // } - - // return retEl; - // } catch { - // return null; - // } - //} - - public static nicehash_stats GetStats(string btc, int algo, string worker) { string r1 = GetNiceHashAPIData(Links.NHM_API_stats + btc, worker); From 9bdb346234076e4744e886550ca29b3a3efba0ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 5 Feb 2017 02:02:55 +0100 Subject: [PATCH 249/366] remove pending --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/Miner.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 55a2d2a..ee09cef 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "_PENDING"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index e6a54fa..efafab5 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -516,7 +516,7 @@ virtual protected NiceHashProcess _Start() P.StartInfo.Arguments = LastCommandLine; if (IsNeverHideMiningWindow) { P.StartInfo.CreateNoWindow = false; - // not working + ////not working //if (ConfigManager.GeneralConfig.HideMiningWindows) { // P.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; // P.StartInfo.UseShellExecute = true; From b3ffd5d7539b34045acbff02175f2d1e98543cdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 5 Feb 2017 19:46:50 +0100 Subject: [PATCH 250/366] final changes --- NiceHashMiner/Algorithm.cs | 2 +- NiceHashMiner/Configs/Data/AlgorithmConfig.cs | 2 +- NiceHashMiner/Devices/ComputeDevice.cs | 1 + NiceHashMiner/Devices/GroupAlgorithms.cs | 3 +++ NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs | 2 +- NiceHashMiner/Miners/Miner.cs | 3 --- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index 09d414e..8844fbf 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -25,7 +25,7 @@ public class Algorithm { public double AvaragedSpeed { get; set; } // based on device and settings here we set the miner path public string MinerBinaryPath = ""; - // TODO these are changing (logging reasons) + // these are changing (logging reasons) public double CurrentProfit = 0; public double CurNhmSMADataVal = 0; diff --git a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs index f9149f4..107d8b0 100644 --- a/NiceHashMiner/Configs/Data/AlgorithmConfig.cs +++ b/NiceHashMiner/Configs/Data/AlgorithmConfig.cs @@ -9,7 +9,7 @@ public class AlgorithmConfig { public string Name = ""; // Used as an indicator for easier user interaction public AlgorithmType NiceHashID = AlgorithmType.NONE; public MinerBaseType MinerBaseType = MinerBaseType.NONE; - public string MinerName = ""; // TODO probably not needed + public string MinerName = ""; // probably not needed public double BenchmarkSpeed = 0; public string ExtraLaunchParameters= ""; public bool Enabled = true; diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 164fe2c..0ac7fab 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -185,6 +185,7 @@ public DeviceBenchmarkConfig GetAlgorithmDeviceConfig() { foreach (var algo in this.AlgorithmSettings) { // create/setup AlgorithmConfig conf = new AlgorithmConfig(); + conf.Name = algo.AlgorithmStringID; conf.NiceHashID = algo.NiceHashID; conf.MinerBaseType = algo.MinerBaseType; conf.MinerName = algo.MinerName; // TODO probably not needed diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index c0cb513..fab1215 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -177,6 +177,7 @@ public static Dictionary> CreateDefaultsForGroup( // NVIDIA if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType || DeviceGroupType.NVIDIA_5_x == deviceGroupType || DeviceGroupType.NVIDIA_6_x == deviceGroupType) { var ToRemoveAlgoTypes = new List(); + var ToRemoveMinerTypes = new List(); var ret = new Dictionary>() { { MinerBaseType.ccminer, new List() { @@ -214,6 +215,7 @@ public static Dictionary> CreateDefaultsForGroup( AlgorithmType.Lyra2RE, AlgorithmType.Lyra2REv2 }); + ToRemoveMinerTypes.Add(MinerBaseType.eqm); } if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { @@ -225,6 +227,7 @@ public static Dictionary> CreateDefaultsForGroup( // filter unused var finalRet = FilterMinerAlgos(ret, ToRemoveAlgoTypes); + finalRet = FilterMinerBaseTypes(finalRet, ToRemoveMinerTypes); return finalRet; } diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index 9ecf968..85027c3 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -72,7 +72,7 @@ public void SetCurrentlySelected(ListViewItem lvi, ComputeDevice computeDevice) this.Enabled = lvi.Checked; groupBoxSelectedAlgorithmSettings.Text = String.Format(International.GetText("AlgorithmsListView_GroupBox"), - algorithm.AlgorithmName); ; + String.Format("{0} ({1})", algorithm.AlgorithmName, algorithm.MinerBaseTypeName)); ; field_LessThreads.Enabled = _computeDevice.DeviceGroupType == DeviceGroupType.CPU; if (field_LessThreads.Enabled) { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index efafab5..d25e3dc 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -162,7 +162,6 @@ virtual public void InitMiningSetup(MiningSetup miningSetup) { SetAPIPort(); } - // TODO remove or don't recheck public void InitBenchmarkSetup(MiningPair benchmarkPair) { InitMiningSetup(new MiningSetup(new List() { benchmarkPair })); BenchmarkAlgorithm = benchmarkPair.Algorithm; @@ -570,8 +569,6 @@ protected void StartCoolDownTimerChecker() { virtual protected void Miner_Exited() { - // TODO make miner restart in 5 seconds - //Stop(MinerStopType.END, true); ScheduleRestart(5000); } From 64370deab0761a6d5fa7f79e3a49f686f126b82b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 6 Feb 2017 09:27:12 +0100 Subject: [PATCH 251/366] fix claymore CryptoNight extra launch params, add fallback to load missing keys config --- NiceHashMiner/Enums/MinerType.cs | 3 ++- .../Miners/Parsing/ExtraLaunchParameters.cs | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Enums/MinerType.cs b/NiceHashMiner/Enums/MinerType.cs index 1814bac..acb2503 100644 --- a/NiceHashMiner/Enums/MinerType.cs +++ b/NiceHashMiner/Enums/MinerType.cs @@ -18,6 +18,7 @@ public enum MinerType { eqm_CUDA, ClaymoreZcash, ClaymoreCryptoNight, - OptiminerZcash + OptiminerZcash, + END } } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index feee8ae..d8aa085 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -148,7 +148,7 @@ public static class ExtraLaunchParameters { } ), new MinerOptionPackage( - MinerType.ccminer_CryptoNight, + MinerType.ClaymoreCryptoNight, new List() { new MinerOption("ClaymoreCryptoNight_a" , "-a", "-a", "0", MinerOptionFlagType.MultiParam, ""), new MinerOption("ClaymoreCryptoNight_wd" , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), @@ -201,6 +201,19 @@ public static void InitializePackages() { MinerOptionPackages.Add(readPack); } } + var defaultKeys = DEFAULTS.ConvertAll((p) => p.Type); + // extra check if DEFAULTS is missing a key + for (var type = (MinerType.NONE + 1); type < MinerType.END; ++type) { + if (defaultKeys.Contains(type) == false) { + var packageName = String.Format("MinerOptionPackage_{0}", Enum.GetName(typeof(MinerType), type)); + var packageFile = new MinerOptionPackageFile(packageName); + var readPack = packageFile.ReadFile(); + if (readPack != null) { // read has failed + Helpers.ConsolePrint("ExtraLaunchParameters", "Creating internal params config " + packageName); + MinerOptionPackages.Add(readPack); + } + } + } } public static MinerOptionPackage GetMinerOptionPackageForMinerType(MinerType type) { From 7b7b5e582e748e6e2b5b89d5181a6be9e3d5e5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 6 Feb 2017 09:48:15 +0100 Subject: [PATCH 252/366] fix default optimization params for sgminer CryptoNight --- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index fab1215..1c5b72a 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -147,7 +147,7 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.sgminer, AlgorithmType.DaggerHashimoto, "ethash") { ExtraLaunchParameters = "--xintensity 512 -w 192 -g 1" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Pascal, "pascal") { ExtraLaunchParameters = DefaultParam + "--intensity 21 -w 64 -g 2" } } }, From c6ec4cfe94968cd470c1fbdd2d54e06258c00162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 6 Feb 2017 12:58:52 +0100 Subject: [PATCH 253/366] remove unused code, fix miner exit status chack --- NiceHashMiner/Miners/Miner.cs | 10 +++++++++- NiceHashMiner/Miners/excavator.cs | 19 +------------------ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index d25e3dc..af47fff 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -499,6 +499,11 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { virtual protected NiceHashProcess _Start() { + // never start when ended + if (isEnded) { + return null; + } + PreviousTotalMH = 0.0; if (LastCommandLine.Length == 0) return null; @@ -538,7 +543,6 @@ virtual protected NiceHashProcess _Start() Helpers.ConsolePrint(MinerTAG(), "Starting miner " + ProcessTag() + " " + LastCommandLine); StartCoolDownTimerChecker(); - isEnded = false; return P; } else { @@ -718,6 +722,10 @@ private void CoolUp() { } private void MinerCoolingCheck_Tick(object sender, ElapsedEventArgs e) { + if (isEnded) { + End(); + return; + } _currentCooldownTimeInSecondsLeft -= (int)_cooldownCheckTimer.Interval; // if times up if (_currentCooldownTimeInSecondsLeft <= 0) { diff --git a/NiceHashMiner/Miners/excavator.cs b/NiceHashMiner/Miners/excavator.cs index bf9fba9..6aed49e 100644 --- a/NiceHashMiner/Miners/excavator.cs +++ b/NiceHashMiner/Miners/excavator.cs @@ -44,10 +44,6 @@ public override void Start(string url, string btcAdress, string worker) { ProcessHandle = _Start(); } - public override void InitMiningSetup(MiningSetup miningSetup) { - base.InitMiningSetup(miningSetup); - } - protected override string GetDevicesCommandString() { Path = this.MiningSetup.MinerPath; WorkingDirectory = this.MiningSetup.MinerPath.Replace("excavator.exe", ""); @@ -66,7 +62,7 @@ protected override string GetDevicesCommandString() { // benchmark stuff protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - String ret = "-b " + time + " " + GetDevicesCommandString(); + string ret = "-b " + time + " " + GetDevicesCommandString(); return ret; } @@ -137,19 +133,6 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds } - protected double getNumber(string outdata, string startF, string remF) { - try { - int speedStart = outdata.IndexOf(startF); - String speed = outdata.Substring(speedStart, outdata.Length - speedStart); - speed = speed.Replace(startF, ""); - speed = speed.Replace(remF, ""); - speed = speed.Trim(); - return Double.Parse(speed, CultureInfo.InvariantCulture); - } catch { - } - return 0; - } - // benchmark stuff protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { From 3fb15117b377e8f86a8bf1ffd8cf5ed2143d4b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 6 Feb 2017 13:22:03 +0100 Subject: [PATCH 254/366] excavator extra launch params added --- NiceHashMiner/Enums/MinerType.cs | 1 + NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs | 9 +++++++++ .../Miners/Parsing/ExtraLaunchParametersParser.cs | 3 +++ 3 files changed, 13 insertions(+) diff --git a/NiceHashMiner/Enums/MinerType.cs b/NiceHashMiner/Enums/MinerType.cs index acb2503..e4d9343 100644 --- a/NiceHashMiner/Enums/MinerType.cs +++ b/NiceHashMiner/Enums/MinerType.cs @@ -19,6 +19,7 @@ public enum MinerType { ClaymoreZcash, ClaymoreCryptoNight, OptiminerZcash, + excavator, END } } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index d8aa085..21bd21f 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -182,6 +182,15 @@ public static class ExtraLaunchParameters { }, new List() ), + new MinerOptionPackage( + MinerType.excavator, + new List() { + new MinerOption("number_of_blocks", "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + new MinerOption("tpb", "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + }, + new List() + ), + }; private static List MinerOptionPackages = new List(); diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 658bca2..8b5beaf 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -261,6 +261,9 @@ private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType miner return MinerType.eqm_CUDA; } } + if (MinerBaseType.excavator == minerBaseType) { + return MinerType.excavator; + } return MinerType.NONE; } From 7fa7fcdf8dd6bfe8f44666de6fd5c1b933e04c61 Mon Sep 17 00:00:00 2001 From: boomtnt46 Date: Mon, 6 Feb 2017 21:57:41 +0100 Subject: [PATCH 255/366] Added Spanish translation --- NiceHashMiner/langs/es.lang | 282 +++++++++++++++++++++++++----------- 1 file changed, 194 insertions(+), 88 deletions(-) diff --git a/NiceHashMiner/langs/es.lang b/NiceHashMiner/langs/es.lang index 9acaaa0..1ee6b36 100644 --- a/NiceHashMiner/langs/es.lang +++ b/NiceHashMiner/langs/es.lang @@ -1,4 +1,4 @@ -{ +{ "Name": "Español", "ID": 2, "Entries": { @@ -7,156 +7,158 @@ "Global_OK": "&OK", "Service_Location": "Servidor", - "Warning_with_Exclamation": "¡Cuidado!", + "Warning_with_Exclamation": "¡Alerta!", "Error_with_Exclamation": "¡Error!", "BitcoinAddress": "Dirección Bitcoin", - "WorkerName": "Nombre del equipo", + "WorkerName": "Nombre del minero", "Rate": "Ratio", "Day": "Día", "Quick": "Rápido", - "Standard": "Estandar", + "Standard": "Normal", "Precise": "Preciso", - "ListView_Enabled": "Habilitado", + "ListView_Enabled": "Habilitado", "ListView_Group": "Grupo", "ListView_Device": "Dispositivo", "ListView_Algorithm": "Algoritmo", "ListView_Speed": "Velocidad", - "Form_Main_visit_us": "Visítanos en @ www.nicehash.com", - "Form_Main_check_stats": "¡Ver mis estadísticas!", - "Form_Main_choose_bitcoin_wallet": "Ayúdame a escoger una cartera Bitcoin", + + "Form_Main_visit_us": "Visítanos @ www.nicehash.com", + "Form_Main_check_stats": "¡&Ver mis estadísticas!", + "Form_Main_choose_bitcoin_wallet": "&Ayúdame a escojer una cartera Bitcoin", "Form_Main_global_rate": "Ratio global", "Form_Main_balance": "Fondos", "Form_Main_benchmark": "&Benchmark", "Form_Main_settings": "&Configuración", "Form_Main_start": "&Empezar", "Form_Main_stop": "&Parar", - "Form_Main_new_version_released": "¡Importante! La nueva versión v{0} ha\r\nsido liberada. Pincha aquí para descargarla.", - "Form_Main_DemoModeLabel": "NiceHash Miner está en modo DEMO", - "Form_Main_DemoModeTitle": "¿Abrir NiceHash Miner en modo DEMO?", - "Form_Main_DemoModeMsg": "No has introducido una dirección Bitcoin. NiceHash Miner empezará a minar en modo DEMO. En el modo DEMO, puedes probar tu ordenador para ver cuántos Bitcoin podrías ganar. ¿Quieres continuar en modo DEMO? \n\n AVISO: ¡NO GANARÁS NADA EN MODO DEMO!", - - "Form_Main_loadtext_CPU": "Buscando CPU...", - "Form_Main_loadtext_NVIDIA5X": "Buscando dispositivos NVIDIA5.x y NVIDIA6.x ...", - "Form_Main_loadtext_NVIDIA3X": "Buscando dispositivos NVIDIA3.x ...", - "Form_Main_loadtext_NVIDIA2X": "Buscando dispositivos NVIDIA2.1 ...", + "Form_Main_new_version_released": "¡IMPORTANTE! La nueva versión v{0} ha\r\nsido liberada. Haga click aquí para descargarla.", + "Form_Main_DemoModeLabel": "¡NiceHash Miner está ejecutandose en modo DEMO!", + "Form_Main_DemoModeTitle": "¿Empezar a minar en modo DEMO?", + "Form_Main_DemoModeMsg": "No has introducido una dirección Bitcoin. NiceHash Miner empezará a minar en modo DEMO. En el modo DEMO, pueder probar al minero y ver cuanto puedes ganar usando tu ordenador. ¿Quieres continuar en modo DEMO?\n\nAVISO: ¡No ganarás nada en modo DEMO!", + + "Form_Main_loadtext_CPU": "Buscando GPU...", + "Form_Main_loadtext_NVIDIA5X": "Buscando dispositivos NVIDIA5.x y NVIDIA6.x...", + "Form_Main_loadtext_NVIDIA3X": "Buscando dispositivos NVIDIA3.x...", + "Form_Main_loadtext_NVIDIA2X": "Buscando dispositivos NVIDIA2.1...", "Form_Main_loadtext_AMD": "Buscando dispositivos AMD OpenCL...", "Form_Main_loadtext_SaveConfig": "Guardando configuración...", - "Form_Main_loadtext_CheckLatestVersion": "Comprobando que está usando la última versión...", - "Form_Main_loadtext_GetNiceHashSMA": "Obteniendo la información de NiceHash SMA...", - "Form_Main_loadtext_GetBTCRate": "Obteniendo los valores de intercambio de NiceHash...", - "Form_Main_loadtext_GetNiceHashBalance": "Obteniendo fondos de NiceHash...", + "Form_Main_loadtext_CheckLatestVersion": "Buscando la última versión...", + "Form_Main_loadtext_GetNiceHashSMA": "Obteniedo la información NiceHash SMA...", + "Form_Main_loadtext_GetBTCRate": "Obteniendo el ratio de cámbio de Bitcoin...", + "Form_Main_loadtext_GetNiceHashBalance": "Obteniendo fondos en NiceHash...", "Form_Main_loadtext_SetEnvironmentVariable": "Configurando variables...", - "Form_Main_loadtext_SetWindowsErrorReporting": "Configurando el reporte de errores de Windows...", - "Form_Main_loadtext_NVIDIAP0State": "Poniendo todas las GPU de NVIDIA en estado P0...", + "Form_Main_loadtext_SetWindowsErrorReporting": "Configurando reportes de errores de Windows...", + "Form_Main_loadtext_NVIDIAP0State": "Poniendo tadas las GPUs de NVIDIA al estado P0...", - "Form_Main_msgbox_CPUMining64bitMsg": "El minado CPU de NiceHash Miner solo funciona en la version de 64 bit del sistema operativo.", - "Form_Main_msgbox_CPUMining64CoresMsg": "NiceHash Miner solo soporta hasta 64 núcleos virtuales. El minado de CPU se desactivará.", - "Form_Main_msgbox_CPUMiningLessThreadMsg": "LessThreads es mayor a el número de hilos por CPU. El minado de CPU será desactivado.", + "Form_Main_msgbox_CPUMining64bitMsg": "NiceHash Miner solo funciona en sistemas de 64bit (para el minado con CPU). El minado CPU será desactivado.", + "Form_Main_msgbox_CPUMining64CoresMsg": "NiceHash Miner no soparta más de 64 núcleos virtuales. El minado CPU será desactivado.", + "Form_Main_msgbox_CPUMiningLessThreadMsg": "LessThreads es mayor al número de nucleos por CPU. Opción ignorada", "Form_Main_msgbox_NoInternetTitle": "Comprueba la conexión a Internet", - "Form_Main_msgbox_NoInternetMsg": "NiceHash Miner requiere una conexión a Internet. Asegúrate de que estás conectado a internet antes de ejecutar NiceHash Miner. ¿Quieres continuar?", - "Form_Main_msgbox_InvalidBTCAddressMsg": "¡Dirección Bitcoin inválida!\n\nPor favor introduce una dirección Bitcoin valida o pulsa Sí para crear una", - "Form_Main_msgbox_InvalidWorkerNameMsg": "¡Nombre inválido!\n\nIntroduce un nombre válido, por favor. (Aa-Zz, 0-9, de hasta 7 carácteres).", - "Form_Main_msgbox_NullNiceHashDataMsg": "Imposible obtener los datos de rentabilidad de NiceHash. Si estás conectado a Internet, por favor inténtalo de nuevo.", - "Form_Main_msgbox_HaveNotBenchmarkedMsg": "No has realizado el benchmark para este dispositivo {0}. Sin hacer un benchmark antes, NiceHashMiner no sera capaz de elegir el algoritmo mas rentable. Para continuar minando, pulsa Sí. Si quieres hacer un benchmark antes, elige No y pincha en el botón de Benchmark.", - "Form_Main_msgbox_buttonBenchmarkWarningMsg": "Editar las siguientes opciones no es recomendado para usuarios principiantes.\r\n\r\nSi {0} se cierra por una mala configuración, puedes restaurarlo eliminando 'config.json'.\r\n\r\n¿Continuar con la edición de la configuración?", + "Form_Main_msgbox_NoInternetMsg": "NiceHash Miner requiere una conexión a Internet. Asegúrese de que tiene una conexión a internet antes de continuar. ¿Le gustaría continuar?", + "Form_Main_msgbox_InvalidBTCAddressMsg": "¡Dirección Bitcoin inválida!\n\nIntruduzca una dirección válida o pulse Sí para crear una.", + "Form_Main_msgbox_InvalidWorkerNameMsg": "¡Nombre inválido!\n\nPor favor introduzca un nombre válido (Aa-Zz, 0-9, de hasta 7 carácteres).", + "Form_Main_msgbox_NullNiceHashDataMsg": "No se puede obtener los datos de rentabilidad de NiceHash. Si está conectado a Internet, inténtelo más tarde.", + "Form_Main_msgbox_HaveNotBenchmarkedMsg": "No has hecho ningún benchmark para el dispositivo {0}. Sin hacer un benchmark primero, NiceHashMiner no podrá cambiar al algoritmo más rentable. Para continuar, pulsa Sí. Si le gustaría hacer un benchmark primero, pulse No y haga click en Benchmark.", + "Form_Main_msgbox_buttonBenchmarkWarningMsg": "Solo usuarios avanzados deberían cambiar las configuraciones avanzadas. \r\n\r\nSi {0} se cierra por una mala configuración, puede arreglarlo eliminando el archivo 'config.json' .\r\n\r\n¿Seguro que quiere editar la configuración avanzada?", "Form_Main_msgbox_buttonBenchmarkRestartWarningTitle": "Reiniciando {0}", - "Form_Main_msgbox_buttonBenchmarkRestartWarningMsg": "{0} se cerrará. Estas nuevas configuraciones aún estan en beta y {0} necesitan un reinicio del programa para que se apliquen.", + "Form_Main_msgbox_buttonBenchmarkRestartWarningMsg": "{0} se cierrará. Esta nueva ventana de configuración está uún en beta y {0} necesita un reinicio para que haga efecto.", + "Form_Main_msgbox_anti_botnet_msgbox": "NiceHash Miner ha detectado un cambio en la identificación del hardware. Si no has descargado e instalado NiceHash Miner, tu ordenador puede estar en peligro. En tal caso, se recomienda instalar un software antivirus o reinstalar Windows.\r\n\r\n¿Continuar con NiceHash Miner?", + - "Form_Benchmark_title": "Benchmark", "Form_Benchmark_buttonStartBenchmark": "Empezar &benchmark", - "Form_Benchmark_buttonStopBenchmark": "&Parar benchmark", - "Form_Benchmark_buttonReset": "Resete&ar", + "Form_Benchmark_buttonStopBenchmark": "&Detener benchmark", + "Form_Benchmark_buttonReset": "&Resetear", "Form_Benchmark_buttonClose": "&Cerrar", - "Form_Benchmark_buttonCheckProfitability": "Ren&tabilidad", - "Form_Benchmark_buttonSubmitHardware": "Publicar &hardware", - "Form_Benchmark_radioButton_QuickBenchmark": "Benchmark &rápido (podría ser impreciso)", - "Form_Benchmark_radioButton_StandardBenchmark": "Benchmark &estandar", - "Form_Benchmark_radioButton_PreciseBenchmark": "Benchmark &detallado (tardará mas)", - "Form_Benchmark_listView_WaitSeconds": "Por favor espera {0} segundos...", - "Form_Benchmark_listView_WaitMinutes": "Por favor espera {0} minutos...", - "Form_Benchmark_listView_WaitForEth": "Benchmarking (2-4 minutos)...", + "Form_Benchmark_buttonCheckProfitability": "Comprobar re&ntabilidad", + "Form_Benchmark_buttonSubmitHardware": "&Enviar info de hardware", + "Form_Benchmark_radioButton_QuickBenchmark": "Rá&pido (puede ser impreciso)", + "Form_Benchmark_radioButton_StandardBenchmark": "Es&tandar", + "Form_Benchmark_radioButton_PreciseBenchmark": "&Preciso (tardará más)", + "Form_Benchmark_listView_WaitSeconds": "Por favor espera unos {0} segundos...", + "Form_Benchmark_listView_WaitMinutes": "Por favor espera unos {0} minutos...", + "Form_Benchmark_listView_WaitForEth": "Corriendo benchmark (2-4 minutos)...", - "Form_Loading_label_LoadingText": "Cargando, por favor espera...", + "Form_Loading_label_LoadingText": "Cargando, espera por favor...", "DriverVersionConfirmationDialog_title": "Actualización del driver de AMD recomendada", - "DriverVersionConfirmationDialog_labelWarning": "No estás usando el driver de AMD recomendado. el driver mas estable para minar es la version 15.7.1.\nRecomendamos que uses dicha versión.", - "DriverVersionConfirmationDialog_linkToDriverDownloadPage": "&Enlace de descarga del driver", - "DriverVersionConfirmationDialog_chkBoxDontShowAgain": "&No mostrar esta advertencia nunca mas", + "DriverVersionConfirmationDialog_labelWarning": "No estas usando una versión óptima del driver de AMD. La versión más estable para minar es la 15.7.1 .\nLe recomendamos encarecidamente usar esta versión.", + "DriverVersionConfirmationDialog_linkToDriverDownloadPage": "&Enlace a la página de descargas del driver", + "DriverVersionConfirmationDialog_chkBoxDontShowAgain": "&No volver a mostrar esta ventana", "MinerFileNotFoundDialog_title": "¡Archivo no encontrado!", - "MinerFileNotFoundDialog_linkLabelError": "{0}: ¡El archivo {1} no se encuentra!\n\nPor favor asegúrate que el archivo es accesible y que tu antivirus no está bloqueando el programa.\nPor favor ve a la sección Mi antivirus está bloqueando la aplicación \"My anti-virus is blocking the application \" en la sección de Solución de problemas (Troubleshooting) ({2}).\n\nVolver a descargar NiceHash Miner podría ser necesaria.", + "MinerFileNotFoundDialog_linkLabelError": "{0}: No se ha encontrado el archivo {1}!\n\nPor favor asegúrate de que el archivo as accesible y que tu antivirus no está bloqueando la aplicación.\nPor favor vea la sección \"My anti-virus is blocking the application\" en la sección de corrección de errores {2}.\n\nSe podría necesitar reinstalar NiceHash Miner", "MinerFileNotFoundDialog_link": "Enlace", - "MinerFileNotFoundDialog_chkBoxDisableDetection": "&Desactivar detección de este dispositivo.", + "MinerFileNotFoundDialog_chkBoxDisableDetection": "&Desactivar la detección para este dispositivo", - "SubmitResultDialog_title": "Enviar los resultados del benchmark.", - "SubmitResultDialog_labelInstruction": "Por favor selecciona un dispositivo, y una vez que finalize el benchmark, automáticamente se abrirá \r\nuna página para mostrar la calculadora de rentabilidad en la web de NiceHash.", - "SubmitResultDialog_StartBtn": "&Enviar", - "SubmitResultDialog_StopBtn": "&Parar", + "SubmitResultDialog_title": "Enviar los resultados del benchmark", + "SubmitResultDialog_labelInstruction": "Por favor selecciona un dispositivo para que se le haga un benchmark y una vez hecho, abrirá automáticamente una \r\nnueva ventana con la calculadora de rentabilidad de NiceHash.", + "SubmitResultDialog_StartBtn": "&Empezar", + "SubmitResultDialog_StopBtn": "&Detener", "SubmitResultDialog_CloseBtn": "&Cerrar", "SubmitResultDialog_LabelProgressPercentageCompleted": "¡Completado!", "SubmitResultDialog_LabelProgressPercentageStopped": "¡Detenido!", - "SubmitResultDialog_LabelProgressPercentageInProgress": "{0}% : Benchmarking {1}.. por favor espera..", + "SubmitResultDialog_LabelProgressPercentageInProgress": "{0}% : Corriendo benchmark {1}.. Espera, por favor..", - "SubmitResultDialog_NoDeviceCheckedTitle": "No hay ningún dispositivo seleccionado.", - "SubmitResultDialog_NoDeviceCheckedMsg": "Por favor selecciona al menos un dispositivo para subir los resultados.", - "SubmitResultDialog_UsePreviousBenchmarkedValueTitle": "¿Usar los resultados de un benchmark anterior?", - "SubmitResultDialog_UsePreviousBenchmarkedValueMsg": "Podrías usar los resultados de un benchmark anterior. Elige Sí para usar dichos resultados o No para volver a ejecutar en benchmark.", + "SubmitResultDialog_NoDeviceCheckedTitle": "Ningún dispositivo seleccionado", + "SubmitResultDialog_NoDeviceCheckedMsg": "Elige al menos un dispositivo para enviar los resultados.", + "SubmitResultDialog_UsePreviousBenchmarkedValueTitle": "¿Usar resultados de un benchmark previo?", + "SubmitResultDialog_UsePreviousBenchmarkedValueMsg": "Podrías usar los resultados de un benckmark anterior. Elige Sí para usar los resultados anteriores o No para volver a correr un benchmark.", "Form_Settings_General_DebugConsole": "Consola de depuración", - "Form_Settings_General_AutoStartMining": "Autoempezar a minar", + "Form_Settings_General_AutoStartMining": "Empezar a minar", "Form_Settings_General_HideMiningWindows": "Ocultar ventanas de minado", "Form_Settings_General_MinimizeToTray": "Minimizar a la bandeja", "Form_Settings_General_DisableDetection": "Desactivar detección de {0}", - "Form_Settings_General_AutoScaleBTCValues": "Autoescalar valores de BTC", - "Form_Settings_General_StartMiningWhenIdle": "Minar si no se usa el ordenador", - "Form_Settings_General_ShowDriverVersionWarning": "Mostrar alerta de versión del driver", - "Form_Settings_General_DisableWindowsErrorReporting": "Desactivar reporte de Windows", - "Form_Settings_General_UseNewSettingsPage": "Usar nueva página de configuración", - "Form_Settings_General_NVIDIAP0State": "Estado de NVIDIA P0", - "Form_Settings_General_LogToFile": "Registrar (log) en archivo", + "Form_Settings_General_AutoScaleBTCValues": "Escalar valores de BTC automáticamente", + "Form_Settings_General_StartMiningWhenIdle": "Empezar a minar si no se usa el PC", + "Form_Settings_General_ShowDriverVersionWarning": "Mostrar la ventana de alerta del driver", + "Form_Settings_General_DisableWindowsErrorReporting": "Desactivar reportes de errores de Windows", + "Form_Settings_General_UseNewSettingsPage": "Usar la nueva página de configuración", + "Form_Settings_General_NVIDIAP0State": "Estado NVIDIA P0", + "Form_Settings_General_LogToFile": "Guardar el registro de eventos", "Form_Settings_General_Language": "Lenguaje", - "Form_Settings_General_MinIdleSeconds": "Tiempo de espera mínimo [s]", - "Form_Settings_General_MinerRestartDelayMS": "Retraso de reinicio [ms]", - "Form_Settings_General_MinerAPIGraceSeconds": "Tolerancia fallo API del minero [s]", - "Form_Settings_General_MinerAPIGraceSecondsAMD": "Tolerancia fallo API del minero AMD [s]", - "Form_Settings_General_MinerAPIQueryInterval": "Intervalo de llamada API [s]", - "Form_Settings_General_LogMaxFileSize": "Tamaño del registro", + "Form_Settings_General_MinIdleSeconds": "Tiempo mínimo detenido [s]", + "Form_Settings_General_MinerRestartDelayMS": "Retraso reinicio de minero[ms]", + "Form_Settings_General_MinerAPIGraceSeconds": "Periodo de gracia de la API del minero[s]", + "Form_Settings_General_MinerAPIGraceSecondsAMD": "Periodo de gracia de la API del minero(AMD)[s]", + "Form_Settings_General_MinerAPIQueryInterval": "Intervalo API del minero [s]", + "Form_Settings_General_LogMaxFileSize": "Tamaño máximo del registro [bytes]", "Form_Settings_General_SwitchMinSecondsFixed": "Cambiar mínimo fijo [s]", "Form_Settings_General_SwitchMinSecondsDynamic": "Cambiar mínimo variable [s]", "Form_Settings_General_SwitchMinSecondsAMD": "Cambiar mínimo AMD [s]", - "Form_Settings_General_ethminerDefaultBlockHeight": "Bloque predeterminado de ethminer", + "Form_Settings_General_ethminerDefaultBlockHeight": "Bloque de Ethminer", "Form_Settings_General_ethminerAPIPortNVIDIA": "Puerto API de ethminer NVIDIA", "Form_Settings_General_ethminerAPIPortAMD": "Puerto API de ethminer AMD", - "Form_Settings_General_BenchmarkTimeLimitsCPU_Group": "Duración de benchmark (CPU) [s]", - "Form_Settings_General_BenchmarkTimeLimitsNVIDIA_Group": "Duración de benchmark (NVIDIA) [s]", - "Form_Settings_General_BenchmarkTimeLimitsAMD_Group": "Duración de benchmark (AMD) [s]", + "Form_Settings_General_BenchmarkTimeLimitsCPU_Group": "(CPU) [s]", + "Form_Settings_General_BenchmarkTimeLimitsNVIDIA_Group": "(NVIDIA) [s]", + "Form_Settings_General_BenchmarkTimeLimitsAMD_Group": "(AMD) [s]", "Form_Settings_General_CPU_ForceCPUExtension": "Forzar extensión CPU", - "Form_Settings_General_CPU_LessThreads": "Hilos", + "Form_Settings_General_CPU_LessThreads": "Núcleos", "Form_Settings_General_APIBindPort": "Puerto de API", - "Form_Settings_General_UsePassword": "Contraseña", - "Form_Settings_General_MinimumProfit": "Ganancias mínimas ($/día)", - "Form_Settings_General_DisabledDevices": "Dispositivos sin uso", + "Form_Settings_General_UsePassword": "Usar contraseña", + "Form_Settings_General_MinimumProfit": "Benefícios mínimas ($/día)", + "Form_Settings_General_DisabledDevices": "Dispositivos sin usar", "Form_Settings_General_ExtraLaunchParameters": "Parámetros de inicio", "Form_Settings_General_DaggerHashimotoGenerateDevice": "Dispositivo que generará el DAG", "Form_Settings_General_DisableAMDTempControl": "Desactivar control de temperatura de AMD", "Form_Settings_Algo_Skip": "Saltar", - "Form_Settings_Algo_BenchmarkSpeed": "Rapidez de benchmark", + "Form_Settings_Algo_BenchmarkSpeed": "Velocidad del benchmark (H/s)", - "Form_Settings_LessThreadWarningTitle": "Número inválido para LessThreads!", + "Form_Settings_LessThreadWarningTitle": "¡Número inválido para LessThreads!", "Form_Settings_LessThreadWarningMsg": "¡Error! Por favor introduce un número valido para LessThreads.", "Form_Settings_MinimumProfitWarningTitle": "¡Ganancias mínimas inválidas!", "Form_Settings_MinimumProfitWarningMsg": "¡Error! Por favor introduce una ganancia mínima que sea un número y sea mayor o igual a 0.", @@ -165,20 +167,21 @@ "Form_Settings_BenchmarkSpeedWarningTitle": "¡Velocidad de benchmark inválida!", "Form_Settings_BenchmarkSpeedWarningMsg": "¡Error! Por favor introduce una velocidad de benchmark que sea un número y sea mayor o igual a 0.", "Form_Settings_DaggerHashimotoGenerateDeviceWarningTitle": "¡Número de dispositivo inválido!", - "Form_Settings_DaggerHashimotoGenerateDeviceWarningMsg": "¡Error! Por favor introduce un número de dispositivo que sea mayor o igual a 0.", + "Form_Settings_DaggerHashimotoGenerateDeviceWarningMsg": "¡Error! Por favor introduzca un número de dispositivo que sea mayor o igual a 0.", "Form_Settings_labelCPUDevice": "Usar Saltar para CPUs...", "Form_Settings_labelNoDevice": "No se ha encontrado dispositivo...", "Form_Settings_ParseIntTitle": "Error de entrada", "Form_Settings_ParseIntMsg": "Solo se aceptan números (0-9).", "Form_Settings_buttonDefaultsText": "&Predeterminados", "Form_Settings_buttonDefaultsTitle": "¿Poner configuración predeterminada?", - "Form_Settings_buttonDefaultsMsg": "¿Estás seguro de que quieres establecer la configuración predeterminada? NiceHash Miner se reiniciará automáticamente.", + "Form_Settings_buttonDefaultsMsg": "¿Está seguro de que quieres establecer la configuración predeterminada? NiceHash Miner se reiniciará automáticamente.", "Form_Settings_buttonSaveText": "&Guardar y cerrar", "Form_Settings_buttonSaveTitle": "¡Configuración guardada!", "Form_Settings_buttonSaveMsg": "¡Configuración guardada!", "Form_Settings_buttonCloseNoSaveText": "&Cerrar sin guardar", "Form_Settings_buttonCloseNoSaveTitle": "¡Alerta!", - "Form_Settings_buttonCloseNoSaveMsg": "¡Alerta! Has elegido cerrar sin guardar. ¿Seguro que quieres continuar?", + "Form_Settings_buttonCloseNoSaveMsg": "¡Alerta! Has elegido cerrar sin guardar. ¿Seguro que quiere continuar?", + "Form_Settings_ToolTip_Explaination": "Explicación", "Form_Settings_ToolTip_Language": "Cambia el lenguaje predeterminado de NiceHash Miner.", @@ -199,7 +202,7 @@ "Form_Settings_ToolTip_MinerAPIQueryInterval": "Intervalo de consulta de API para ccminer, sgminer cpuminer and ethminer.", "Form_Settings_ToolTip_MinerRestartDelayMS": "Cantidad de tiempo (en milisegundos) que NiceHashMiner esperará antes de reiniciar el minero.", "Form_Settings_ToolTip_MinerAPIGraceSeconds": "Periodo de tiempo en el que el minero no es forzado a reiniciarse cuando falla una consulta de API.", - "Form_Settings_ToolTip_MinerAPIGraceSecondsAMD": "Periodo de tiempo en el que el minero AMD no es forzado a reiniciarse cuando falla una consulta de API.", + "Form_Settings_ToolTip_MinerAPIGraceSecondsAMD": "Periodo de tiempo en el que el minero AMD no es forzado a reiniciarse cuando falla una consulta de API.", "Form_Settings_ToolTip_BenchmarkTimeLimits": "Cantidad de tiempo (en segundos) para {0} ejecutar el benchmark de {1}", @@ -231,6 +234,109 @@ "Form_Settings_ToolTip_AlgoBenchmarkSpeed": "Personalización de los ratios de los algoritmos al cambiar manualmente las velocidades de los benchmark.", "Form_Settings_ToolTip_AlgoDisabledDevices": "Todos los dispositivos marcados serán ignorados por NiceHash Miner (solo para este algoritmo).", "Form_Settings_ToolTip_AlgoExtraLaunchParameters": "Parámetros de inicio adicionales al lanzar el minero y este algoritmo.", - "Form_Settings_DisplayCurrency": "Presentación de moneda" + "Form_Settings_DisplayCurrency": "Mostrar divisa", + "Form_Settings_ToolTip_DisplayCurrency": "Elija qué divisa mostrar", + "Form_Settings_APIBindPortStart": "Puertos disponibles para la API", + "Form_Settings_ToolTip_APIBindPortStart": "Seleccione el puerto mínimo por el cual la API del minero utilizará para la comunicación", + "Form_Settings_DagGeneration": "Modo de carga del DAG", + "Form_Settings_ToolTip_DagGeneration": "Establece el modo de carga del DAG para ethminers.", + "AlgorithmsListView_Enabled" : "Habilitado", + "AlgorithmsListView_Algorithm" : "Algoritmo", + "AlgorithmsListView_Speed" : "Velocidad", + "AlgorithmsListView_Ratio": "Ratio BTC/GH/Día", + "AlgorithmsListView_Rate": "BTC/Día", + "AlgorithmSettingsControl_IntensityWaringn": "Los valores de intensidad para el algoritmo seleccionado deben estar entre {0} y {1}", + "EnabledUnbenchmarkedAlgorithmsWarning": "No hay benchamark para alguno de los dispositivos seleccionados. Haga click en Sí para realizar un benchmark y empezar a minar, o a No para saltar el benchmark y empezar a minar, o a Cancelar para detenerse.", + "AlgorithmSettingsControl_Label_Intensity": "Intensidad", + "AlgorithmSettingsControl_ToolTip_Intensity": "Establece la intensidad para el algoritmo seleccionado (valores entre 8.0 - 25.0 o 31.0 dependiendo del algoritmo). La intensidad 0 usa la valor predeterminado. OPCIÓN DE USUARIO AVANZADO.", + "AlgorithmsListView_GroupBox": "Algoritmo seleccionado: {0}", + "AlgorithmsListView_GroupBox_NONE": "NADA", + "BenchmarkOptions_Benchmark_Type": "Tipo de benchmark:", + "Form_Main_MiningDevices": "Dispositivos minando {0}:", + "Form_Main_bins_folder_files_missing": "Faltan algunos archivos desde el último inicio. Asegúrese de que su antivirus no bloquea la aplicación. NiceHash Miner podría no funcionar correctamente al faltar algunos archivos. Elige Sí para reinicializar NiceHash Miner e intentar repararlo.", + "Form_Main_MINING_NOT_PROFITABLE": "EL MINADO NO ES RENTABLE ACTUALMENTE.", + "Form_Main_MINING_NO_INTERNET_CONNECTION": "NO MINANDO. NO HAY CONEXIÓN A INTERNET", + "Form_Main_Group_Device_Rates": "Grupo/ratios del dispositivo:", + "FormBenchmark_Benchmark_Step": "Progreso del benchmark ( {0} / {1} )", + "FormBenchmark_Benchmark_Finish_Succes_MsgBox_Msg": "Todos los benchmark se han realizado correctamente", + "FormBenchmark_Benchmark_Finish_Fail_MsgBox_Msg": "Algunos benchmark han fallado. Intente reiniciar los benchamark de tales algoritmos o pulsee No para cancelar y desactivar los algoritmos que han fallado.", + "FormBenchmark_Benchmark_Finish_MsgBox_Title": "Información", + "FormBenchmark_Benchmark_GroupBoxStatus": "Progreso del benchmark:", + "FormBenchmark_Benchmark_All_Selected_Unbenchmarked": "Correr benchmark para los algoritmos seleccionados que no tengan un benchmark hecho", + "FormBenchmark_Benchmark_All_Selected_ReUnbenchmarked": "Correr benchamark a todos los algoritmos seleccionados", + "FormSettings_Tab_General": "General", + "FormSettings_Tab_Advanced": "Avanzado", + "FormSettings_Tab_Devices_Algorithms": "Dispositivos/Algoritmos", + "FormSettings_Tab_General_Group_Main": "Principal:", + "FormSettings_Tab_General_Group_Localization": "Localización:", + "FormSettings_Tab_General_Group_Logging": "Registro:", + "FormSettings_Tab_General_Group_Misc": "Misceláneo:", + "FormSettings_Tab_Advanced_Group_Miners": "Mineros:", + "FormSettings_Tab_Advanced_Group_BenchmarkTimeLimits": "Límites de tiempo de los benchamark:", + "FormSettings_Tab_Devices_Algorithms_Check_SingleProfitability": "Comprobar rentabilidad de uno", + "FormSettings_Tab_Devices_Algorithms_Check_ALLProfitability": "Comprobar rentabilidad de todos", + "MinersDownloadManager_Title_Downloading": "Descargando mineros", + "MinersDownloadManager_Title_Settup": "Configurando mineros", + "MinersDownloadManager_Title_Settup_Unzipping": "Descomprimiendo {0} %", + "DeviceListView_ContextMenu_DisableDevice": "Desactivar dispisitivo", + "DeviceListView_ContextMenu_EnableDevice": "Activar dispositivo", + "DeviceListView_ContextMenu_CopySettings": "Copiar configuración desde (Benchmarks, parámetros de algoritmos, ...)", + "DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Msg" : "¿Está seguro que quiere copiar la configuración de {0} a {1}?", + "DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Title" : "Comfirmar copia de configuración", + "FormSettings_AlgorithmsSettings": "Configuración de los algoritmos para {0} :", + "FormSettings_ButtonProfitSingle": "Selecciona un dispositivo primero", + "Form_Settings_General_BenchmarkTimeLimits_Title": "Límites de tiempo de benchmark", + "Form_Settings_Title": "Configuración", + "FormBenchmark_No_Devices_Selected_Msg": "No hay ningún dispositivo seleccionado, no hay nada a lo que hacer un benchamark", + "FormBenchmark_No_Devices_Selected_Title": "Ningún dispositivo seleccionado", + "FormBenchmark_Nothing_to_Benchmark_Msg": "Opciones acctuales del benchmark ya configuradas. No hay que hacer nada.", + "FormBenchmark_Nothing_to_Benchmark_Title": "No es necesario un benchamark", + "Algorithm_Waiting_Benchmark": "Esperando benchmark", + "BenchmarkSpeedStringNone": "nada", + "BenchmarkRatioRateN_A": "N/A", + "Benchmark_Timedout": "Tiempo de espera agotado", + "Benchmark_Terminated": "Finalizado", + "QueryVideoControllers_NOT_ALL_OK_Msg": "Hemos detectado que un controlador de vídeo no está funcionando correctamente. NiceHash Miner no será capaz de usar este controlador de vídeo para minar. Le recomendamos reiniciar el ordenador o reinstalar los drivers o controladores de vídeo.", + "QueryVideoControllers_NOT_ALL_OK_Msg_Append": "Nombre: {0}, Estado {1}, PNPDeviceID {2}", + "QueryVideoControllers_NOT_ALL_OK_Title": "¡Alerta! El driver de vídeo no está bien", + "Form_Main_Restart_Required_Msg" : "Algunas opciones exigen que NiceHash Miner se reinicie.", + "Form_Main_Restart_Required_Title" : "Aviso de reinicio", + "ComputeDevice_Short_Name": "CDev#{0}", + "ComputeDevice_Short_Name_CPU": "CPU#{0}", + "ComputeDevice_Short_Name_NVIDIA_GPU": "GPU#{0}", + "ComputeDevice_Short_Name_AMD_GPU": "GPU#{0}", + "ComputeDevice_Full_Device_Name": "{0} {1}", + "ComputeDevice_UNKNOWN_VENDOR_REPLACE": "V_ID_{0}", + "ComputeDevice_Get_With_UUID_NONE": "NADA", + "Form_Main_x64_Support_Only": "NiceHash Miner solo soporta sistemas de 64 bit. No se podrá usar NiceHash MIner con un equipo de 32 bit.", + "Compute_Device_Query_Manager_CUDA_Query": "Buscando dispositivos CUDA", + "Compute_Device_Query_Manager_OpenCL_Query": "Buscando dispositivos OpenCL", + "Compute_Device_Query_Manager_AMD_Query": "Comprobando los dispositivos AMD OpenCL", + "Compute_Device_Query_Manager_AMD_Query_Skip": "Saltar comprobación de AMD OpenCL GPUs", + "Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title": "Driver recomendado de NVIDIA", + "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "Hemos detectado que el sistema tiene GPUs de NVIDIA, pero tu driver es más antiguo que {0}. Para que NiceHash Miner funcione correctamente debería actualizar su driver a la versión recomendada {1} o mayor.", + "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART" : " (actual {0})", + "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended":"Hemos detectado que tu driver es más antiguo que {0}{1}. Le recomendamos actualizar a la versión {2} o mayor.", + "NET45_Not_Intsalled_msg": "NiceHash Miner requiere .NET Framework 4.5 o mayor para funcionar correctamente. Por favor reinstala Microsoft .NET Framework 4.5", + "Form_Settings_ToolTip_DisableDefaultOptimizations": "Al marcarse desactiva todas las optimizaciones predeterminadas, hciendo que el minado sea notablemente mas estable pero especialmente lento (especialmente en GPUs de AMD).", + "Form_Settings_Text_DisableDefaultOptimizations": "Desactivar optimizaciones predeterminadas", + "AlgorithmsListView_ContextMenu_DisableAll": "Deshabilitar todos los algoritmos", + "AlgorithmsListView_ContextMenu_EnableAll": "Habilitar todos los algoritmos", + "Form_Main_No_Device_Enabled_For_Mining": "¡Alerta! Ningún dispisitivo se ha establecido para minar, por favor habilite al menos 1 dispositivo para poder minar.", + "Form_Main_3rdParty_Title": "Aviso en el uso de software de terceros", + "Form_Main_3rdParty_Text": "Hemos integrado software de minado de terceros (desarrollado por Claymore) que debería aumentar su verlocidad y estabilidad minando - esto podría resultar en mas beneficios en un menor periodo de tiempo después de la regalía del desarrollador. Aun así, dado que no es de código abierto, no podemos inspeccionarlo de ninguna forma. NiceHash no puede garantizar el uso de ese software y se niega a asumir ninguna responsabilidad por cualquier daño causado - incumplimientos de seguridad, pérdida de datos o fondos, errores de sistema o hardware y otros problemas. Al aceptar esta exención de responsabilidad usted asume toda la responsabilidad de usar estos mineros cerrados de Claymore como son.", + "Form_Main_3rdParty_Button_Agree_Text": "Acepto", + "Form_Main_3rdParty_Button_Refuse_Text": "Rechazo", + "Form_Settings_General_3rdparty_Text": "Usar mineros de terceros", + "Form_Settings_General_3rdparty_ToolTip": "Usa mineros de terceros para una mayor rentabilidad. Úselo bajo su responsabilidad.", + "Form_Settings_General_AllowMultipleInstances_Text": "Habilitar múltiples instancias", + "Form_Settings_General_AllowMultipleInstances_ToolTip": "Cuando está desactivado, NiceHash Miner solo podrá estar ejecutandose una ver al mismo tiempo (cerraá cuaquier instancia adicional).", + "Form_Main_No_Device_Enabled_Algorithms_For_Mining": "No hay ningún algoritmo habilitado para el dispositivo seleccionado. Vaya a Configuración o a Benchmark y habilite al menos un algoritmo.", + "Form_Benchmark_checkbox_StartMiningAfterBenchmark": "Empezar a minar al acabar el Benchmark", + "Form_Main_StartMiningReturnedFalse": "NiceHash Miner no puede empezar a minar. Asegúrese de que ha habilitado al menos un dispisitivo y un algoritmo.", + "Program_WMI_Error_Text": "NiceHash Miner no puede inicializar sus componentes requeridos. Parece que su sistema tiene el servicio de Windows Management Instrumentation deshabilitado. Para que NiceHash Miner funcione correctamente, el servicio de Administración de Instrumentos de Windows debe estar habilitado. Este servicio es necesario para detectar el uso de RAM y la información del driver disponible. Habilite el servicio de Administración de Instrumentos de Windows manualmente e inicie NiceHash Miner.", + "Program_WMI_Error_Title": "Error de Administración de Instrumentos de Windows", + "Form_Main_Accepted_Speed_Zero": "¡Advertencia! El algoritmo {0} indica 0 acciones aceptadas. Deshabilite este algoritmo en Benchmark / Configuración e informe este problema a support@nicehash.com.", + "NHM_TOS": "Términos de uso de NiceHash Miner. NiceHash opera como en servicio intermedio, proporcionando poder de hashing de los propietarios de poder de hashing a los compradores de poder hashing. NiceHash no proporciona directamente su propio poder de hashing. Haremos nuestro mejor para proporcionar el servicio completo estable, seguro y de la característica. No asumimos la responsabilidad de ningún tipo de pérdida de energía de hashing o pérdida de fondos y no tomamos ningún tipo de responsabilidad financiera, material, legal u otras responsabilidades por cualquier problema que surja de usar NiceHash Miner. El servicio NiceHash y sus productos (NiceHash Miner, etc.) aún están en desarrollo, por lo que pueden surgir algunos errores u otros problemas. Trabajaremos duro para solucionar cualquier problema tan pronto como sea posible, agregar nuevas características y mejorar en general nuestro servicio. NiceHash se reserva el derecho de aprovechar los fondos de actividades ilegales sospechosas como la minería con botnets, el lavado de dinero, los intentos de hacking, etc. \r\n\r\nComo usuario de NiceHash Miner, está proporcionando su poder (como hing Vendedor) a los compradores de la energía del hashing en el mercado de la energía del hashing de NiceHash. Usted gana Bitcoins al vender su poder de hashing por cada acción válida que su minero genera y es aceptada por el servicio de NiceHash. En algunos casos, no se envían acciones o no son aceptadas por el servicio NiceHash. Estos casos son raros e incluyen el uso de hardware más lento, software o errores de red o similar. En estos casos (sin acciones generadas y sin aceptadas por el servicio de NiceHash) ninguna recompensa en forma de Bitcoins pule será contabilizada. Los pagos son automáticos y se pagan a la dirección de BTC, utilizada en NiceHash Miner. El horario de pago se puede encontrar en FAQ en nuestro sitio web y está sujeto a cambios. Siempre puede supervisar sus estadísticas en este sitio: https://www.nicehash.com/?p=myminer \r\n\r\nSi tiene alguna pregunta relacionada con estos Términos de uso, sus derechos y obligaciones derivados de estos Términos y/o su uso del servicio NiceHash, o cualquier otro asunto, póngase en contacto con nosotros en support@nicehash.com" } } From cb1fc60bbd21bcda8720b13bc7e9ee36a3d12152 Mon Sep 17 00:00:00 2001 From: boomtnt46 Date: Mon, 6 Feb 2017 23:32:33 +0100 Subject: [PATCH 256/366] Fixed some mistakes. --- NiceHashMiner/langs/es.lang | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/NiceHashMiner/langs/es.lang b/NiceHashMiner/langs/es.lang index 1ee6b36..8a8d034 100644 --- a/NiceHashMiner/langs/es.lang +++ b/NiceHashMiner/langs/es.lang @@ -52,17 +52,17 @@ "Form_Main_loadtext_NVIDIAP0State": "Poniendo tadas las GPUs de NVIDIA al estado P0...", "Form_Main_msgbox_CPUMining64bitMsg": "NiceHash Miner solo funciona en sistemas de 64bit (para el minado con CPU). El minado CPU será desactivado.", - "Form_Main_msgbox_CPUMining64CoresMsg": "NiceHash Miner no soparta más de 64 núcleos virtuales. El minado CPU será desactivado.", + "Form_Main_msgbox_CPUMining64CoresMsg": "NiceHash Miner no soporta más de 64 núcleos virtuales. El minado CPU será desactivado.", "Form_Main_msgbox_CPUMiningLessThreadMsg": "LessThreads es mayor al número de nucleos por CPU. Opción ignorada", "Form_Main_msgbox_NoInternetTitle": "Comprueba la conexión a Internet", "Form_Main_msgbox_NoInternetMsg": "NiceHash Miner requiere una conexión a Internet. Asegúrese de que tiene una conexión a internet antes de continuar. ¿Le gustaría continuar?", "Form_Main_msgbox_InvalidBTCAddressMsg": "¡Dirección Bitcoin inválida!\n\nIntruduzca una dirección válida o pulse Sí para crear una.", "Form_Main_msgbox_InvalidWorkerNameMsg": "¡Nombre inválido!\n\nPor favor introduzca un nombre válido (Aa-Zz, 0-9, de hasta 7 carácteres).", "Form_Main_msgbox_NullNiceHashDataMsg": "No se puede obtener los datos de rentabilidad de NiceHash. Si está conectado a Internet, inténtelo más tarde.", - "Form_Main_msgbox_HaveNotBenchmarkedMsg": "No has hecho ningún benchmark para el dispositivo {0}. Sin hacer un benchmark primero, NiceHashMiner no podrá cambiar al algoritmo más rentable. Para continuar, pulsa Sí. Si le gustaría hacer un benchmark primero, pulse No y haga click en Benchmark.", + "Form_Main_msgbox_HaveNotBenchmarkedMsg": "No ha hecho ningún benchmark para el dispositivo {0}. Sin hacer un benchmark primero, NiceHashMiner no podrá cambiar al algoritmo más rentable. Para continuar, pulsa Sí. Si le gustaría hacer un benchmark primero, pulse No y haga click en Benchmark.", "Form_Main_msgbox_buttonBenchmarkWarningMsg": "Solo usuarios avanzados deberían cambiar las configuraciones avanzadas. \r\n\r\nSi {0} se cierra por una mala configuración, puede arreglarlo eliminando el archivo 'config.json' .\r\n\r\n¿Seguro que quiere editar la configuración avanzada?", "Form_Main_msgbox_buttonBenchmarkRestartWarningTitle": "Reiniciando {0}", - "Form_Main_msgbox_buttonBenchmarkRestartWarningMsg": "{0} se cierrará. Esta nueva ventana de configuración está uún en beta y {0} necesita un reinicio para que haga efecto.", + "Form_Main_msgbox_buttonBenchmarkRestartWarningMsg": "{0} se cierrará. Esta nueva ventana de configuración está aún en beta y {0} necesita un reinicio para que haga efecto.", "Form_Main_msgbox_anti_botnet_msgbox": "NiceHash Miner ha detectado un cambio en la identificación del hardware. Si no has descargado e instalado NiceHash Miner, tu ordenador puede estar en peligro. En tal caso, se recomienda instalar un software antivirus o reinstalar Windows.\r\n\r\n¿Continuar con NiceHash Miner?", @@ -76,16 +76,16 @@ "Form_Benchmark_radioButton_QuickBenchmark": "Rá&pido (puede ser impreciso)", "Form_Benchmark_radioButton_StandardBenchmark": "Es&tandar", "Form_Benchmark_radioButton_PreciseBenchmark": "&Preciso (tardará más)", - "Form_Benchmark_listView_WaitSeconds": "Por favor espera unos {0} segundos...", - "Form_Benchmark_listView_WaitMinutes": "Por favor espera unos {0} minutos...", + "Form_Benchmark_listView_WaitSeconds": "Por favor espere unos {0} segundos...", + "Form_Benchmark_listView_WaitMinutes": "Por favor espere unos {0} minutos...", "Form_Benchmark_listView_WaitForEth": "Corriendo benchmark (2-4 minutos)...", - "Form_Loading_label_LoadingText": "Cargando, espera por favor...", + "Form_Loading_label_LoadingText": "Cargando, espere por favor...", "DriverVersionConfirmationDialog_title": "Actualización del driver de AMD recomendada", - "DriverVersionConfirmationDialog_labelWarning": "No estas usando una versión óptima del driver de AMD. La versión más estable para minar es la 15.7.1 .\nLe recomendamos encarecidamente usar esta versión.", + "DriverVersionConfirmationDialog_labelWarning": "No esta usando una versión óptima del driver de AMD. La versión más estable para minar es la 15.7.1 .\nLe recomendamos encarecidamente usar esta versión.", "DriverVersionConfirmationDialog_linkToDriverDownloadPage": "&Enlace a la página de descargas del driver", "DriverVersionConfirmationDialog_chkBoxDontShowAgain": "&No volver a mostrar esta ventana", @@ -97,7 +97,7 @@ "SubmitResultDialog_title": "Enviar los resultados del benchmark", - "SubmitResultDialog_labelInstruction": "Por favor selecciona un dispositivo para que se le haga un benchmark y una vez hecho, abrirá automáticamente una \r\nnueva ventana con la calculadora de rentabilidad de NiceHash.", + "SubmitResultDialog_labelInstruction": "Por favor seleccione un dispositivo para que se le haga un benchmark y una vez hecho, abrirá automáticamente una \r\nnueva ventana con la calculadora de rentabilidad de NiceHash.", "SubmitResultDialog_StartBtn": "&Empezar", "SubmitResultDialog_StopBtn": "&Detener", "SubmitResultDialog_CloseBtn": "&Cerrar", @@ -106,9 +106,9 @@ "SubmitResultDialog_LabelProgressPercentageInProgress": "{0}% : Corriendo benchmark {1}.. Espera, por favor..", "SubmitResultDialog_NoDeviceCheckedTitle": "Ningún dispositivo seleccionado", - "SubmitResultDialog_NoDeviceCheckedMsg": "Elige al menos un dispositivo para enviar los resultados.", + "SubmitResultDialog_NoDeviceCheckedMsg": "Elija al menos un dispositivo para enviar los resultados.", "SubmitResultDialog_UsePreviousBenchmarkedValueTitle": "¿Usar resultados de un benchmark previo?", - "SubmitResultDialog_UsePreviousBenchmarkedValueMsg": "Podrías usar los resultados de un benckmark anterior. Elige Sí para usar los resultados anteriores o No para volver a correr un benchmark.", + "SubmitResultDialog_UsePreviousBenchmarkedValueMsg": "Podría usar los resultados de un benckmark anterior. Elige Sí para usar los resultados anteriores o No para volver a correr un benchmark.", "Form_Settings_General_DebugConsole": "Consola de depuración", @@ -161,9 +161,9 @@ "Form_Settings_LessThreadWarningTitle": "¡Número inválido para LessThreads!", "Form_Settings_LessThreadWarningMsg": "¡Error! Por favor introduce un número valido para LessThreads.", "Form_Settings_MinimumProfitWarningTitle": "¡Ganancias mínimas inválidas!", - "Form_Settings_MinimumProfitWarningMsg": "¡Error! Por favor introduce una ganancia mínima que sea un número y sea mayor o igual a 0.", + "Form_Settings_MinimumProfitWarningMsg": "¡Error! Por favor introduzca una ganancia mínima que sea un número y sea mayor o igual a 0.", "Form_Settings_APIBindPortWarningTitle": "¡Número de puerto de la API inválido!", - "Form_Settings_APIBindPortWarningMsg": "¡Error! Por favor introduce un número de puerto para la API válido.", + "Form_Settings_APIBindPortWarningMsg": "¡Error! Por favor introduzca un número de puerto para la API válido.", "Form_Settings_BenchmarkSpeedWarningTitle": "¡Velocidad de benchmark inválida!", "Form_Settings_BenchmarkSpeedWarningMsg": "¡Error! Por favor introduce una velocidad de benchmark que sea un número y sea mayor o igual a 0.", "Form_Settings_DaggerHashimotoGenerateDeviceWarningTitle": "¡Número de dispositivo inválido!", @@ -174,13 +174,13 @@ "Form_Settings_ParseIntMsg": "Solo se aceptan números (0-9).", "Form_Settings_buttonDefaultsText": "&Predeterminados", "Form_Settings_buttonDefaultsTitle": "¿Poner configuración predeterminada?", - "Form_Settings_buttonDefaultsMsg": "¿Está seguro de que quieres establecer la configuración predeterminada? NiceHash Miner se reiniciará automáticamente.", + "Form_Settings_buttonDefaultsMsg": "¿Está seguro de que quiere establecer la configuración predeterminada? NiceHash Miner se reiniciará automáticamente.", "Form_Settings_buttonSaveText": "&Guardar y cerrar", "Form_Settings_buttonSaveTitle": "¡Configuración guardada!", "Form_Settings_buttonSaveMsg": "¡Configuración guardada!", "Form_Settings_buttonCloseNoSaveText": "&Cerrar sin guardar", "Form_Settings_buttonCloseNoSaveTitle": "¡Alerta!", - "Form_Settings_buttonCloseNoSaveMsg": "¡Alerta! Has elegido cerrar sin guardar. ¿Seguro que quiere continuar?", + "Form_Settings_buttonCloseNoSaveMsg": "¡Alerta! Ha elegido cerrar sin guardar. ¿Seguro que quiere continuar?", "Form_Settings_ToolTip_Explaination": "Explicación", From 2f5f4b9e3b4cd4fd2cadddae42ed2bcccad6b37d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 7 Feb 2017 11:17:42 +0100 Subject: [PATCH 257/366] tos update, profit threshold setting --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 1 + NiceHashMiner/Forms/Form_Benchmark.cs | 32 ++++++++-------- NiceHashMiner/Forms/Form_ChooseLanguage.cs | 2 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 37 +++++++++++++++++++ NiceHashMiner/Forms/Form_Settings.cs | 8 ++++ NiceHashMiner/Forms/Form_Settings.resx | 8 ++-- NiceHashMiner/Miners/MiningSession.cs | 13 +++++++ NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- NiceHashMiner/langs/en.lang | 5 ++- NiceHashMiner/langs/ru.lang | 5 ++- 10 files changed, 90 insertions(+), 25 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index d082598..9c8a8fc 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -25,6 +25,7 @@ public class GeneralConfig { public int SwitchMinSecondsFixed = 90; public int SwitchMinSecondsDynamic = 30; public int SwitchMinSecondsAMD = 60; + public double SwitchProfitabilityThreshold = 0.02; // percent public int MinerAPIQueryInterval = 5; public int MinerRestartDelayMS = 500; diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index d401645..c2b1bd9 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -166,19 +166,19 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm } } - private void CopyBenchmarks() { - Helpers.ConsolePrint("CopyBenchmarks", "Checking for benchmarks to copy"); - foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // check if copy - if (!cDev.Enabled && cDev.BenchmarkCopyUUID != null) { - var copyCdevSettings = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(cDev.BenchmarkCopyUUID); - if (copyCdevSettings != null) { - Helpers.ConsolePrint("CopyBenchmarks", String.Format("Copy from {0} to {1}", cDev.UUID, cDev.BenchmarkCopyUUID)); - cDev.CopyBenchmarkSettingsFrom(copyCdevSettings); - } - } - } - } + //private void CopyBenchmarks() { + // Helpers.ConsolePrint("CopyBenchmarks", "Checking for benchmarks to copy"); + // foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // // check if copy + // if (!cDev.Enabled && cDev.BenchmarkCopyUUID != null) { + // var copyCdevSettings = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(cDev.BenchmarkCopyUUID); + // if (copyCdevSettings != null) { + // Helpers.ConsolePrint("CopyBenchmarks", String.Format("Copy from {0} to {1}", cDev.UUID, cDev.BenchmarkCopyUUID)); + // cDev.CopyBenchmarkSettingsFrom(copyCdevSettings); + // } + // } + // } + //} private void BenchmarkingTimer_Tick(object sender, EventArgs e) { if (_inBenchmark) { @@ -244,8 +244,8 @@ private void StopButonClick() { _benchmarkingTimer.Stop(); _inBenchmark = false; Helpers.ConsolePrint("FormBenchmark", "StopButonClick() benchmark routine stopped"); - // copy benchmarked - CopyBenchmarks(); + //// copy benchmarked + //CopyBenchmarks(); if (_currentMiner != null) { _currentMiner.BenchmarkSignalQuit = true; _currentMiner.InvokeBenchmarkSignalQuit(); @@ -445,7 +445,7 @@ void EndBenchmark() { _inBenchmark = false; Helpers.ConsolePrint("FormBenchmark", "EndBenchmark() benchmark routine finished"); - CopyBenchmarks(); + //CopyBenchmarks(); BenchmarkStoppedGUISettings(); // check if all ok diff --git a/NiceHashMiner/Forms/Form_ChooseLanguage.cs b/NiceHashMiner/Forms/Form_ChooseLanguage.cs index e3143d1..839cbfc 100644 --- a/NiceHashMiner/Forms/Form_ChooseLanguage.cs +++ b/NiceHashMiner/Forms/Form_ChooseLanguage.cs @@ -11,7 +11,7 @@ namespace NiceHashMiner.Forms { public partial class Form_ChooseLanguage : Form { - private static readonly string TOS_TEXT = "NiceHash Miner Terms Of Use NiceHash operates as in intermediate service by providing hashing power from hashing power owners to hashing power buyers. NiceHash does not directly provide it's own hashing power. We will do our best to provide stable, secure and feature full service. We do not take responsibility for any kind of hashing power loss or funds loss and do not take any kind of financial, material, legal or other responsibilities for any issues that my arise from using NiceHash Miner. NiceHash service and it's products (NiceHash Miner, etc.) is still in development, therefore some bugs or other issues may arise. We will work hard to fix any issues as soon as possible, add new features and overall improve our service. NiceHash reserves the rights to seize any funds of suspicious illegal activity such as mining with botnets, money laundering, hacking attempts, etc.\r\n\r\nAs a user of NiceHash Miner, you are providing your hashing power (your are a seller) to the hashing power buyers though NiceHash's hashing power marketplace. You earn Bitcoins from selling your hashing power for every valid share your miner generates and is accepted by NiceHash service. In some cases no shares are sent to or are accepted by NiceHash service. This cases are rare and includes usage of slower hardware, software or network errors or simmilar. In these cases (no shares generated and accepted by NiceHash service) no reward in form of Bitcoins can be accounted to you. Payouts are automatic and are paid to BTC address, used in NiceHash Miner. Payment schedule can be found in FAQ on our website and is subject to change. You can always monitor your statistics on this site: https://www.nicehash.com/?p=myminer \r\n\r\nIf you have any questions relating to these Terms of Use, your rights and obligations arising from these Terms and/or your use of the NiceHash service, or any other matter, please contact us at support@nicehash.com."; + private static readonly string TOS_TEXT = "NiceHash Miner Term Of Use\r\n\r\nNiceHash operates as in intermediate service by providing hashing power from hashing power owners to hashing power buyers. NiceHash does not directly provide it's own hashing power. We will do our best to provide stable, secure and feature full service. We do not take responsibility for any kind of hashing power loss or funds loss and do not take any kind of financial, material, legal or other responsibilities for any issues that my arise from using NiceHash Miner. NiceHash service and it's products (NiceHash Miner, etc.) is still in development, therefore some bugs or other issues may arise. We will work hard to fix any issues as soon as possible, add new features and overall improve our service. NiceHash reserves the rights to seize any funds of suspicious illegal activity such as mining with botnets, money laundering, hacking attempts, etc.\r\n\r\nAs a user of NiceHash Miner, you are providing your hashing power (you are a seller) to the hashing power buyers through NiceHash's hashing power marketplace. You earn Bitcoins from selling your hashing power for every valid share your miner generates and is accepted by NiceHash service. In some cases no shares are sent to or are accepted by NiceHash service. This cases are rare and include usage of slower hardware, software or network errors or simmilar. In these cases (no shares generated and accepted by NiceHash service) no reward in form of Bitcoins can be accounted to you. Payouts are automatic and are paid to BTC address, used in NiceHash Miner. Payment schedule can be found in FAQ on our website and is subject to change. You can always monitor your statistics on this site: https://www.nicehash.com/?p=myminer \r\n\r\nDue to possible software bugs or driver version combination you accept that the information displayed in the NiceHash Miner may be incorrect and/or that you may not get credited for mining.\r\n\r\nIf you have any questions relating to these Terms of Use, your rights and obligations arising from these Terms and/or your use of the NiceHash service, or any other matter, please contact us at support@nicehash.com."; public Form_ChooseLanguage() { InitializeComponent(); diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 09d9481..0fe5a4a 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -133,6 +133,9 @@ private void InitializeComponent() { this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); + this.label_SwitchProfitabilityThreshold = new System.Windows.Forms.Label(); + this.textBox_SwitchProfitabilityThreshold = new System.Windows.Forms.TextBox(); + this.pictureBox_SwitchProfitabilityThreshold = new System.Windows.Forms.PictureBox(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); @@ -179,6 +182,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_SwitchProfitabilityThreshold)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -905,6 +909,7 @@ private void InitializeComponent() { this.groupBox_Miners.Controls.Add(this.pictureBox_MinerRestartDelayMS); this.groupBox_Miners.Controls.Add(this.pictureBox_APIBindPortStart); this.groupBox_Miners.Controls.Add(this.pictureBox_SwitchMinSecondsDynamic); + this.groupBox_Miners.Controls.Add(this.pictureBox_SwitchProfitabilityThreshold); this.groupBox_Miners.Controls.Add(this.pictureBox_ethminerDefaultBlockHeight); this.groupBox_Miners.Controls.Add(this.pictureBox_DagGeneration); this.groupBox_Miners.Controls.Add(this.pictureBox_CPU0_ForceCPUExtension); @@ -922,7 +927,9 @@ private void InitializeComponent() { this.groupBox_Miners.Controls.Add(this.label_MinerRestartDelayMS); this.groupBox_Miners.Controls.Add(this.textBox_SwitchMinSecondsAMD); this.groupBox_Miners.Controls.Add(this.label_APIBindPortStart); + this.groupBox_Miners.Controls.Add(this.textBox_SwitchProfitabilityThreshold); this.groupBox_Miners.Controls.Add(this.textBox_ethminerDefaultBlockHeight); + this.groupBox_Miners.Controls.Add(this.label_SwitchProfitabilityThreshold); this.groupBox_Miners.Controls.Add(this.label_ethminerDefaultBlockHeight); this.groupBox_Miners.Controls.Add(this.textBox_APIBindPortStart); this.groupBox_Miners.Controls.Add(this.label_SwitchMinSecondsAMD); @@ -1365,6 +1372,32 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // + // label_SwitchProfitabilityThreshold + // + this.label_SwitchProfitabilityThreshold.AutoSize = true; + this.label_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(406, 102); + this.label_SwitchProfitabilityThreshold.Name = "label_SwitchProfitabilityThreshold"; + this.label_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(142, 13); + this.label_SwitchProfitabilityThreshold.TabIndex = 361; + this.label_SwitchProfitabilityThreshold.Text = "ethminerDefaultBlockHeight:"; + // + // textBox_SwitchProfitabilityThreshold + // + this.textBox_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(406, 123); + this.textBox_SwitchProfitabilityThreshold.Name = "textBox_SwitchProfitabilityThreshold"; + this.textBox_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(172, 20); + this.textBox_SwitchProfitabilityThreshold.TabIndex = 333; + // + // pictureBox_SwitchProfitabilityThreshold + // + this.pictureBox_SwitchProfitabilityThreshold.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(560, 104); + this.pictureBox_SwitchProfitabilityThreshold.Name = "pictureBox_SwitchProfitabilityThreshold"; + this.pictureBox_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(18, 18); + this.pictureBox_SwitchProfitabilityThreshold.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_SwitchProfitabilityThreshold.TabIndex = 385; + this.pictureBox_SwitchProfitabilityThreshold.TabStop = false; + // // Form_Settings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1431,6 +1464,7 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_SwitchProfitabilityThreshold)).EndInit(); this.ResumeLayout(false); } @@ -1546,6 +1580,9 @@ private void InitializeComponent() { private System.Windows.Forms.CheckBox checkBox_Use3rdPartyMiners; private System.Windows.Forms.CheckBox checkBox_AllowMultipleInstances; private System.Windows.Forms.PictureBox pictureBox_AllowMultipleInstances; + private System.Windows.Forms.PictureBox pictureBox_SwitchProfitabilityThreshold; + private System.Windows.Forms.TextBox textBox_SwitchProfitabilityThreshold; + private System.Windows.Forms.Label label_SwitchProfitabilityThreshold; } } \ No newline at end of file diff --git a/NiceHashMiner/Forms/Form_Settings.cs b/NiceHashMiner/Forms/Form_Settings.cs index 33ae34d..2e8547b 100644 --- a/NiceHashMiner/Forms/Form_Settings.cs +++ b/NiceHashMiner/Forms/Form_Settings.cs @@ -210,6 +210,9 @@ private void InitializeToolTip() { toolTip1.SetToolTip(checkBox_IdleWhenNoInternetAccess, International.GetText("Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess")); toolTip1.SetToolTip(pictureBox_IdleWhenNoInternetAccess, International.GetText("Form_Settings_ToolTip_ContinueMiningIfNoInternetAccess")); + toolTip1.SetToolTip(pictureBox_SwitchProfitabilityThreshold, International.GetText("Form_Settings_ToolTip_SwitchProfitabilityThreshold")); + toolTip1.SetToolTip(label_SwitchProfitabilityThreshold, International.GetText("Form_Settings_ToolTip_SwitchProfitabilityThreshold")); + this.Text = International.GetText("Form_Settings_Title"); algorithmSettingsControl1.InitLocale(toolTip1); @@ -297,6 +300,8 @@ private void InitializeGeneralTabTranslations() { checkBox_DisableDefaultOptimizations.Text = International.GetText("Form_Settings_Text_DisableDefaultOptimizations"); checkBox_IdleWhenNoInternetAccess.Text = International.GetText("Form_Settings_Text_ContinueMiningIfNoInternetAccess"); + + label_SwitchProfitabilityThreshold.Text = International.GetText("Form_Settings_General_SwitchProfitabilityThreshold"); } private void InitializeGeneralTabCallbacks() { @@ -399,6 +404,7 @@ private void InitializeGeneralTabFieldValuesReferences() { textBox_ethminerDefaultBlockHeight.Text = ConfigManager.GeneralConfig.ethminerDefaultBlockHeight.ToString(); textBox_APIBindPortStart.Text = ConfigManager.GeneralConfig.ApiBindPortPoolStart.ToString(); textBox_MinProfit.Text = ConfigManager.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma; + textBox_SwitchProfitabilityThreshold.Text = ConfigManager.GeneralConfig.SwitchProfitabilityThreshold.ToString("F2").Replace(',', '.'); // force comma; } // set custom control referances @@ -547,11 +553,13 @@ private void GeneralTextBoxes_Leave(object sender, EventArgs e) { ConfigManager.GeneralConfig.ApiBindPortPoolStart = Helpers.ParseInt(textBox_APIBindPortStart.Text); // min profit ConfigManager.GeneralConfig.MinimumProfit = Helpers.ParseDouble(textBox_MinProfit.Text); + ConfigManager.GeneralConfig.SwitchProfitabilityThreshold = Helpers.ParseDouble(textBox_SwitchProfitabilityThreshold.Text); // Fix bounds ConfigManager.GeneralConfig.FixSettingBounds(); // update strings textBox_MinProfit.Text = ConfigManager.GeneralConfig.MinimumProfit.ToString("F2").Replace(',', '.'); // force comma + textBox_SwitchProfitabilityThreshold.Text = ConfigManager.GeneralConfig.SwitchProfitabilityThreshold.ToString("F2").Replace(',', '.'); // force comma textBox_SwitchMinSecondsFixed.Text = ConfigManager.GeneralConfig.SwitchMinSecondsFixed.ToString(); textBox_SwitchMinSecondsDynamic.Text = ConfigManager.GeneralConfig.SwitchMinSecondsDynamic.ToString(); textBox_SwitchMinSecondsAMD.Text = ConfigManager.GeneralConfig.SwitchMinSecondsAMD.ToString(); diff --git a/NiceHashMiner/Forms/Form_Settings.resx b/NiceHashMiner/Forms/Form_Settings.resx index 61b7fb9..1fcca13 100644 --- a/NiceHashMiner/Forms/Form_Settings.resx +++ b/NiceHashMiner/Forms/Form_Settings.resx @@ -112,15 +112,15 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - + 25 \ No newline at end of file diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 8646169..0b79fb2 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -38,6 +38,8 @@ public class MiningSession { private bool IsConnectedToInternet = true; private bool IsMiningRegardlesOfProfit = true; + private double LastEstimatedProfit = 0; + // timers private Timer _preventSleepTimer; // check internet connection @@ -324,6 +326,17 @@ public void SwichMostProfitableGroupUpMethod(Dictionary 0 && CurrentProfit > 0) { + double percDiff = Math.Abs((LastEstimatedProfit / CurrentProfit) - 1); + if (percDiff < ConfigManager.GeneralConfig.SwitchProfitabilityThreshold) { + // don't switch + Helpers.ConsolePrint(TAG, String.Format("Will not switch profit diff is {0}, current threshold {1}", percDiff, ConfigManager.GeneralConfig.SwitchProfitabilityThreshold)); + return; + } + } + + LastEstimatedProfit = CurrentProfit; Dictionary> newGroupedMiningPairs = new Dictionary>(); // group devices with same supported algorithms diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 13d6fc5..7f3137d 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.4.4")] -[assembly: AssemblyFileVersion("1.7.4.4")] +[assembly: AssemblyVersion("1.7.4.5")] +[assembly: AssemblyFileVersion("1.7.4.5")] diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index ccf42cc..d8fd19f 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -338,6 +338,9 @@ "Program_WMI_Error_Text": "NiceHash Miner cannot run needed components. It seems that your system has Windows Management Instrumentation service Disabled. In order for NiceHash Miner to work properly Windows Management Instrumentation service needs to be Enabled. This service is needed to detect RAM usage and Avaliable Video controler information. Enable Windows Management Instrumentation service manually and start NiceHash Miner.", "Program_WMI_Error_Title": "Windows Management Instrumentation Error", "Form_Main_Accepted_Speed_Zero": "Warning! Algorithm {0} is reporting 0 shares accepted. Please disable this algorithm in Benchmark/Settings and report this issue to support@nicehash.com!", - "NHM_TOS" : "NiceHash Miners Term Of Use NiceHash operates as in intermediate service by providing hashing power from hashing power owners to hashing power buyers. NiceHash does not directly provide it's own hashing power. We will do our best to provide stable, secure and feature full service. We do not take responsibility for any kind of hashing power loss or funds loss and do not take any kind of financial, material, legal or other responsibilities for any issues that my arise from using NiceHash Miner. NiceHash service and it's products (NiceHash Miner, etc.) is still in development, therefore some bugs or other issues may arise. We will work hard to fix any issues as soon as possible, add new features and overall improve our service. NiceHash reserves the rights to seize any funds of suspicious illegal activity such as mining with botnets, money laundering, hacking attempts, etc.\r\n\r\nAs a user of NiceHash Miner, you are providing your hashing power (your are a seller) to the hashing power buyers though NiceHash's hashing power marketplace. You earn Bitcoins from selling your hashing power for every valid share your miner generates and is accepted by NiceHash service. In some cases no shares are sent to or are accepted by NiceHash service. This cases are rare and includes usage of slower hardware, software or network errors or simmilar. In these cases (no shares generated and accepted by NiceHash service) no reward in form of Bitcoins can be accounted to you. Payouts are automatic and are paid to BTC address, used in NiceHash Miner. Payment schedule can be found in FAQ on our website and is subject to change. You can always monitor your statistics on this site: https://www.nicehash.com/?p=myminer\r\n\r\nIf you have any questions relating to these Terms of Use, your rights and obligations arising from these Terms and/or your use of the NiceHash service, or any other matter, please contact us at support@nicehash.com." + "NHM_TOS": "NiceHash Miners Term Of Use NiceHash operates as in intermediate service by providing hashing power from hashing power owners to hashing power buyers. NiceHash does not directly provide it's own hashing power. We will do our best to provide stable, secure and feature full service. We do not take responsibility for any kind of hashing power loss or funds loss and do not take any kind of financial, material, legal or other responsibilities for any issues that my arise from using NiceHash Miner. NiceHash service and it's products (NiceHash Miner, etc.) is still in development, therefore some bugs or other issues may arise. We will work hard to fix any issues as soon as possible, add new features and overall improve our service. NiceHash reserves the rights to seize any funds of suspicious illegal activity such as mining with botnets, money laundering, hacking attempts, etc.\r\n\r\nAs a user of NiceHash Miner, you are providing your hashing power (your are a seller) to the hashing power buyers though NiceHash's hashing power marketplace. You earn Bitcoins from selling your hashing power for every valid share your miner generates and is accepted by NiceHash service. In some cases no shares are sent to or are accepted by NiceHash service. This cases are rare and includes usage of slower hardware, software or network errors or simmilar. In these cases (no shares generated and accepted by NiceHash service) no reward in form of Bitcoins can be accounted to you. Payouts are automatic and are paid to BTC address, used in NiceHash Miner. Payment schedule can be found in FAQ on our website and is subject to change. You can always monitor your statistics on this site: https://www.nicehash.com/?p=myminer\r\n\r\nIf you have any questions relating to these Terms of Use, your rights and obligations arising from these Terms and/or your use of the NiceHash service, or any other matter, please contact us at support@nicehash.com.", + + "Form_Settings_General_SwitchProfitabilityThreshold": "SwitchProfitabilityThreshold", + "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Miner will not switch if the profitability is below SwitchProfitabilityThreshold. Value is in percentage [0 - 1]" } } diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index a2de93d..c3eaa8b 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -337,6 +337,9 @@ "Form_Main_StartMiningReturnedFalse": "NiceHashMiner не может начать майнинг. Убедитесь, что хотя-бы одно устройство включено с хотя-бы одним включенным и прошедшим бенчмарк алгоритмом", "Program_WMI_Error_Text": "NiceHash Miner не может запустить необходимые компоненты. Похоже, что в вашей системе отключен сервис Инструментарий управления Windows. Для корректной работы NiceHash Miner, сервис Инструментарий управления Windows должен быть включен. Этот сервис нужен для определения использования RAM и доступной информации видеоконтроллера. Включите сервис Инструментарий управления Windows вручную и запустите NiceHash Miner.", "Program_WMI_Error_Title": "Ошибка Инструментария управления Windows", - "Form_Main_Accepted_Speed_Zero" : "Предупреждение! Алгоритм {0} сообщает 0 принятых шар. Отключите, пожалуйста, этот алгоритм в Бенчмарке/Настройках и сообщите о данной проблеме на support-ru@nicehash.com!" + "Form_Main_Accepted_Speed_Zero": "Предупреждение! Алгоритм {0} сообщает 0 принятых шар. Отключите, пожалуйста, этот алгоритм в Бенчмарке/Настройках и сообщите о данной проблеме на support-ru@nicehash.com!", + + "Form_Settings_General_SwitchProfitabilityThreshold": "SwitchProfitabilityThreshold", + "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Miner will not switch if the profitability is below SwitchProfitabilityThreshold. Value is in percentage [0 - 1]" } } \ No newline at end of file From 2e74713a23d874cf81d1e8618ecf8f10854dbd6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 7 Feb 2017 11:33:56 +0100 Subject: [PATCH 258/366] russian lang update --- NiceHashMiner/langs/ru.lang | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index c3eaa8b..50eb629 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -338,8 +338,8 @@ "Program_WMI_Error_Text": "NiceHash Miner не может запустить необходимые компоненты. Похоже, что в вашей системе отключен сервис Инструментарий управления Windows. Для корректной работы NiceHash Miner, сервис Инструментарий управления Windows должен быть включен. Этот сервис нужен для определения использования RAM и доступной информации видеоконтроллера. Включите сервис Инструментарий управления Windows вручную и запустите NiceHash Miner.", "Program_WMI_Error_Title": "Ошибка Инструментария управления Windows", "Form_Main_Accepted_Speed_Zero": "Предупреждение! Алгоритм {0} сообщает 0 принятых шар. Отключите, пожалуйста, этот алгоритм в Бенчмарке/Настройках и сообщите о данной проблеме на support-ru@nicehash.com!", - - "Form_Settings_General_SwitchProfitabilityThreshold": "SwitchProfitabilityThreshold", - "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Miner will not switch if the profitability is below SwitchProfitabilityThreshold. Value is in percentage [0 - 1]" + + "Form_Settings_General_SwitchProfitabilityThreshold": "Порог переключения прибыльности", + "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Майнер не будет переключаться, если разница между прибыльностью алгоритмов ниже Порога переключения прибыльности. Значение в процентах [0 — 1]", } } \ No newline at end of file From 37f376a0e0402c039583ac8624a60957517b1e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 7 Feb 2017 12:32:01 +0100 Subject: [PATCH 259/366] Optiminer host resolve issue fixed --- NiceHashMiner/Forms/Form_Benchmark.cs | 26 +++++++++---------- .../Miners/Equihash/OptiminerZcashMiner.cs | 1 + 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index c2b1bd9..cc5c932 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -166,19 +166,19 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm } } - //private void CopyBenchmarks() { - // Helpers.ConsolePrint("CopyBenchmarks", "Checking for benchmarks to copy"); - // foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // // check if copy - // if (!cDev.Enabled && cDev.BenchmarkCopyUUID != null) { - // var copyCdevSettings = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(cDev.BenchmarkCopyUUID); - // if (copyCdevSettings != null) { - // Helpers.ConsolePrint("CopyBenchmarks", String.Format("Copy from {0} to {1}", cDev.UUID, cDev.BenchmarkCopyUUID)); - // cDev.CopyBenchmarkSettingsFrom(copyCdevSettings); - // } - // } - // } - //} + private void CopyBenchmarks() { + Helpers.ConsolePrint("CopyBenchmarks", "Checking for benchmarks to copy"); + foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // check if copy + if (!cDev.Enabled && cDev.BenchmarkCopyUUID != null) { + var copyCdevSettings = ComputeDeviceManager.Avaliable.GetDeviceWithUUID(cDev.BenchmarkCopyUUID); + if (copyCdevSettings != null) { + Helpers.ConsolePrint("CopyBenchmarks", String.Format("Copy from {0} to {1}", cDev.UUID, cDev.BenchmarkCopyUUID)); + cDev.CopyBenchmarkSettingsFrom(copyCdevSettings); + } + } + } + } private void BenchmarkingTimer_Tick(object sender, EventArgs e) { if (_inBenchmark) { diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs index 828625e..5e81808 100644 --- a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -17,6 +17,7 @@ namespace NiceHashMiner.Miners.Equihash { public class OptiminerZcashMiner : Miner { public OptiminerZcashMiner() : base("OptiminerZcashMiner") { + ConectionType = NHMConectionType.NONE; Path = MinerPaths.OptiminerZcashMiner; WorkingDirectory = MinerPaths.OptiminerZcashMiner.Replace("Optiminer.exe", ""); } From a9083b1217d10a9d3387832b668a1ee7da0ef2fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 7 Feb 2017 13:22:13 +0100 Subject: [PATCH 260/366] change ccminer cryptonight default param value --- NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 21bd21f..4ddd36a 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -22,7 +22,7 @@ public static class ExtraLaunchParameters { new MinerOptionPackage( MinerType.ccminer_CryptoNight, new List() { - new MinerOption("Launch", "-l", "--launch=", "8x40", MinerOptionFlagType.MultiParam, ","), // default is 8x40 + new MinerOption("Launch", "-l", "--launch=", "8x20", MinerOptionFlagType.MultiParam, ","), // default is 8x40 new MinerOption("Bfactor", "", "--bfactor=", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption("Bsleep", "", "--bsleep=", "0", MinerOptionFlagType.MultiParam, ",") // TODO check default }, From 3eb56d8a70543d85a0b05f43d10a4a32f6c3cc54 Mon Sep 17 00:00:00 2001 From: boomtnt46 Date: Tue, 7 Feb 2017 16:17:15 +0100 Subject: [PATCH 261/366] Added missing lines from the last update (1.7.4.5) --- NiceHashMiner/langs/es.lang | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/langs/es.lang b/NiceHashMiner/langs/es.lang index 8a8d034..431f1a4 100644 --- a/NiceHashMiner/langs/es.lang +++ b/NiceHashMiner/langs/es.lang @@ -337,6 +337,9 @@ "Program_WMI_Error_Text": "NiceHash Miner no puede inicializar sus componentes requeridos. Parece que su sistema tiene el servicio de Windows Management Instrumentation deshabilitado. Para que NiceHash Miner funcione correctamente, el servicio de Administración de Instrumentos de Windows debe estar habilitado. Este servicio es necesario para detectar el uso de RAM y la información del driver disponible. Habilite el servicio de Administración de Instrumentos de Windows manualmente e inicie NiceHash Miner.", "Program_WMI_Error_Title": "Error de Administración de Instrumentos de Windows", "Form_Main_Accepted_Speed_Zero": "¡Advertencia! El algoritmo {0} indica 0 acciones aceptadas. Deshabilite este algoritmo en Benchmark / Configuración e informe este problema a support@nicehash.com.", - "NHM_TOS": "Términos de uso de NiceHash Miner. NiceHash opera como en servicio intermedio, proporcionando poder de hashing de los propietarios de poder de hashing a los compradores de poder hashing. NiceHash no proporciona directamente su propio poder de hashing. Haremos nuestro mejor para proporcionar el servicio completo estable, seguro y de la característica. No asumimos la responsabilidad de ningún tipo de pérdida de energía de hashing o pérdida de fondos y no tomamos ningún tipo de responsabilidad financiera, material, legal u otras responsabilidades por cualquier problema que surja de usar NiceHash Miner. El servicio NiceHash y sus productos (NiceHash Miner, etc.) aún están en desarrollo, por lo que pueden surgir algunos errores u otros problemas. Trabajaremos duro para solucionar cualquier problema tan pronto como sea posible, agregar nuevas características y mejorar en general nuestro servicio. NiceHash se reserva el derecho de aprovechar los fondos de actividades ilegales sospechosas como la minería con botnets, el lavado de dinero, los intentos de hacking, etc. \r\n\r\nComo usuario de NiceHash Miner, está proporcionando su poder (como hing Vendedor) a los compradores de la energía del hashing en el mercado de la energía del hashing de NiceHash. Usted gana Bitcoins al vender su poder de hashing por cada acción válida que su minero genera y es aceptada por el servicio de NiceHash. En algunos casos, no se envían acciones o no son aceptadas por el servicio NiceHash. Estos casos son raros e incluyen el uso de hardware más lento, software o errores de red o similar. En estos casos (sin acciones generadas y sin aceptadas por el servicio de NiceHash) ninguna recompensa en forma de Bitcoins pule será contabilizada. Los pagos son automáticos y se pagan a la dirección de BTC, utilizada en NiceHash Miner. El horario de pago se puede encontrar en FAQ en nuestro sitio web y está sujeto a cambios. Siempre puede supervisar sus estadísticas en este sitio: https://www.nicehash.com/?p=myminer \r\n\r\nSi tiene alguna pregunta relacionada con estos Términos de uso, sus derechos y obligaciones derivados de estos Términos y/o su uso del servicio NiceHash, o cualquier otro asunto, póngase en contacto con nosotros en support@nicehash.com" + "NHM_TOS": "Términos de uso de NiceHash Miner. \r\n\r\nNiceHash opera como en servicio intermedio, proporcionando poder de hashing de los propietarios de poder de hashing a los compradores de poder hashing. NiceHash no proporciona directamente su propio poder de hashing. Haremos nuestro mejor para proporcionar el servicio completo estable, seguro y de la característica. No asumimos la responsabilidad de ningún tipo de pérdida de energía de hashing o pérdida de fondos y no tomamos ningún tipo de responsabilidad financiera, material, legal u otras responsabilidades por cualquier problema que surja de usar NiceHash Miner. El servicio NiceHash y sus productos (NiceHash Miner, etc.) aún están en desarrollo, por lo que pueden surgir algunos errores u otros problemas. Trabajaremos duro para solucionar cualquier problema tan pronto como sea posible, agregar nuevas características y mejorar en general nuestro servicio. NiceHash se reserva el derecho de aprovechar los fondos de actividades ilegales sospechosas como la minería con botnets, el lavado de dinero, los intentos de hacking, etc. \r\n\r\nComo usuario de NiceHash Miner, está proporcionando su poder (como hing Vendedor) a los compradores de la energía del hashing en el mercado de la energía del hashing de NiceHash. Usted gana Bitcoins al vender su poder de hashing por cada acción válida que su minero genera y es aceptada por el servicio de NiceHash. En algunos casos, no se envían acciones o no son aceptadas por el servicio NiceHash. Estos casos son raros e incluyen el uso de hardware más lento, software o errores de red o similar. En estos casos (sin acciones generadas y sin aceptadas por el servicio de NiceHash) ninguna recompensa en forma de Bitcoins pule será contabilizada. Los pagos son automáticos y se pagan a la dirección de BTC, utilizada en NiceHash Miner. El horario de pago se puede encontrar en FAQ en nuestro sitio web y está sujeto a cambios. Siempre puede supervisar sus estadísticas en este sitio: https://www.nicehash.com/?p=myminer \r\n\r\nSi tiene alguna pregunta relacionada con estos Términos de uso, sus derechos y obligaciones derivados de estos Términos y/o su uso del servicio NiceHash, o cualquier otro asunto, póngase en contacto con nosotros en support@nicehash.com" + + "Form_Settings_General_SwitchProfitabilityThreshold": "Umbral de rentabilidad", + "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "El minero no se cambiará si la rentabilidad es menor a el umbral de rentabilidad establecido. El valor es un porcentaje [0 - 1]" } } From 05efca5b6cbeb6b4f25ace83296dd5c5ab60c503 Mon Sep 17 00:00:00 2001 From: boomtnt46 Date: Tue, 7 Feb 2017 16:17:53 +0100 Subject: [PATCH 262/366] Update es.lang --- NiceHashMiner/langs/es.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/langs/es.lang b/NiceHashMiner/langs/es.lang index 431f1a4..c04b9cd 100644 --- a/NiceHashMiner/langs/es.lang +++ b/NiceHashMiner/langs/es.lang @@ -337,7 +337,7 @@ "Program_WMI_Error_Text": "NiceHash Miner no puede inicializar sus componentes requeridos. Parece que su sistema tiene el servicio de Windows Management Instrumentation deshabilitado. Para que NiceHash Miner funcione correctamente, el servicio de Administración de Instrumentos de Windows debe estar habilitado. Este servicio es necesario para detectar el uso de RAM y la información del driver disponible. Habilite el servicio de Administración de Instrumentos de Windows manualmente e inicie NiceHash Miner.", "Program_WMI_Error_Title": "Error de Administración de Instrumentos de Windows", "Form_Main_Accepted_Speed_Zero": "¡Advertencia! El algoritmo {0} indica 0 acciones aceptadas. Deshabilite este algoritmo en Benchmark / Configuración e informe este problema a support@nicehash.com.", - "NHM_TOS": "Términos de uso de NiceHash Miner. \r\n\r\nNiceHash opera como en servicio intermedio, proporcionando poder de hashing de los propietarios de poder de hashing a los compradores de poder hashing. NiceHash no proporciona directamente su propio poder de hashing. Haremos nuestro mejor para proporcionar el servicio completo estable, seguro y de la característica. No asumimos la responsabilidad de ningún tipo de pérdida de energía de hashing o pérdida de fondos y no tomamos ningún tipo de responsabilidad financiera, material, legal u otras responsabilidades por cualquier problema que surja de usar NiceHash Miner. El servicio NiceHash y sus productos (NiceHash Miner, etc.) aún están en desarrollo, por lo que pueden surgir algunos errores u otros problemas. Trabajaremos duro para solucionar cualquier problema tan pronto como sea posible, agregar nuevas características y mejorar en general nuestro servicio. NiceHash se reserva el derecho de aprovechar los fondos de actividades ilegales sospechosas como la minería con botnets, el lavado de dinero, los intentos de hacking, etc. \r\n\r\nComo usuario de NiceHash Miner, está proporcionando su poder (como hing Vendedor) a los compradores de la energía del hashing en el mercado de la energía del hashing de NiceHash. Usted gana Bitcoins al vender su poder de hashing por cada acción válida que su minero genera y es aceptada por el servicio de NiceHash. En algunos casos, no se envían acciones o no son aceptadas por el servicio NiceHash. Estos casos son raros e incluyen el uso de hardware más lento, software o errores de red o similar. En estos casos (sin acciones generadas y sin aceptadas por el servicio de NiceHash) ninguna recompensa en forma de Bitcoins pule será contabilizada. Los pagos son automáticos y se pagan a la dirección de BTC, utilizada en NiceHash Miner. El horario de pago se puede encontrar en FAQ en nuestro sitio web y está sujeto a cambios. Siempre puede supervisar sus estadísticas en este sitio: https://www.nicehash.com/?p=myminer \r\n\r\nSi tiene alguna pregunta relacionada con estos Términos de uso, sus derechos y obligaciones derivados de estos Términos y/o su uso del servicio NiceHash, o cualquier otro asunto, póngase en contacto con nosotros en support@nicehash.com" + "NHM_TOS": "Términos de uso de NiceHash Miner \r\n\r\nNiceHash opera como en servicio intermedio, proporcionando poder de hashing de los propietarios de poder de hashing a los compradores de poder hashing. NiceHash no proporciona directamente su propio poder de hashing. Haremos nuestro mejor para proporcionar el servicio completo estable, seguro y de la característica. No asumimos la responsabilidad de ningún tipo de pérdida de energía de hashing o pérdida de fondos y no tomamos ningún tipo de responsabilidad financiera, material, legal u otras responsabilidades por cualquier problema que surja de usar NiceHash Miner. El servicio NiceHash y sus productos (NiceHash Miner, etc.) aún están en desarrollo, por lo que pueden surgir algunos errores u otros problemas. Trabajaremos duro para solucionar cualquier problema tan pronto como sea posible, agregar nuevas características y mejorar en general nuestro servicio. NiceHash se reserva el derecho de aprovechar los fondos de actividades ilegales sospechosas como la minería con botnets, el lavado de dinero, los intentos de hacking, etc. \r\n\r\nComo usuario de NiceHash Miner, está proporcionando su poder (como hing Vendedor) a los compradores de la energía del hashing en el mercado de la energía del hashing de NiceHash. Usted gana Bitcoins al vender su poder de hashing por cada acción válida que su minero genera y es aceptada por el servicio de NiceHash. En algunos casos, no se envían acciones o no son aceptadas por el servicio NiceHash. Estos casos son raros e incluyen el uso de hardware más lento, software o errores de red o similar. En estos casos (sin acciones generadas y sin aceptadas por el servicio de NiceHash) ninguna recompensa en forma de Bitcoins pule será contabilizada. Los pagos son automáticos y se pagan a la dirección de BTC, utilizada en NiceHash Miner. El horario de pago se puede encontrar en FAQ en nuestro sitio web y está sujeto a cambios. Siempre puede supervisar sus estadísticas en este sitio: https://www.nicehash.com/?p=myminer \r\n\r\nSi tiene alguna pregunta relacionada con estos Términos de uso, sus derechos y obligaciones derivados de estos Términos y/o su uso del servicio NiceHash, o cualquier otro asunto, póngase en contacto con nosotros en support@nicehash.com" "Form_Settings_General_SwitchProfitabilityThreshold": "Umbral de rentabilidad", "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "El minero no se cambiará si la rentabilidad es menor a el umbral de rentabilidad establecido. El valor es un porcentaje [0 - 1]" From 68de8a5426e7730ba6e31c8667f534e34581cd19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 7 Feb 2017 16:21:40 +0100 Subject: [PATCH 263/366] changes --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 16 ++++++++-------- .../Miners/Parsing/ExtraLaunchParameters.cs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 5426e2c..c603eec 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -542,14 +542,14 @@ static public void QueryAMD() { "speed will not be optimal. Consider upgrading AMD GPU driver. Recommended AMD GPU driver version is 15.7.1."); } else if (AMDDriverVersion.Major == 16 && AMDDriverVersion.Minor >= 150) { if (MinersDownloadManager.IsMinerBinFolder()) { - // TODO why this copy? - string src = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\" + - minerPath.Split('\\')[0] + "\\" + minerPath.Split('\\')[1] + "\\kernel"; - - foreach (var file in Directory.GetFiles(src)) { - string dest = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Temp\\" + System.IO.Path.GetFileName(file); - if (!File.Exists(dest)) File.Copy(file, dest, false); - } + //// TODO why this copy? + //string src = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\" + + // minerPath.Split('\\')[0] + "\\" + minerPath.Split('\\')[1] + "\\kernel"; + + //foreach (var file in Directory.GetFiles(src)) { + // string dest = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Temp\\" + System.IO.Path.GetFileName(file); + // if (!File.Exists(dest)) File.Copy(file, dest, false); + //} } } } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 4ddd36a..8fafbbc 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -22,7 +22,7 @@ public static class ExtraLaunchParameters { new MinerOptionPackage( MinerType.ccminer_CryptoNight, new List() { - new MinerOption("Launch", "-l", "--launch=", "8x20", MinerOptionFlagType.MultiParam, ","), // default is 8x40 + new MinerOption("Launch", "-l", "--launch=", "8x20", MinerOptionFlagType.MultiParam, ","), // default is 8x20 new MinerOption("Bfactor", "", "--bfactor=", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption("Bsleep", "", "--bsleep=", "0", MinerOptionFlagType.MultiParam, ",") // TODO check default }, From 368f42951b45fc21d25c0d02f2f622a1fea0bd4b Mon Sep 17 00:00:00 2001 From: boomtnt46 Date: Tue, 7 Feb 2017 16:43:30 +0100 Subject: [PATCH 264/366] Fix the lang it previously crashed the program. --- NiceHashMiner/langs/es.lang | 682 ++++++++++++++++++------------------ 1 file changed, 341 insertions(+), 341 deletions(-) diff --git a/NiceHashMiner/langs/es.lang b/NiceHashMiner/langs/es.lang index c04b9cd..9093b16 100644 --- a/NiceHashMiner/langs/es.lang +++ b/NiceHashMiner/langs/es.lang @@ -1,345 +1,345 @@ -{ - "Name": "Español", - "ID": 2, - "Entries": { - "Global_Yes": "&Sí", - "Global_No": "&No", - "Global_OK": "&OK", - - "Service_Location": "Servidor", - "Warning_with_Exclamation": "¡Alerta!", - "Error_with_Exclamation": "¡Error!", - "BitcoinAddress": "Dirección Bitcoin", - "WorkerName": "Nombre del minero", - "Rate": "Ratio", - "Day": "Día", - "Quick": "Rápido", - "Standard": "Normal", - "Precise": "Preciso", - "ListView_Enabled": "Habilitado", - "ListView_Group": "Grupo", - "ListView_Device": "Dispositivo", - "ListView_Algorithm": "Algoritmo", - "ListView_Speed": "Velocidad", - - - "Form_Main_visit_us": "Visítanos @ www.nicehash.com", - "Form_Main_check_stats": "¡&Ver mis estadísticas!", - "Form_Main_choose_bitcoin_wallet": "&Ayúdame a escojer una cartera Bitcoin", - "Form_Main_global_rate": "Ratio global", - "Form_Main_balance": "Fondos", - "Form_Main_benchmark": "&Benchmark", - "Form_Main_settings": "&Configuración", - "Form_Main_start": "&Empezar", - "Form_Main_stop": "&Parar", - "Form_Main_new_version_released": "¡IMPORTANTE! La nueva versión v{0} ha\r\nsido liberada. Haga click aquí para descargarla.", - "Form_Main_DemoModeLabel": "¡NiceHash Miner está ejecutandose en modo DEMO!", - "Form_Main_DemoModeTitle": "¿Empezar a minar en modo DEMO?", - "Form_Main_DemoModeMsg": "No has introducido una dirección Bitcoin. NiceHash Miner empezará a minar en modo DEMO. En el modo DEMO, pueder probar al minero y ver cuanto puedes ganar usando tu ordenador. ¿Quieres continuar en modo DEMO?\n\nAVISO: ¡No ganarás nada en modo DEMO!", - - "Form_Main_loadtext_CPU": "Buscando GPU...", - "Form_Main_loadtext_NVIDIA5X": "Buscando dispositivos NVIDIA5.x y NVIDIA6.x...", - "Form_Main_loadtext_NVIDIA3X": "Buscando dispositivos NVIDIA3.x...", - "Form_Main_loadtext_NVIDIA2X": "Buscando dispositivos NVIDIA2.1...", - "Form_Main_loadtext_AMD": "Buscando dispositivos AMD OpenCL...", - "Form_Main_loadtext_SaveConfig": "Guardando configuración...", - "Form_Main_loadtext_CheckLatestVersion": "Buscando la última versión...", - "Form_Main_loadtext_GetNiceHashSMA": "Obteniedo la información NiceHash SMA...", - "Form_Main_loadtext_GetBTCRate": "Obteniendo el ratio de cámbio de Bitcoin...", - "Form_Main_loadtext_GetNiceHashBalance": "Obteniendo fondos en NiceHash...", - "Form_Main_loadtext_SetEnvironmentVariable": "Configurando variables...", - "Form_Main_loadtext_SetWindowsErrorReporting": "Configurando reportes de errores de Windows...", - "Form_Main_loadtext_NVIDIAP0State": "Poniendo tadas las GPUs de NVIDIA al estado P0...", - - "Form_Main_msgbox_CPUMining64bitMsg": "NiceHash Miner solo funciona en sistemas de 64bit (para el minado con CPU). El minado CPU será desactivado.", - "Form_Main_msgbox_CPUMining64CoresMsg": "NiceHash Miner no soporta más de 64 núcleos virtuales. El minado CPU será desactivado.", - "Form_Main_msgbox_CPUMiningLessThreadMsg": "LessThreads es mayor al número de nucleos por CPU. Opción ignorada", - "Form_Main_msgbox_NoInternetTitle": "Comprueba la conexión a Internet", - "Form_Main_msgbox_NoInternetMsg": "NiceHash Miner requiere una conexión a Internet. Asegúrese de que tiene una conexión a internet antes de continuar. ¿Le gustaría continuar?", - "Form_Main_msgbox_InvalidBTCAddressMsg": "¡Dirección Bitcoin inválida!\n\nIntruduzca una dirección válida o pulse Sí para crear una.", - "Form_Main_msgbox_InvalidWorkerNameMsg": "¡Nombre inválido!\n\nPor favor introduzca un nombre válido (Aa-Zz, 0-9, de hasta 7 carácteres).", - "Form_Main_msgbox_NullNiceHashDataMsg": "No se puede obtener los datos de rentabilidad de NiceHash. Si está conectado a Internet, inténtelo más tarde.", - "Form_Main_msgbox_HaveNotBenchmarkedMsg": "No ha hecho ningún benchmark para el dispositivo {0}. Sin hacer un benchmark primero, NiceHashMiner no podrá cambiar al algoritmo más rentable. Para continuar, pulsa Sí. Si le gustaría hacer un benchmark primero, pulse No y haga click en Benchmark.", - "Form_Main_msgbox_buttonBenchmarkWarningMsg": "Solo usuarios avanzados deberían cambiar las configuraciones avanzadas. \r\n\r\nSi {0} se cierra por una mala configuración, puede arreglarlo eliminando el archivo 'config.json' .\r\n\r\n¿Seguro que quiere editar la configuración avanzada?", - "Form_Main_msgbox_buttonBenchmarkRestartWarningTitle": "Reiniciando {0}", - "Form_Main_msgbox_buttonBenchmarkRestartWarningMsg": "{0} se cierrará. Esta nueva ventana de configuración está aún en beta y {0} necesita un reinicio para que haga efecto.", - "Form_Main_msgbox_anti_botnet_msgbox": "NiceHash Miner ha detectado un cambio en la identificación del hardware. Si no has descargado e instalado NiceHash Miner, tu ordenador puede estar en peligro. En tal caso, se recomienda instalar un software antivirus o reinstalar Windows.\r\n\r\n¿Continuar con NiceHash Miner?", - - - "Form_Benchmark_title": "Benchmark", - "Form_Benchmark_buttonStartBenchmark": "Empezar &benchmark", - "Form_Benchmark_buttonStopBenchmark": "&Detener benchmark", - "Form_Benchmark_buttonReset": "&Resetear", - "Form_Benchmark_buttonClose": "&Cerrar", - "Form_Benchmark_buttonCheckProfitability": "Comprobar re&ntabilidad", - "Form_Benchmark_buttonSubmitHardware": "&Enviar info de hardware", - "Form_Benchmark_radioButton_QuickBenchmark": "Rá&pido (puede ser impreciso)", - "Form_Benchmark_radioButton_StandardBenchmark": "Es&tandar", - "Form_Benchmark_radioButton_PreciseBenchmark": "&Preciso (tardará más)", - "Form_Benchmark_listView_WaitSeconds": "Por favor espere unos {0} segundos...", - "Form_Benchmark_listView_WaitMinutes": "Por favor espere unos {0} minutos...", - "Form_Benchmark_listView_WaitForEth": "Corriendo benchmark (2-4 minutos)...", - - - "Form_Loading_label_LoadingText": "Cargando, espere por favor...", - - - "DriverVersionConfirmationDialog_title": "Actualización del driver de AMD recomendada", - "DriverVersionConfirmationDialog_labelWarning": "No esta usando una versión óptima del driver de AMD. La versión más estable para minar es la 15.7.1 .\nLe recomendamos encarecidamente usar esta versión.", - "DriverVersionConfirmationDialog_linkToDriverDownloadPage": "&Enlace a la página de descargas del driver", - "DriverVersionConfirmationDialog_chkBoxDontShowAgain": "&No volver a mostrar esta ventana", - - - "MinerFileNotFoundDialog_title": "¡Archivo no encontrado!", - "MinerFileNotFoundDialog_linkLabelError": "{0}: No se ha encontrado el archivo {1}!\n\nPor favor asegúrate de que el archivo as accesible y que tu antivirus no está bloqueando la aplicación.\nPor favor vea la sección \"My anti-virus is blocking the application\" en la sección de corrección de errores {2}.\n\nSe podría necesitar reinstalar NiceHash Miner", - "MinerFileNotFoundDialog_link": "Enlace", - "MinerFileNotFoundDialog_chkBoxDisableDetection": "&Desactivar la detección para este dispositivo", - - - "SubmitResultDialog_title": "Enviar los resultados del benchmark", - "SubmitResultDialog_labelInstruction": "Por favor seleccione un dispositivo para que se le haga un benchmark y una vez hecho, abrirá automáticamente una \r\nnueva ventana con la calculadora de rentabilidad de NiceHash.", - "SubmitResultDialog_StartBtn": "&Empezar", - "SubmitResultDialog_StopBtn": "&Detener", - "SubmitResultDialog_CloseBtn": "&Cerrar", - "SubmitResultDialog_LabelProgressPercentageCompleted": "¡Completado!", - "SubmitResultDialog_LabelProgressPercentageStopped": "¡Detenido!", - "SubmitResultDialog_LabelProgressPercentageInProgress": "{0}% : Corriendo benchmark {1}.. Espera, por favor..", - - "SubmitResultDialog_NoDeviceCheckedTitle": "Ningún dispositivo seleccionado", - "SubmitResultDialog_NoDeviceCheckedMsg": "Elija al menos un dispositivo para enviar los resultados.", - "SubmitResultDialog_UsePreviousBenchmarkedValueTitle": "¿Usar resultados de un benchmark previo?", - "SubmitResultDialog_UsePreviousBenchmarkedValueMsg": "Podría usar los resultados de un benckmark anterior. Elige Sí para usar los resultados anteriores o No para volver a correr un benchmark.", - - - "Form_Settings_General_DebugConsole": "Consola de depuración", - "Form_Settings_General_AutoStartMining": "Empezar a minar", - "Form_Settings_General_HideMiningWindows": "Ocultar ventanas de minado", - "Form_Settings_General_MinimizeToTray": "Minimizar a la bandeja", - "Form_Settings_General_DisableDetection": "Desactivar detección de {0}", - "Form_Settings_General_AutoScaleBTCValues": "Escalar valores de BTC automáticamente", - "Form_Settings_General_StartMiningWhenIdle": "Empezar a minar si no se usa el PC", - "Form_Settings_General_ShowDriverVersionWarning": "Mostrar la ventana de alerta del driver", - "Form_Settings_General_DisableWindowsErrorReporting": "Desactivar reportes de errores de Windows", - "Form_Settings_General_UseNewSettingsPage": "Usar la nueva página de configuración", - "Form_Settings_General_NVIDIAP0State": "Estado NVIDIA P0", - "Form_Settings_General_LogToFile": "Guardar el registro de eventos", - - "Form_Settings_General_Language": "Lenguaje", - "Form_Settings_General_MinIdleSeconds": "Tiempo mínimo detenido [s]", - "Form_Settings_General_MinerRestartDelayMS": "Retraso reinicio de minero[ms]", - "Form_Settings_General_MinerAPIGraceSeconds": "Periodo de gracia de la API del minero[s]", - "Form_Settings_General_MinerAPIGraceSecondsAMD": "Periodo de gracia de la API del minero(AMD)[s]", - "Form_Settings_General_MinerAPIQueryInterval": "Intervalo API del minero [s]", - "Form_Settings_General_LogMaxFileSize": "Tamaño máximo del registro [bytes]", - - "Form_Settings_General_SwitchMinSecondsFixed": "Cambiar mínimo fijo [s]", - "Form_Settings_General_SwitchMinSecondsDynamic": "Cambiar mínimo variable [s]", - "Form_Settings_General_SwitchMinSecondsAMD": "Cambiar mínimo AMD [s]", - - "Form_Settings_General_ethminerDefaultBlockHeight": "Bloque de Ethminer", - "Form_Settings_General_ethminerAPIPortNVIDIA": "Puerto API de ethminer NVIDIA", - "Form_Settings_General_ethminerAPIPortAMD": "Puerto API de ethminer AMD", - - "Form_Settings_General_BenchmarkTimeLimitsCPU_Group": "(CPU) [s]", - "Form_Settings_General_BenchmarkTimeLimitsNVIDIA_Group": "(NVIDIA) [s]", - "Form_Settings_General_BenchmarkTimeLimitsAMD_Group": "(AMD) [s]", - - "Form_Settings_General_CPU_ForceCPUExtension": "Forzar extensión CPU", - "Form_Settings_General_CPU_LessThreads": "Núcleos", - - "Form_Settings_General_APIBindPort": "Puerto de API", - "Form_Settings_General_UsePassword": "Usar contraseña", - "Form_Settings_General_MinimumProfit": "Benefícios mínimas ($/día)", - "Form_Settings_General_DisabledDevices": "Dispositivos sin usar", - "Form_Settings_General_ExtraLaunchParameters": "Parámetros de inicio", - "Form_Settings_General_DaggerHashimotoGenerateDevice": "Dispositivo que generará el DAG", - "Form_Settings_General_DisableAMDTempControl": "Desactivar control de temperatura de AMD", - - "Form_Settings_Algo_Skip": "Saltar", - "Form_Settings_Algo_BenchmarkSpeed": "Velocidad del benchmark (H/s)", - - "Form_Settings_LessThreadWarningTitle": "¡Número inválido para LessThreads!", - "Form_Settings_LessThreadWarningMsg": "¡Error! Por favor introduce un número valido para LessThreads.", - "Form_Settings_MinimumProfitWarningTitle": "¡Ganancias mínimas inválidas!", - "Form_Settings_MinimumProfitWarningMsg": "¡Error! Por favor introduzca una ganancia mínima que sea un número y sea mayor o igual a 0.", - "Form_Settings_APIBindPortWarningTitle": "¡Número de puerto de la API inválido!", - "Form_Settings_APIBindPortWarningMsg": "¡Error! Por favor introduzca un número de puerto para la API válido.", - "Form_Settings_BenchmarkSpeedWarningTitle": "¡Velocidad de benchmark inválida!", - "Form_Settings_BenchmarkSpeedWarningMsg": "¡Error! Por favor introduce una velocidad de benchmark que sea un número y sea mayor o igual a 0.", - "Form_Settings_DaggerHashimotoGenerateDeviceWarningTitle": "¡Número de dispositivo inválido!", - "Form_Settings_DaggerHashimotoGenerateDeviceWarningMsg": "¡Error! Por favor introduzca un número de dispositivo que sea mayor o igual a 0.", - "Form_Settings_labelCPUDevice": "Usar Saltar para CPUs...", - "Form_Settings_labelNoDevice": "No se ha encontrado dispositivo...", - "Form_Settings_ParseIntTitle": "Error de entrada", - "Form_Settings_ParseIntMsg": "Solo se aceptan números (0-9).", - "Form_Settings_buttonDefaultsText": "&Predeterminados", - "Form_Settings_buttonDefaultsTitle": "¿Poner configuración predeterminada?", - "Form_Settings_buttonDefaultsMsg": "¿Está seguro de que quiere establecer la configuración predeterminada? NiceHash Miner se reiniciará automáticamente.", - "Form_Settings_buttonSaveText": "&Guardar y cerrar", - "Form_Settings_buttonSaveTitle": "¡Configuración guardada!", - "Form_Settings_buttonSaveMsg": "¡Configuración guardada!", - "Form_Settings_buttonCloseNoSaveText": "&Cerrar sin guardar", - "Form_Settings_buttonCloseNoSaveTitle": "¡Alerta!", +{ + "Name": "Español", + "ID": 2, + "Entries": { + "Global_Yes": "&Sí", + "Global_No": "&No", + "Global_OK": "&OK", + + "Service_Location": "Servidor", + "Warning_with_Exclamation": "¡Alerta!", + "Error_with_Exclamation": "¡Error!", + "BitcoinAddress": "Dirección Bitcoin", + "WorkerName": "Nombre del minero", + "Rate": "Ratio", + "Day": "Día", + "Quick": "Rápido", + "Standard": "Normal", + "Precise": "Preciso", + "ListView_Enabled": "Habilitado", + "ListView_Group": "Grupo", + "ListView_Device": "Dispositivo", + "ListView_Algorithm": "Algoritmo", + "ListView_Speed": "Velocidad", + + + "Form_Main_visit_us": "Visítanos @ www.nicehash.com", + "Form_Main_check_stats": "¡&Ver mis estadísticas!", + "Form_Main_choose_bitcoin_wallet": "&Ayúdame a escojer una cartera Bitcoin", + "Form_Main_global_rate": "Ratio global", + "Form_Main_balance": "Fondos", + "Form_Main_benchmark": "&Benchmark", + "Form_Main_settings": "&Configuración", + "Form_Main_start": "&Empezar", + "Form_Main_stop": "&Parar", + "Form_Main_new_version_released": "¡IMPORTANTE! La nueva versión v{0} ha\r\nsido liberada. Haga click aquí para descargarla.", + "Form_Main_DemoModeLabel": "¡NiceHash Miner está ejecutandose en modo DEMO!", + "Form_Main_DemoModeTitle": "¿Empezar a minar en modo DEMO?", + "Form_Main_DemoModeMsg": "No has introducido una dirección Bitcoin. NiceHash Miner empezará a minar en modo DEMO. En el modo DEMO, pueder probar al minero y ver cuanto puedes ganar usando tu ordenador. ¿Quieres continuar en modo DEMO?\n\nAVISO: ¡No ganarás nada en modo DEMO!", + + "Form_Main_loadtext_CPU": "Buscando GPU...", + "Form_Main_loadtext_NVIDIA5X": "Buscando dispositivos NVIDIA5.x y NVIDIA6.x...", + "Form_Main_loadtext_NVIDIA3X": "Buscando dispositivos NVIDIA3.x...", + "Form_Main_loadtext_NVIDIA2X": "Buscando dispositivos NVIDIA2.1...", + "Form_Main_loadtext_AMD": "Buscando dispositivos AMD OpenCL...", + "Form_Main_loadtext_SaveConfig": "Guardando configuración...", + "Form_Main_loadtext_CheckLatestVersion": "Buscando la última versión...", + "Form_Main_loadtext_GetNiceHashSMA": "Obteniedo la información NiceHash SMA...", + "Form_Main_loadtext_GetBTCRate": "Obteniendo el ratio de cámbio de Bitcoin...", + "Form_Main_loadtext_GetNiceHashBalance": "Obteniendo fondos en NiceHash...", + "Form_Main_loadtext_SetEnvironmentVariable": "Configurando variables...", + "Form_Main_loadtext_SetWindowsErrorReporting": "Configurando reportes de errores de Windows...", + "Form_Main_loadtext_NVIDIAP0State": "Poniendo tadas las GPUs de NVIDIA al estado P0...", + + "Form_Main_msgbox_CPUMining64bitMsg": "NiceHash Miner solo funciona en sistemas de 64bit (para el minado con CPU). El minado CPU será desactivado.", + "Form_Main_msgbox_CPUMining64CoresMsg": "NiceHash Miner no soporta más de 64 núcleos virtuales. El minado CPU será desactivado.", + "Form_Main_msgbox_CPUMiningLessThreadMsg": "LessThreads es mayor al número de nucleos por CPU. Opción ignorada", + "Form_Main_msgbox_NoInternetTitle": "Comprueba la conexión a Internet", + "Form_Main_msgbox_NoInternetMsg": "NiceHash Miner requiere una conexión a Internet. Asegúrese de que tiene una conexión a internet antes de continuar. ¿Le gustaría continuar?", + "Form_Main_msgbox_InvalidBTCAddressMsg": "¡Dirección Bitcoin inválida!\n\nIntruduzca una dirección válida o pulse Sí para crear una.", + "Form_Main_msgbox_InvalidWorkerNameMsg": "¡Nombre inválido!\n\nPor favor introduzca un nombre válido (Aa-Zz, 0-9, de hasta 7 carácteres).", + "Form_Main_msgbox_NullNiceHashDataMsg": "No se puede obtener los datos de rentabilidad de NiceHash. Si está conectado a Internet, inténtelo más tarde.", + "Form_Main_msgbox_HaveNotBenchmarkedMsg": "No ha hecho ningún benchmark para el dispositivo {0}. Sin hacer un benchmark primero, NiceHashMiner no podrá cambiar al algoritmo más rentable. Para continuar, pulsa Sí. Si le gustaría hacer un benchmark primero, pulse No y haga click en Benchmark.", + "Form_Main_msgbox_buttonBenchmarkWarningMsg": "Solo usuarios avanzados deberían cambiar las configuraciones avanzadas. \r\n\r\nSi {0} se cierra por una mala configuración, puede arreglarlo eliminando el archivo 'config.json' .\r\n\r\n¿Seguro que quiere editar la configuración avanzada?", + "Form_Main_msgbox_buttonBenchmarkRestartWarningTitle": "Reiniciando {0}", + "Form_Main_msgbox_buttonBenchmarkRestartWarningMsg": "{0} se cierrará. Esta nueva ventana de configuración está aún en beta y {0} necesita un reinicio para que haga efecto.", + "Form_Main_msgbox_anti_botnet_msgbox": "NiceHash Miner ha detectado un cambio en la identificación del hardware. Si no has descargado e instalado NiceHash Miner, tu ordenador puede estar en peligro. En tal caso, se recomienda instalar un software antivirus o reinstalar Windows.\r\n\r\n¿Continuar con NiceHash Miner?", + + + "Form_Benchmark_title": "Benchmark", + "Form_Benchmark_buttonStartBenchmark": "Empezar &benchmark", + "Form_Benchmark_buttonStopBenchmark": "&Detener benchmark", + "Form_Benchmark_buttonReset": "&Resetear", + "Form_Benchmark_buttonClose": "&Cerrar", + "Form_Benchmark_buttonCheckProfitability": "Comprobar re&ntabilidad", + "Form_Benchmark_buttonSubmitHardware": "&Enviar info de hardware", + "Form_Benchmark_radioButton_QuickBenchmark": "Rá&pido (puede ser impreciso)", + "Form_Benchmark_radioButton_StandardBenchmark": "Es&tandar", + "Form_Benchmark_radioButton_PreciseBenchmark": "&Preciso (tardará más)", + "Form_Benchmark_listView_WaitSeconds": "Por favor espere unos {0} segundos...", + "Form_Benchmark_listView_WaitMinutes": "Por favor espere unos {0} minutos...", + "Form_Benchmark_listView_WaitForEth": "Corriendo benchmark (2-4 minutos)...", + + + "Form_Loading_label_LoadingText": "Cargando, espere por favor...", + + + "DriverVersionConfirmationDialog_title": "Actualización del driver de AMD recomendada", + "DriverVersionConfirmationDialog_labelWarning": "No esta usando una versión óptima del driver de AMD. La versión más estable para minar es la 15.7.1 .\nLe recomendamos encarecidamente usar esta versión.", + "DriverVersionConfirmationDialog_linkToDriverDownloadPage": "&Enlace a la página de descargas del driver", + "DriverVersionConfirmationDialog_chkBoxDontShowAgain": "&No volver a mostrar esta ventana", + + + "MinerFileNotFoundDialog_title": "¡Archivo no encontrado!", + "MinerFileNotFoundDialog_linkLabelError": "{0}: No se ha encontrado el archivo {1}!\n\nPor favor asegúrate de que el archivo as accesible y que tu antivirus no está bloqueando la aplicación.\nPor favor vea la sección \"My anti-virus is blocking the application\" en la sección de corrección de errores {2}.\n\nSe podría necesitar reinstalar NiceHash Miner", + "MinerFileNotFoundDialog_link": "Enlace", + "MinerFileNotFoundDialog_chkBoxDisableDetection": "&Desactivar la detección para este dispositivo", + + + "SubmitResultDialog_title": "Enviar los resultados del benchmark", + "SubmitResultDialog_labelInstruction": "Por favor seleccione un dispositivo para que se le haga un benchmark y una vez hecho, abrirá automáticamente una \r\nnueva ventana con la calculadora de rentabilidad de NiceHash.", + "SubmitResultDialog_StartBtn": "&Empezar", + "SubmitResultDialog_StopBtn": "&Detener", + "SubmitResultDialog_CloseBtn": "&Cerrar", + "SubmitResultDialog_LabelProgressPercentageCompleted": "¡Completado!", + "SubmitResultDialog_LabelProgressPercentageStopped": "¡Detenido!", + "SubmitResultDialog_LabelProgressPercentageInProgress": "{0}% : Corriendo benchmark {1}.. Espera, por favor..", + + "SubmitResultDialog_NoDeviceCheckedTitle": "Ningún dispositivo seleccionado", + "SubmitResultDialog_NoDeviceCheckedMsg": "Elija al menos un dispositivo para enviar los resultados.", + "SubmitResultDialog_UsePreviousBenchmarkedValueTitle": "¿Usar resultados de un benchmark previo?", + "SubmitResultDialog_UsePreviousBenchmarkedValueMsg": "Podría usar los resultados de un benckmark anterior. Elige Sí para usar los resultados anteriores o No para volver a correr un benchmark.", + + + "Form_Settings_General_DebugConsole": "Consola de depuración", + "Form_Settings_General_AutoStartMining": "Empezar a minar", + "Form_Settings_General_HideMiningWindows": "Ocultar ventanas de minado", + "Form_Settings_General_MinimizeToTray": "Minimizar a la bandeja", + "Form_Settings_General_DisableDetection": "Desactivar detección de {0}", + "Form_Settings_General_AutoScaleBTCValues": "Escalar valores de BTC automáticamente", + "Form_Settings_General_StartMiningWhenIdle": "Empezar a minar si no se usa el PC", + "Form_Settings_General_ShowDriverVersionWarning": "Mostrar la ventana de alerta del driver", + "Form_Settings_General_DisableWindowsErrorReporting": "Desactivar reportes de errores de Windows", + "Form_Settings_General_UseNewSettingsPage": "Usar la nueva página de configuración", + "Form_Settings_General_NVIDIAP0State": "Estado NVIDIA P0", + "Form_Settings_General_LogToFile": "Guardar el registro de eventos", + + "Form_Settings_General_Language": "Lenguaje", + "Form_Settings_General_MinIdleSeconds": "Tiempo mínimo detenido [s]", + "Form_Settings_General_MinerRestartDelayMS": "Retraso reinicio de minero[ms]", + "Form_Settings_General_MinerAPIGraceSeconds": "Periodo de gracia de la API del minero[s]", + "Form_Settings_General_MinerAPIGraceSecondsAMD": "Periodo de gracia de la API del minero(AMD)[s]", + "Form_Settings_General_MinerAPIQueryInterval": "Intervalo API del minero [s]", + "Form_Settings_General_LogMaxFileSize": "Tamaño máximo del registro [bytes]", + + "Form_Settings_General_SwitchMinSecondsFixed": "Cambiar mínimo fijo [s]", + "Form_Settings_General_SwitchMinSecondsDynamic": "Cambiar mínimo variable [s]", + "Form_Settings_General_SwitchMinSecondsAMD": "Cambiar mínimo AMD [s]", + + "Form_Settings_General_ethminerDefaultBlockHeight": "Bloque de Ethminer", + "Form_Settings_General_ethminerAPIPortNVIDIA": "Puerto API de ethminer NVIDIA", + "Form_Settings_General_ethminerAPIPortAMD": "Puerto API de ethminer AMD", + + "Form_Settings_General_BenchmarkTimeLimitsCPU_Group": "(CPU) [s]", + "Form_Settings_General_BenchmarkTimeLimitsNVIDIA_Group": "(NVIDIA) [s]", + "Form_Settings_General_BenchmarkTimeLimitsAMD_Group": "(AMD) [s]", + + "Form_Settings_General_CPU_ForceCPUExtension": "Forzar extensión CPU", + "Form_Settings_General_CPU_LessThreads": "Núcleos", + + "Form_Settings_General_APIBindPort": "Puerto de API", + "Form_Settings_General_UsePassword": "Usar contraseña", + "Form_Settings_General_MinimumProfit": "Benefícios mínimas ($/día)", + "Form_Settings_General_DisabledDevices": "Dispositivos sin usar", + "Form_Settings_General_ExtraLaunchParameters": "Parámetros de inicio", + "Form_Settings_General_DaggerHashimotoGenerateDevice": "Dispositivo que generará el DAG", + "Form_Settings_General_DisableAMDTempControl": "Desactivar control de temperatura de AMD", + + "Form_Settings_Algo_Skip": "Saltar", + "Form_Settings_Algo_BenchmarkSpeed": "Velocidad del benchmark (H/s)", + + "Form_Settings_LessThreadWarningTitle": "¡Número inválido para LessThreads!", + "Form_Settings_LessThreadWarningMsg": "¡Error! Por favor introduce un número valido para LessThreads.", + "Form_Settings_MinimumProfitWarningTitle": "¡Ganancias mínimas inválidas!", + "Form_Settings_MinimumProfitWarningMsg": "¡Error! Por favor introduzca una ganancia mínima que sea un número y sea mayor o igual a 0.", + "Form_Settings_APIBindPortWarningTitle": "¡Número de puerto de la API inválido!", + "Form_Settings_APIBindPortWarningMsg": "¡Error! Por favor introduzca un número de puerto para la API válido.", + "Form_Settings_BenchmarkSpeedWarningTitle": "¡Velocidad de benchmark inválida!", + "Form_Settings_BenchmarkSpeedWarningMsg": "¡Error! Por favor introduce una velocidad de benchmark que sea un número y sea mayor o igual a 0.", + "Form_Settings_DaggerHashimotoGenerateDeviceWarningTitle": "¡Número de dispositivo inválido!", + "Form_Settings_DaggerHashimotoGenerateDeviceWarningMsg": "¡Error! Por favor introduzca un número de dispositivo que sea mayor o igual a 0.", + "Form_Settings_labelCPUDevice": "Usar Saltar para CPUs...", + "Form_Settings_labelNoDevice": "No se ha encontrado dispositivo...", + "Form_Settings_ParseIntTitle": "Error de entrada", + "Form_Settings_ParseIntMsg": "Solo se aceptan números (0-9).", + "Form_Settings_buttonDefaultsText": "&Predeterminados", + "Form_Settings_buttonDefaultsTitle": "¿Poner configuración predeterminada?", + "Form_Settings_buttonDefaultsMsg": "¿Está seguro de que quiere establecer la configuración predeterminada? NiceHash Miner se reiniciará automáticamente.", + "Form_Settings_buttonSaveText": "&Guardar y cerrar", + "Form_Settings_buttonSaveTitle": "¡Configuración guardada!", + "Form_Settings_buttonSaveMsg": "¡Configuración guardada!", + "Form_Settings_buttonCloseNoSaveText": "&Cerrar sin guardar", + "Form_Settings_buttonCloseNoSaveTitle": "¡Alerta!", "Form_Settings_buttonCloseNoSaveMsg": "¡Alerta! Ha elegido cerrar sin guardar. ¿Seguro que quiere continuar?", - - - "Form_Settings_ToolTip_Explaination": "Explicación", - "Form_Settings_ToolTip_Language": "Cambia el lenguaje predeterminado de NiceHash Miner.", - "Form_Settings_ToolTip_checkBox_DebugConsole": "Si está marcada, abre la consola de depuración.", - "Form_Settings_ToolTip_BitcoinAddress": "Dirección Bitcoin del usuario para minar.", - "Form_Settings_ToolTip_WorkerName": "Para identificar el ordenador del usuario.", - "Form_Settings_ToolTip_ServiceLocation": "Establece la ubicación de minado. Elegir Hong Kong o Japón añadirá latencia extra.", - "Form_Settings_ToolTip_checkBox_AutoStartMining": "Si está marcada, NiceHashMiner empezará a minar al abrirse.", - "Form_Settings_ToolTip_checkBox_HideMiningWindows": "Si está marcada, las consolas de sgminer, ccminer, cpuminer y ethminer se ocultarán.", - "Form_Settings_ToolTip_checkBox_MinimizeToTray": "Si está marcada, NiceHashMiner se minimizará a la bandeja (Tray).", - "Form_Settings_ToolTip_CPU_LessThreads": "Reducir número de hilos usados por cada CPU por LessThreads.", - "Form_Settings_ToolTip_CPU_ForceCPUExtension": "Forzar minero de una extensión en particular.", - - "Form_Settings_ToolTip_SwitchMinSecondsFixed": "Parte fija de tiempo mínimo (en segundos) antes de que el minero cambie de algoritmo.\nEl tiempo total es SwitchMinSecondsFixed + SwitchMinSecondsDynamic.", - "Form_Settings_ToolTip_SwitchMinSecondsDynamic": "Parte aleatoria del tiempo mínimo (en segundos) antes de que el minero cambie de algoritmo.\nEl tiempo total es SwitchMinSecondsFixed + SwitchMinSecondsDynamic.\nEsta parte aleatoria es usada para que no todos los usuarios de NiceHash Miner tengan los mismos patrones de cambio de algoritmo.", - "Form_Settings_ToolTip_SwitchMinSecondsAMD": "Parte fija del tiempo mínimo (en segundos) antes de que el minero cambie de algoritmo (tiempo adicional para targetas gráficas AMD).\nEl tiempo total es SwitchMinSecondsFixed + SwitchMinSecondsAMD + SwitchMinSecondsDynamic.", - - "Form_Settings_ToolTip_MinerAPIQueryInterval": "Intervalo de consulta de API para ccminer, sgminer cpuminer and ethminer.", - "Form_Settings_ToolTip_MinerRestartDelayMS": "Cantidad de tiempo (en milisegundos) que NiceHashMiner esperará antes de reiniciar el minero.", - "Form_Settings_ToolTip_MinerAPIGraceSeconds": "Periodo de tiempo en el que el minero no es forzado a reiniciarse cuando falla una consulta de API.", + + + "Form_Settings_ToolTip_Explaination": "Explicación", + "Form_Settings_ToolTip_Language": "Cambia el lenguaje predeterminado de NiceHash Miner.", + "Form_Settings_ToolTip_checkBox_DebugConsole": "Si está marcada, abre la consola de depuración.", + "Form_Settings_ToolTip_BitcoinAddress": "Dirección Bitcoin del usuario para minar.", + "Form_Settings_ToolTip_WorkerName": "Para identificar el ordenador del usuario.", + "Form_Settings_ToolTip_ServiceLocation": "Establece la ubicación de minado. Elegir Hong Kong o Japón añadirá latencia extra.", + "Form_Settings_ToolTip_checkBox_AutoStartMining": "Si está marcada, NiceHashMiner empezará a minar al abrirse.", + "Form_Settings_ToolTip_checkBox_HideMiningWindows": "Si está marcada, las consolas de sgminer, ccminer, cpuminer y ethminer se ocultarán.", + "Form_Settings_ToolTip_checkBox_MinimizeToTray": "Si está marcada, NiceHashMiner se minimizará a la bandeja (Tray).", + "Form_Settings_ToolTip_CPU_LessThreads": "Reducir número de hilos usados por cada CPU por LessThreads.", + "Form_Settings_ToolTip_CPU_ForceCPUExtension": "Forzar minero de una extensión en particular.", + + "Form_Settings_ToolTip_SwitchMinSecondsFixed": "Parte fija de tiempo mínimo (en segundos) antes de que el minero cambie de algoritmo.\nEl tiempo total es SwitchMinSecondsFixed + SwitchMinSecondsDynamic.", + "Form_Settings_ToolTip_SwitchMinSecondsDynamic": "Parte aleatoria del tiempo mínimo (en segundos) antes de que el minero cambie de algoritmo.\nEl tiempo total es SwitchMinSecondsFixed + SwitchMinSecondsDynamic.\nEsta parte aleatoria es usada para que no todos los usuarios de NiceHash Miner tengan los mismos patrones de cambio de algoritmo.", + "Form_Settings_ToolTip_SwitchMinSecondsAMD": "Parte fija del tiempo mínimo (en segundos) antes de que el minero cambie de algoritmo (tiempo adicional para targetas gráficas AMD).\nEl tiempo total es SwitchMinSecondsFixed + SwitchMinSecondsAMD + SwitchMinSecondsDynamic.", + + "Form_Settings_ToolTip_MinerAPIQueryInterval": "Intervalo de consulta de API para ccminer, sgminer cpuminer and ethminer.", + "Form_Settings_ToolTip_MinerRestartDelayMS": "Cantidad de tiempo (en milisegundos) que NiceHashMiner esperará antes de reiniciar el minero.", + "Form_Settings_ToolTip_MinerAPIGraceSeconds": "Periodo de tiempo en el que el minero no es forzado a reiniciarse cuando falla una consulta de API.", "Form_Settings_ToolTip_MinerAPIGraceSecondsAMD": "Periodo de tiempo en el que el minero AMD no es forzado a reiniciarse cuando falla una consulta de API.", - "Form_Settings_ToolTip_BenchmarkTimeLimits": "Cantidad de tiempo (en segundos) para {0} ejecutar el benchmark de {1}", - - "Form_Settings_ToolTip_checkBox_DisableDetection": "Marcalo si quieres saltar la detección de GPUs de {0}", - "Form_Settings_ToolTip_checkBox_AutoScaleBTCValues": "Marcalo si quieres ver los valores de BTC autoescalar a la escala apropiada.", - "Form_Settings_ToolTip_checkBox_StartMiningWhenIdle": "Empezar a minar cuando el ordenador está inactivo y parar de minar cuando está en uso.", - - "Form_Settings_ToolTip_MinIdleSeconds": "Cuando StartMiningWhenIdle (minar el ordenador está inactivo) está activado, MinIdleSeconds dice \ncuántos segundos tiene el ordenador que estar inactivo antes de minar.", - "Form_Settings_ToolTip_checkBox_LogToFile": "Márcalo para registrar la salida de la consola en un archivo.", - "Form_Settings_ToolTip_LogMaxFileSize": "Establece el tamaño máximo para el archivo de registro (log).", - - "Form_Settings_ToolTip_checkBox_ShowDriverVersionWarning": "Si está marcado, NiceHash Miner dará un aviso si\nla versión óptima del driver está instalada.", - "Form_Settings_ToolTip_checkBox_DisableWindowsErrorReporting": "Si está marcado, si un minero crasheara,NiceHash Miner sería capaz de reabrirlo si no está bloqueado por algún mensaje de error de Windows.\nEs recomendable dejarlo activado para que se pueda minar ininterrunpidamente con unos mineros que no sean completamente estables.", - "Form_Settings_ToolTip_checkBox_UseNewSettingsPage": "Si está marcado, NiceHashMiner usará la nueva página de configuración.", - "Form_Settings_ToolTip_checkBox_NVIDIAP0State": "Si está marcado, NiceHashMiner pondrá todas las GPUs de NVIDIA al estado P0.\nEsto incrementará ligeramente el rendimiento en algunos algoritmos.\nSe necesitan privilegios de administrador.", - "Form_Settings_ToolTip_ethminerAPIPort": "Puerto de la API que será usado por ethminer para {0} GPUs.", - "Form_Settings_ToolTip_ethminerDefaultBlockHeight": "Establece la altura de bloque usado para hacer el benchmark si la llamada a la API falla.", - - "Form_Settings_ToolTip_APIBindPort": "Puerto de la API que será usado por este grupo.", - "Form_Settings_ToolTip_UsePassword": "Usa esta contraseña al iniciar el minero (el usuario es tu dirección Bitcoin y la contraseña es la que pongas aquí). Si está vacío, la contraseña 'x' será usada. ", - "Form_Settings_ToolTip_MinimumProfit": "Si se establece cualquier valor diferente a 0 (USD), NiceHash Miner parará de minar\nsi la rentabilidad cae por debajo del mínimo indicado.", - "Form_Settings_ToolTip_DisabledDevices": "NiceHash Miner ignorará los dispositivos marcados.", - "Form_Settings_ToolTip_ExtraLaunchParameters": "Parámetros de inicio adicionales.", - "Form_Settings_ToolTip_DaggerHashimotoGenerateDevice": "Elige que GPU creará el archivo DAG.\nElije la GPU más rápida posible.", - "Form_Settings_ToolTip_DisableAMDTempControl": "Márcalo si quieres desactivar el control de temperatura predeterminado\npara las GPUs de AMD (excepto para el algoritmo daggerhashimoto).", - - "Form_Settings_ToolTip_AlgoSkip": "Márcalo si quieres saltar y desactivar un algoritmo en particular.\nEl minado y el benchmark serán desactivados para este algoritmo en particular.\nEl cambio automático de algoritmo también ignorará este algoritmo.", - "Form_Settings_ToolTip_AlgoUsePassword": "Usa esta contraseña al iniciar este minero y este algoritmo. Si no se establece, UsePassword del grupo se usará.", - "Form_Settings_ToolTip_AlgoBenchmarkSpeed": "Personalización de los ratios de los algoritmos al cambiar manualmente las velocidades de los benchmark.", - "Form_Settings_ToolTip_AlgoDisabledDevices": "Todos los dispositivos marcados serán ignorados por NiceHash Miner (solo para este algoritmo).", - "Form_Settings_ToolTip_AlgoExtraLaunchParameters": "Parámetros de inicio adicionales al lanzar el minero y este algoritmo.", - "Form_Settings_DisplayCurrency": "Mostrar divisa", - "Form_Settings_ToolTip_DisplayCurrency": "Elija qué divisa mostrar", - "Form_Settings_APIBindPortStart": "Puertos disponibles para la API", - "Form_Settings_ToolTip_APIBindPortStart": "Seleccione el puerto mínimo por el cual la API del minero utilizará para la comunicación", - "Form_Settings_DagGeneration": "Modo de carga del DAG", - "Form_Settings_ToolTip_DagGeneration": "Establece el modo de carga del DAG para ethminers.", - "AlgorithmsListView_Enabled" : "Habilitado", - "AlgorithmsListView_Algorithm" : "Algoritmo", - "AlgorithmsListView_Speed" : "Velocidad", - "AlgorithmsListView_Ratio": "Ratio BTC/GH/Día", - "AlgorithmsListView_Rate": "BTC/Día", - "AlgorithmSettingsControl_IntensityWaringn": "Los valores de intensidad para el algoritmo seleccionado deben estar entre {0} y {1}", - "EnabledUnbenchmarkedAlgorithmsWarning": "No hay benchamark para alguno de los dispositivos seleccionados. Haga click en Sí para realizar un benchmark y empezar a minar, o a No para saltar el benchmark y empezar a minar, o a Cancelar para detenerse.", - "AlgorithmSettingsControl_Label_Intensity": "Intensidad", - "AlgorithmSettingsControl_ToolTip_Intensity": "Establece la intensidad para el algoritmo seleccionado (valores entre 8.0 - 25.0 o 31.0 dependiendo del algoritmo). La intensidad 0 usa la valor predeterminado. OPCIÓN DE USUARIO AVANZADO.", - "AlgorithmsListView_GroupBox": "Algoritmo seleccionado: {0}", - "AlgorithmsListView_GroupBox_NONE": "NADA", - "BenchmarkOptions_Benchmark_Type": "Tipo de benchmark:", - "Form_Main_MiningDevices": "Dispositivos minando {0}:", - "Form_Main_bins_folder_files_missing": "Faltan algunos archivos desde el último inicio. Asegúrese de que su antivirus no bloquea la aplicación. NiceHash Miner podría no funcionar correctamente al faltar algunos archivos. Elige Sí para reinicializar NiceHash Miner e intentar repararlo.", - "Form_Main_MINING_NOT_PROFITABLE": "EL MINADO NO ES RENTABLE ACTUALMENTE.", - "Form_Main_MINING_NO_INTERNET_CONNECTION": "NO MINANDO. NO HAY CONEXIÓN A INTERNET", - "Form_Main_Group_Device_Rates": "Grupo/ratios del dispositivo:", - "FormBenchmark_Benchmark_Step": "Progreso del benchmark ( {0} / {1} )", - "FormBenchmark_Benchmark_Finish_Succes_MsgBox_Msg": "Todos los benchmark se han realizado correctamente", - "FormBenchmark_Benchmark_Finish_Fail_MsgBox_Msg": "Algunos benchmark han fallado. Intente reiniciar los benchamark de tales algoritmos o pulsee No para cancelar y desactivar los algoritmos que han fallado.", - "FormBenchmark_Benchmark_Finish_MsgBox_Title": "Información", - "FormBenchmark_Benchmark_GroupBoxStatus": "Progreso del benchmark:", - "FormBenchmark_Benchmark_All_Selected_Unbenchmarked": "Correr benchmark para los algoritmos seleccionados que no tengan un benchmark hecho", - "FormBenchmark_Benchmark_All_Selected_ReUnbenchmarked": "Correr benchamark a todos los algoritmos seleccionados", - "FormSettings_Tab_General": "General", - "FormSettings_Tab_Advanced": "Avanzado", - "FormSettings_Tab_Devices_Algorithms": "Dispositivos/Algoritmos", - "FormSettings_Tab_General_Group_Main": "Principal:", - "FormSettings_Tab_General_Group_Localization": "Localización:", - "FormSettings_Tab_General_Group_Logging": "Registro:", - "FormSettings_Tab_General_Group_Misc": "Misceláneo:", - "FormSettings_Tab_Advanced_Group_Miners": "Mineros:", - "FormSettings_Tab_Advanced_Group_BenchmarkTimeLimits": "Límites de tiempo de los benchamark:", - "FormSettings_Tab_Devices_Algorithms_Check_SingleProfitability": "Comprobar rentabilidad de uno", - "FormSettings_Tab_Devices_Algorithms_Check_ALLProfitability": "Comprobar rentabilidad de todos", - "MinersDownloadManager_Title_Downloading": "Descargando mineros", - "MinersDownloadManager_Title_Settup": "Configurando mineros", - "MinersDownloadManager_Title_Settup_Unzipping": "Descomprimiendo {0} %", - "DeviceListView_ContextMenu_DisableDevice": "Desactivar dispisitivo", - "DeviceListView_ContextMenu_EnableDevice": "Activar dispositivo", - "DeviceListView_ContextMenu_CopySettings": "Copiar configuración desde (Benchmarks, parámetros de algoritmos, ...)", - "DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Msg" : "¿Está seguro que quiere copiar la configuración de {0} a {1}?", - "DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Title" : "Comfirmar copia de configuración", - "FormSettings_AlgorithmsSettings": "Configuración de los algoritmos para {0} :", - "FormSettings_ButtonProfitSingle": "Selecciona un dispositivo primero", - "Form_Settings_General_BenchmarkTimeLimits_Title": "Límites de tiempo de benchmark", - "Form_Settings_Title": "Configuración", - "FormBenchmark_No_Devices_Selected_Msg": "No hay ningún dispositivo seleccionado, no hay nada a lo que hacer un benchamark", - "FormBenchmark_No_Devices_Selected_Title": "Ningún dispositivo seleccionado", - "FormBenchmark_Nothing_to_Benchmark_Msg": "Opciones acctuales del benchmark ya configuradas. No hay que hacer nada.", - "FormBenchmark_Nothing_to_Benchmark_Title": "No es necesario un benchamark", - "Algorithm_Waiting_Benchmark": "Esperando benchmark", - "BenchmarkSpeedStringNone": "nada", - "BenchmarkRatioRateN_A": "N/A", - "Benchmark_Timedout": "Tiempo de espera agotado", - "Benchmark_Terminated": "Finalizado", - "QueryVideoControllers_NOT_ALL_OK_Msg": "Hemos detectado que un controlador de vídeo no está funcionando correctamente. NiceHash Miner no será capaz de usar este controlador de vídeo para minar. Le recomendamos reiniciar el ordenador o reinstalar los drivers o controladores de vídeo.", - "QueryVideoControllers_NOT_ALL_OK_Msg_Append": "Nombre: {0}, Estado {1}, PNPDeviceID {2}", - "QueryVideoControllers_NOT_ALL_OK_Title": "¡Alerta! El driver de vídeo no está bien", - "Form_Main_Restart_Required_Msg" : "Algunas opciones exigen que NiceHash Miner se reinicie.", - "Form_Main_Restart_Required_Title" : "Aviso de reinicio", - "ComputeDevice_Short_Name": "CDev#{0}", - "ComputeDevice_Short_Name_CPU": "CPU#{0}", - "ComputeDevice_Short_Name_NVIDIA_GPU": "GPU#{0}", - "ComputeDevice_Short_Name_AMD_GPU": "GPU#{0}", - "ComputeDevice_Full_Device_Name": "{0} {1}", - "ComputeDevice_UNKNOWN_VENDOR_REPLACE": "V_ID_{0}", - "ComputeDevice_Get_With_UUID_NONE": "NADA", - "Form_Main_x64_Support_Only": "NiceHash Miner solo soporta sistemas de 64 bit. No se podrá usar NiceHash MIner con un equipo de 32 bit.", - "Compute_Device_Query_Manager_CUDA_Query": "Buscando dispositivos CUDA", - "Compute_Device_Query_Manager_OpenCL_Query": "Buscando dispositivos OpenCL", - "Compute_Device_Query_Manager_AMD_Query": "Comprobando los dispositivos AMD OpenCL", - "Compute_Device_Query_Manager_AMD_Query_Skip": "Saltar comprobación de AMD OpenCL GPUs", - "Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title": "Driver recomendado de NVIDIA", - "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "Hemos detectado que el sistema tiene GPUs de NVIDIA, pero tu driver es más antiguo que {0}. Para que NiceHash Miner funcione correctamente debería actualizar su driver a la versión recomendada {1} o mayor.", - "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART" : " (actual {0})", - "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended":"Hemos detectado que tu driver es más antiguo que {0}{1}. Le recomendamos actualizar a la versión {2} o mayor.", - "NET45_Not_Intsalled_msg": "NiceHash Miner requiere .NET Framework 4.5 o mayor para funcionar correctamente. Por favor reinstala Microsoft .NET Framework 4.5", - "Form_Settings_ToolTip_DisableDefaultOptimizations": "Al marcarse desactiva todas las optimizaciones predeterminadas, hciendo que el minado sea notablemente mas estable pero especialmente lento (especialmente en GPUs de AMD).", - "Form_Settings_Text_DisableDefaultOptimizations": "Desactivar optimizaciones predeterminadas", - "AlgorithmsListView_ContextMenu_DisableAll": "Deshabilitar todos los algoritmos", - "AlgorithmsListView_ContextMenu_EnableAll": "Habilitar todos los algoritmos", - "Form_Main_No_Device_Enabled_For_Mining": "¡Alerta! Ningún dispisitivo se ha establecido para minar, por favor habilite al menos 1 dispositivo para poder minar.", - "Form_Main_3rdParty_Title": "Aviso en el uso de software de terceros", - "Form_Main_3rdParty_Text": "Hemos integrado software de minado de terceros (desarrollado por Claymore) que debería aumentar su verlocidad y estabilidad minando - esto podría resultar en mas beneficios en un menor periodo de tiempo después de la regalía del desarrollador. Aun así, dado que no es de código abierto, no podemos inspeccionarlo de ninguna forma. NiceHash no puede garantizar el uso de ese software y se niega a asumir ninguna responsabilidad por cualquier daño causado - incumplimientos de seguridad, pérdida de datos o fondos, errores de sistema o hardware y otros problemas. Al aceptar esta exención de responsabilidad usted asume toda la responsabilidad de usar estos mineros cerrados de Claymore como son.", - "Form_Main_3rdParty_Button_Agree_Text": "Acepto", - "Form_Main_3rdParty_Button_Refuse_Text": "Rechazo", - "Form_Settings_General_3rdparty_Text": "Usar mineros de terceros", - "Form_Settings_General_3rdparty_ToolTip": "Usa mineros de terceros para una mayor rentabilidad. Úselo bajo su responsabilidad.", - "Form_Settings_General_AllowMultipleInstances_Text": "Habilitar múltiples instancias", - "Form_Settings_General_AllowMultipleInstances_ToolTip": "Cuando está desactivado, NiceHash Miner solo podrá estar ejecutandose una ver al mismo tiempo (cerraá cuaquier instancia adicional).", - "Form_Main_No_Device_Enabled_Algorithms_For_Mining": "No hay ningún algoritmo habilitado para el dispositivo seleccionado. Vaya a Configuración o a Benchmark y habilite al menos un algoritmo.", - "Form_Benchmark_checkbox_StartMiningAfterBenchmark": "Empezar a minar al acabar el Benchmark", - "Form_Main_StartMiningReturnedFalse": "NiceHash Miner no puede empezar a minar. Asegúrese de que ha habilitado al menos un dispisitivo y un algoritmo.", - "Program_WMI_Error_Text": "NiceHash Miner no puede inicializar sus componentes requeridos. Parece que su sistema tiene el servicio de Windows Management Instrumentation deshabilitado. Para que NiceHash Miner funcione correctamente, el servicio de Administración de Instrumentos de Windows debe estar habilitado. Este servicio es necesario para detectar el uso de RAM y la información del driver disponible. Habilite el servicio de Administración de Instrumentos de Windows manualmente e inicie NiceHash Miner.", - "Program_WMI_Error_Title": "Error de Administración de Instrumentos de Windows", - "Form_Main_Accepted_Speed_Zero": "¡Advertencia! El algoritmo {0} indica 0 acciones aceptadas. Deshabilite este algoritmo en Benchmark / Configuración e informe este problema a support@nicehash.com.", - "NHM_TOS": "Términos de uso de NiceHash Miner \r\n\r\nNiceHash opera como en servicio intermedio, proporcionando poder de hashing de los propietarios de poder de hashing a los compradores de poder hashing. NiceHash no proporciona directamente su propio poder de hashing. Haremos nuestro mejor para proporcionar el servicio completo estable, seguro y de la característica. No asumimos la responsabilidad de ningún tipo de pérdida de energía de hashing o pérdida de fondos y no tomamos ningún tipo de responsabilidad financiera, material, legal u otras responsabilidades por cualquier problema que surja de usar NiceHash Miner. El servicio NiceHash y sus productos (NiceHash Miner, etc.) aún están en desarrollo, por lo que pueden surgir algunos errores u otros problemas. Trabajaremos duro para solucionar cualquier problema tan pronto como sea posible, agregar nuevas características y mejorar en general nuestro servicio. NiceHash se reserva el derecho de aprovechar los fondos de actividades ilegales sospechosas como la minería con botnets, el lavado de dinero, los intentos de hacking, etc. \r\n\r\nComo usuario de NiceHash Miner, está proporcionando su poder (como hing Vendedor) a los compradores de la energía del hashing en el mercado de la energía del hashing de NiceHash. Usted gana Bitcoins al vender su poder de hashing por cada acción válida que su minero genera y es aceptada por el servicio de NiceHash. En algunos casos, no se envían acciones o no son aceptadas por el servicio NiceHash. Estos casos son raros e incluyen el uso de hardware más lento, software o errores de red o similar. En estos casos (sin acciones generadas y sin aceptadas por el servicio de NiceHash) ninguna recompensa en forma de Bitcoins pule será contabilizada. Los pagos son automáticos y se pagan a la dirección de BTC, utilizada en NiceHash Miner. El horario de pago se puede encontrar en FAQ en nuestro sitio web y está sujeto a cambios. Siempre puede supervisar sus estadísticas en este sitio: https://www.nicehash.com/?p=myminer \r\n\r\nSi tiene alguna pregunta relacionada con estos Términos de uso, sus derechos y obligaciones derivados de estos Términos y/o su uso del servicio NiceHash, o cualquier otro asunto, póngase en contacto con nosotros en support@nicehash.com" - - "Form_Settings_General_SwitchProfitabilityThreshold": "Umbral de rentabilidad", - "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "El minero no se cambiará si la rentabilidad es menor a el umbral de rentabilidad establecido. El valor es un porcentaje [0 - 1]" - } + "Form_Settings_ToolTip_BenchmarkTimeLimits": "Cantidad de tiempo (en segundos) para {0} ejecutar el benchmark de {1}", + + "Form_Settings_ToolTip_checkBox_DisableDetection": "Marcalo si quieres saltar la detección de GPUs de {0}", + "Form_Settings_ToolTip_checkBox_AutoScaleBTCValues": "Marcalo si quieres ver los valores de BTC autoescalar a la escala apropiada.", + "Form_Settings_ToolTip_checkBox_StartMiningWhenIdle": "Empezar a minar cuando el ordenador está inactivo y parar de minar cuando está en uso.", + + "Form_Settings_ToolTip_MinIdleSeconds": "Cuando StartMiningWhenIdle (minar el ordenador está inactivo) está activado, MinIdleSeconds dice \ncuántos segundos tiene el ordenador que estar inactivo antes de minar.", + "Form_Settings_ToolTip_checkBox_LogToFile": "Márcalo para registrar la salida de la consola en un archivo.", + "Form_Settings_ToolTip_LogMaxFileSize": "Establece el tamaño máximo para el archivo de registro (log).", + + "Form_Settings_ToolTip_checkBox_ShowDriverVersionWarning": "Si está marcado, NiceHash Miner dará un aviso si\nla versión óptima del driver está instalada.", + "Form_Settings_ToolTip_checkBox_DisableWindowsErrorReporting": "Si está marcado, si un minero crasheara,NiceHash Miner sería capaz de reabrirlo si no está bloqueado por algún mensaje de error de Windows.\nEs recomendable dejarlo activado para que se pueda minar ininterrunpidamente con unos mineros que no sean completamente estables.", + "Form_Settings_ToolTip_checkBox_UseNewSettingsPage": "Si está marcado, NiceHashMiner usará la nueva página de configuración.", + "Form_Settings_ToolTip_checkBox_NVIDIAP0State": "Si está marcado, NiceHashMiner pondrá todas las GPUs de NVIDIA al estado P0.\nEsto incrementará ligeramente el rendimiento en algunos algoritmos.\nSe necesitan privilegios de administrador.", + "Form_Settings_ToolTip_ethminerAPIPort": "Puerto de la API que será usado por ethminer para {0} GPUs.", + "Form_Settings_ToolTip_ethminerDefaultBlockHeight": "Establece la altura de bloque usado para hacer el benchmark si la llamada a la API falla.", + + "Form_Settings_ToolTip_APIBindPort": "Puerto de la API que será usado por este grupo.", + "Form_Settings_ToolTip_UsePassword": "Usa esta contraseña al iniciar el minero (el usuario es tu dirección Bitcoin y la contraseña es la que pongas aquí). Si está vacío, la contraseña 'x' será usada. ", + "Form_Settings_ToolTip_MinimumProfit": "Si se establece cualquier valor diferente a 0 (USD), NiceHash Miner parará de minar\nsi la rentabilidad cae por debajo del mínimo indicado.", + "Form_Settings_ToolTip_DisabledDevices": "NiceHash Miner ignorará los dispositivos marcados.", + "Form_Settings_ToolTip_ExtraLaunchParameters": "Parámetros de inicio adicionales.", + "Form_Settings_ToolTip_DaggerHashimotoGenerateDevice": "Elige que GPU creará el archivo DAG.\nElije la GPU más rápida posible.", + "Form_Settings_ToolTip_DisableAMDTempControl": "Márcalo si quieres desactivar el control de temperatura predeterminado\npara las GPUs de AMD (excepto para el algoritmo daggerhashimoto).", + + "Form_Settings_ToolTip_AlgoSkip": "Márcalo si quieres saltar y desactivar un algoritmo en particular.\nEl minado y el benchmark serán desactivados para este algoritmo en particular.\nEl cambio automático de algoritmo también ignorará este algoritmo.", + "Form_Settings_ToolTip_AlgoUsePassword": "Usa esta contraseña al iniciar este minero y este algoritmo. Si no se establece, UsePassword del grupo se usará.", + "Form_Settings_ToolTip_AlgoBenchmarkSpeed": "Personalización de los ratios de los algoritmos al cambiar manualmente las velocidades de los benchmark.", + "Form_Settings_ToolTip_AlgoDisabledDevices": "Todos los dispositivos marcados serán ignorados por NiceHash Miner (solo para este algoritmo).", + "Form_Settings_ToolTip_AlgoExtraLaunchParameters": "Parámetros de inicio adicionales al lanzar el minero y este algoritmo.", + "Form_Settings_DisplayCurrency": "Mostrar divisa", + "Form_Settings_ToolTip_DisplayCurrency": "Elija qué divisa mostrar", + "Form_Settings_APIBindPortStart": "Puertos disponibles para la API", + "Form_Settings_ToolTip_APIBindPortStart": "Seleccione el puerto mínimo por el cual la API del minero utilizará para la comunicación", + "Form_Settings_DagGeneration": "Modo de carga del DAG", + "Form_Settings_ToolTip_DagGeneration": "Establece el modo de carga del DAG para ethminers.", + "AlgorithmsListView_Enabled": "Habilitado", + "AlgorithmsListView_Algorithm": "Algoritmo", + "AlgorithmsListView_Speed": "Velocidad", + "AlgorithmsListView_Ratio": "Ratio BTC/GH/Día", + "AlgorithmsListView_Rate": "BTC/Día", + "AlgorithmSettingsControl_IntensityWaringn": "Los valores de intensidad para el algoritmo seleccionado deben estar entre {0} y {1}", + "EnabledUnbenchmarkedAlgorithmsWarning": "No hay benchamark para alguno de los dispositivos seleccionados. Haga click en Sí para realizar un benchmark y empezar a minar, o a No para saltar el benchmark y empezar a minar, o a Cancelar para detenerse.", + "AlgorithmSettingsControl_Label_Intensity": "Intensidad", + "AlgorithmSettingsControl_ToolTip_Intensity": "Establece la intensidad para el algoritmo seleccionado (valores entre 8.0 - 25.0 o 31.0 dependiendo del algoritmo). La intensidad 0 usa la valor predeterminado. OPCIÓN DE USUARIO AVANZADO.", + "AlgorithmsListView_GroupBox": "Algoritmo seleccionado: {0}", + "AlgorithmsListView_GroupBox_NONE": "NADA", + "BenchmarkOptions_Benchmark_Type": "Tipo de benchmark:", + "Form_Main_MiningDevices": "Dispositivos minando {0}:", + "Form_Main_bins_folder_files_missing": "Faltan algunos archivos desde el último inicio. Asegúrese de que su antivirus no bloquea la aplicación. NiceHash Miner podría no funcionar correctamente al faltar algunos archivos. Elige Sí para reinicializar NiceHash Miner e intentar repararlo.", + "Form_Main_MINING_NOT_PROFITABLE": "EL MINADO NO ES RENTABLE ACTUALMENTE.", + "Form_Main_MINING_NO_INTERNET_CONNECTION": "NO MINANDO. NO HAY CONEXIÓN A INTERNET", + "Form_Main_Group_Device_Rates": "Grupo/ratios del dispositivo:", + "FormBenchmark_Benchmark_Step": "Progreso del benchmark ( {0} / {1} )", + "FormBenchmark_Benchmark_Finish_Succes_MsgBox_Msg": "Todos los benchmark se han realizado correctamente", + "FormBenchmark_Benchmark_Finish_Fail_MsgBox_Msg": "Algunos benchmark han fallado. Intente reiniciar los benchamark de tales algoritmos o pulsee No para cancelar y desactivar los algoritmos que han fallado.", + "FormBenchmark_Benchmark_Finish_MsgBox_Title": "Información", + "FormBenchmark_Benchmark_GroupBoxStatus": "Progreso del benchmark:", + "FormBenchmark_Benchmark_All_Selected_Unbenchmarked": "Correr benchmark para los algoritmos seleccionados que no tengan un benchmark hecho", + "FormBenchmark_Benchmark_All_Selected_ReUnbenchmarked": "Correr benchamark a todos los algoritmos seleccionados", + "FormSettings_Tab_General": "General", + "FormSettings_Tab_Advanced": "Avanzado", + "FormSettings_Tab_Devices_Algorithms": "Dispositivos/Algoritmos", + "FormSettings_Tab_General_Group_Main": "Principal:", + "FormSettings_Tab_General_Group_Localization": "Localización:", + "FormSettings_Tab_General_Group_Logging": "Registro:", + "FormSettings_Tab_General_Group_Misc": "Misceláneo:", + "FormSettings_Tab_Advanced_Group_Miners": "Mineros:", + "FormSettings_Tab_Advanced_Group_BenchmarkTimeLimits": "Límites de tiempo de los benchamark:", + "FormSettings_Tab_Devices_Algorithms_Check_SingleProfitability": "Comprobar rentabilidad de uno", + "FormSettings_Tab_Devices_Algorithms_Check_ALLProfitability": "Comprobar rentabilidad de todos", + "MinersDownloadManager_Title_Downloading": "Descargando mineros", + "MinersDownloadManager_Title_Settup": "Configurando mineros", + "MinersDownloadManager_Title_Settup_Unzipping": "Descomprimiendo {0} %", + "DeviceListView_ContextMenu_DisableDevice": "Desactivar dispisitivo", + "DeviceListView_ContextMenu_EnableDevice": "Activar dispositivo", + "DeviceListView_ContextMenu_CopySettings": "Copiar configuración desde (Benchmarks, parámetros de algoritmos, ...)", + "DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Msg": "¿Está seguro que quiere copiar la configuración de {0} a {1}?", + "DeviceListView_ContextMenu_CopySettings_Confirm_Dialog_Title": "Comfirmar copia de configuración", + "FormSettings_AlgorithmsSettings": "Configuración de los algoritmos para {0} :", + "FormSettings_ButtonProfitSingle": "Selecciona un dispositivo primero", + "Form_Settings_General_BenchmarkTimeLimits_Title": "Límites de tiempo de benchmark", + "Form_Settings_Title": "Configuración", + "FormBenchmark_No_Devices_Selected_Msg": "No hay ningún dispositivo seleccionado, no hay nada a lo que hacer un benchamark", + "FormBenchmark_No_Devices_Selected_Title": "Ningún dispositivo seleccionado", + "FormBenchmark_Nothing_to_Benchmark_Msg": "Opciones acctuales del benchmark ya configuradas. No hay que hacer nada.", + "FormBenchmark_Nothing_to_Benchmark_Title": "No es necesario un benchamark", + "Algorithm_Waiting_Benchmark": "Esperando benchmark", + "BenchmarkSpeedStringNone": "nada", + "BenchmarkRatioRateN_A": "N/A", + "Benchmark_Timedout": "Tiempo de espera agotado", + "Benchmark_Terminated": "Finalizado", + "QueryVideoControllers_NOT_ALL_OK_Msg": "Hemos detectado que un controlador de vídeo no está funcionando correctamente. NiceHash Miner no será capaz de usar este controlador de vídeo para minar. Le recomendamos reiniciar el ordenador o reinstalar los drivers o controladores de vídeo.", + "QueryVideoControllers_NOT_ALL_OK_Msg_Append": "Nombre: {0}, Estado {1}, PNPDeviceID {2}", + "QueryVideoControllers_NOT_ALL_OK_Title": "¡Alerta! El driver de vídeo no está bien", + "Form_Main_Restart_Required_Msg": "Algunas opciones exigen que NiceHash Miner se reinicie.", + "Form_Main_Restart_Required_Title": "Aviso de reinicio", + "ComputeDevice_Short_Name": "CDev#{0}", + "ComputeDevice_Short_Name_CPU": "CPU#{0}", + "ComputeDevice_Short_Name_NVIDIA_GPU": "GPU#{0}", + "ComputeDevice_Short_Name_AMD_GPU": "GPU#{0}", + "ComputeDevice_Full_Device_Name": "{0} {1}", + "ComputeDevice_UNKNOWN_VENDOR_REPLACE": "V_ID_{0}", + "ComputeDevice_Get_With_UUID_NONE": "NADA", + "Form_Main_x64_Support_Only": "NiceHash Miner solo soporta sistemas de 64 bit. No se podrá usar NiceHash MIner con un equipo de 32 bit.", + "Compute_Device_Query_Manager_CUDA_Query": "Buscando dispositivos CUDA", + "Compute_Device_Query_Manager_OpenCL_Query": "Buscando dispositivos OpenCL", + "Compute_Device_Query_Manager_AMD_Query": "Comprobando los dispositivos AMD OpenCL", + "Compute_Device_Query_Manager_AMD_Query_Skip": "Saltar comprobación de AMD OpenCL GPUs", + "Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title": "Driver recomendado de NVIDIA", + "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "Hemos detectado que el sistema tiene GPUs de NVIDIA, pero tu driver es más antiguo que {0}. Para que NiceHash Miner funcione correctamente debería actualizar su driver a la versión recomendada {1} o mayor.", + "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART": " (actual {0})", + "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended": "Hemos detectado que tu driver es más antiguo que {0}{1}. Le recomendamos actualizar a la versión {2} o mayor.", + "NET45_Not_Intsalled_msg": "NiceHash Miner requiere .NET Framework 4.5 o mayor para funcionar correctamente. Por favor reinstala Microsoft .NET Framework 4.5", + "Form_Settings_ToolTip_DisableDefaultOptimizations": "Al marcarse desactiva todas las optimizaciones predeterminadas, hciendo que el minado sea notablemente mas estable pero especialmente lento (especialmente en GPUs de AMD).", + "Form_Settings_Text_DisableDefaultOptimizations": "Desactivar optimizaciones predeterminadas", + "AlgorithmsListView_ContextMenu_DisableAll": "Deshabilitar todos los algoritmos", + "AlgorithmsListView_ContextMenu_EnableAll": "Habilitar todos los algoritmos", + "Form_Main_No_Device_Enabled_For_Mining": "¡Alerta! Ningún dispisitivo se ha establecido para minar, por favor habilite al menos 1 dispositivo para poder minar.", + "Form_Main_3rdParty_Title": "Aviso en el uso de software de terceros", + "Form_Main_3rdParty_Text": "Hemos integrado software de minado de terceros (desarrollado por Claymore) que debería aumentar su verlocidad y estabilidad minando - esto podría resultar en mas beneficios en un menor periodo de tiempo después de la regalía del desarrollador. Aun así, dado que no es de código abierto, no podemos inspeccionarlo de ninguna forma. NiceHash no puede garantizar el uso de ese software y se niega a asumir ninguna responsabilidad por cualquier daño causado - incumplimientos de seguridad, pérdida de datos o fondos, errores de sistema o hardware y otros problemas. Al aceptar esta exención de responsabilidad usted asume toda la responsabilidad de usar estos mineros cerrados de Claymore como son.", + "Form_Main_3rdParty_Button_Agree_Text": "Acepto", + "Form_Main_3rdParty_Button_Refuse_Text": "Rechazo", + "Form_Settings_General_3rdparty_Text": "Usar mineros de terceros", + "Form_Settings_General_3rdparty_ToolTip": "Usa mineros de terceros para una mayor rentabilidad. Úselo bajo su responsabilidad.", + "Form_Settings_General_AllowMultipleInstances_Text": "Habilitar múltiples instancias", + "Form_Settings_General_AllowMultipleInstances_ToolTip": "Cuando está desactivado, NiceHash Miner solo podrá estar ejecutandose una ver al mismo tiempo (cerraá cuaquier instancia adicional).", + "Form_Main_No_Device_Enabled_Algorithms_For_Mining": "No hay ningún algoritmo habilitado para el dispositivo seleccionado. Vaya a Configuración o a Benchmark y habilite al menos un algoritmo.", + "Form_Benchmark_checkbox_StartMiningAfterBenchmark": "Empezar a minar al acabar el Benchmark", + "Form_Main_StartMiningReturnedFalse": "NiceHash Miner no puede empezar a minar. Asegúrese de que ha habilitado al menos un dispisitivo y un algoritmo.", + "Program_WMI_Error_Text": "NiceHash Miner no puede inicializar sus componentes requeridos. Parece que su sistema tiene el servicio de Windows Management Instrumentation deshabilitado. Para que NiceHash Miner funcione correctamente, el servicio de Administración de Instrumentos de Windows debe estar habilitado. Este servicio es necesario para detectar el uso de RAM y la información del driver disponible. Habilite el servicio de Administración de Instrumentos de Windows manualmente e inicie NiceHash Miner.", + "Program_WMI_Error_Title": "Error de Administración de Instrumentos de Windows", + "Form_Main_Accepted_Speed_Zero": "¡Advertencia! El algoritmo {0} indica 0 acciones aceptadas. Deshabilite este algoritmo en Benchmark / Configuración e informe este problema a support@nicehash.com.", + "NHM_TOS": "Términos de uso de NiceHash Miner \r\n\r\nNiceHash opera como en servicio intermedio, proporcionando poder de hashing de los propietarios de poder de hashing a los compradores de poder hashing. NiceHash no proporciona directamente su propio poder de hashing. Haremos nuestro mejor para proporcionar el servicio completo estable, seguro y de la característica. No asumimos la responsabilidad de ningún tipo de pérdida de energía de hashing o pérdida de fondos y no tomamos ningún tipo de responsabilidad financiera, material, legal u otras responsabilidades por cualquier problema que surja de usar NiceHash Miner. El servicio NiceHash y sus productos (NiceHash Miner, etc.) aún están en desarrollo, por lo que pueden surgir algunos errores u otros problemas. Trabajaremos duro para solucionar cualquier problema tan pronto como sea posible, agregar nuevas características y mejorar en general nuestro servicio. NiceHash se reserva el derecho de aprovechar los fondos de actividades ilegales sospechosas como la minería con botnets, el lavado de dinero, los intentos de hacking, etc. \r\n\r\nComo usuario de NiceHash Miner, está proporcionando su poder (como hing Vendedor) a los compradores de la energía del hashing en el mercado de la energía del hashing de NiceHash. Usted gana Bitcoins al vender su poder de hashing por cada acción válida que su minero genera y es aceptada por el servicio de NiceHash. En algunos casos, no se envían acciones o no son aceptadas por el servicio NiceHash. Estos casos son raros e incluyen el uso de hardware más lento, software o errores de red o similar. En estos casos (sin acciones generadas y sin aceptadas por el servicio de NiceHash) ninguna recompensa en forma de Bitcoins pule será contabilizada. Los pagos son automáticos y se pagan a la dirección de BTC, utilizada en NiceHash Miner. El horario de pago se puede encontrar en FAQ en nuestro sitio web y está sujeto a cambios. Siempre puede supervisar sus estadísticas en este sitio: https://www.nicehash.com/?p=myminer \r\n\r\nSi tiene alguna pregunta relacionada con estos Términos de uso, sus derechos y obligaciones derivados de estos Términos y/o su uso del servicio NiceHash, o cualquier otro asunto, póngase en contacto con nosotros en support@nicehash.com", + + "Form_Settings_General_SwitchProfitabilityThreshold": "Umbral de rentabilidad", + "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "El minero no se cambiará si la rentabilidad es menor a el umbral de rentabilidad establecido. El valor es un porcentaje [0 - 1]" + } } From 3df24e4bd530fecb3d09260493e9799bb98a3e93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 7 Feb 2017 17:04:21 +0100 Subject: [PATCH 265/366] remove sgminer kernel copy --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index c603eec..6dc5d38 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -540,17 +540,6 @@ static public void QueryAMD() { deviceDriverOld[vidContrllr.Name] = true; Helpers.ConsolePrint(TAG, "WARNING!!! Old AMD GPU driver detected! All optimized versions disabled, mining " + "speed will not be optimal. Consider upgrading AMD GPU driver. Recommended AMD GPU driver version is 15.7.1."); - } else if (AMDDriverVersion.Major == 16 && AMDDriverVersion.Minor >= 150) { - if (MinersDownloadManager.IsMinerBinFolder()) { - //// TODO why this copy? - //string src = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\" + - // minerPath.Split('\\')[0] + "\\" + minerPath.Split('\\')[1] + "\\kernel"; - - //foreach (var file in Directory.GetFiles(src)) { - // string dest = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Temp\\" + System.IO.Path.GetFileName(file); - // if (!File.Exists(dest)) File.Copy(file, dest, false); - //} - } } } } From 6214e7d445cedfce9d9654fdfb25b98074d9c080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 9 Feb 2017 11:31:49 +0100 Subject: [PATCH 266/366] start minimized no hide windows when hide setting enabled --- NiceHashMiner/Miners/Miner.cs | 9 ++++----- NiceHashMiner/PInvoke/NiceHashProcess.cs | 13 +++++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index af47fff..99af040 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -520,11 +520,10 @@ virtual protected NiceHashProcess _Start() P.StartInfo.Arguments = LastCommandLine; if (IsNeverHideMiningWindow) { P.StartInfo.CreateNoWindow = false; - ////not working - //if (ConfigManager.GeneralConfig.HideMiningWindows) { - // P.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; - // P.StartInfo.UseShellExecute = true; - //} + if (ConfigManager.GeneralConfig.HideMiningWindows) { + P.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; + P.StartInfo.UseShellExecute = true; + } } else { P.StartInfo.CreateNoWindow = ConfigManager.GeneralConfig.HideMiningWindows; } diff --git a/NiceHashMiner/PInvoke/NiceHashProcess.cs b/NiceHashMiner/PInvoke/NiceHashProcess.cs index c55d98b..4ca98d5 100644 --- a/NiceHashMiner/PInvoke/NiceHashProcess.cs +++ b/NiceHashMiner/PInvoke/NiceHashProcess.cs @@ -12,6 +12,8 @@ public class NiceHashProcess private const uint CREATE_NEW_CONSOLE = 0x00000010; private const uint NORMAL_PRIORITY_CLASS = 0x0020; private const uint CREATE_NO_WINDOW = 0x08000000; + private const int STARTF_USESHOWWINDOW = 0x00000001; + private const short SW_SHOWMINNOACTIVE = 7; private const uint INFINITE = 0xFFFFFFFF; private const uint STILL_ACTIVE = 259; @@ -116,10 +118,17 @@ public bool Start() tSec.nLength = Marshal.SizeOf(tSec); uint sflags = 0; - if (StartInfo.CreateNoWindow) + if (StartInfo.CreateNoWindow) { sflags = CREATE_NO_WINDOW; - else + } + else if (StartInfo.WindowStyle == ProcessWindowStyle.Minimized) { + sInfo.dwFlags = STARTF_USESHOWWINDOW; + sInfo.wShowWindow = SW_SHOWMINNOACTIVE; + sflags = CREATE_NEW_CONSOLE; + } + else { sflags = CREATE_NEW_CONSOLE; + } string workDir = null; if (StartInfo.WorkingDirectory != null && StartInfo.WorkingDirectory.Length > 0) From 2ae366a1c7a88e10ba973717dac8a79e2836f489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 9 Feb 2017 17:22:57 +0100 Subject: [PATCH 267/366] added XmrStackCPUMiner support --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 1 - NiceHashMiner/Devices/GroupAlgorithms.cs | 9 + NiceHashMiner/Enums/MinerBaseType.cs | 1 + NiceHashMiner/Ethereum.cs | 3 +- NiceHashMiner/Forms/Form_Benchmark.cs | 6 +- NiceHashMiner/Globals.cs | 29 ++ NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 10 +- .../Miners/ClaymoreCryptoNightMiner.cs | 10 +- .../Miners/Equihash/ClaymoreZcashMiner.cs | 2 +- .../Miners/Equihash/OptiminerZcashMiner.cs | 2 - NiceHashMiner/Miners/Equihash/eqm.cs | 3 - NiceHashMiner/Miners/Equihash/nheqminer.cs | 2 - NiceHashMiner/Miners/Grouping/GroupMiner.cs | 28 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 179 +++++------ NiceHashMiner/Miners/Miner.cs | 24 +- NiceHashMiner/Miners/MinerFactory.cs | 2 + NiceHashMiner/Miners/MinersSettingsManager.cs | 6 +- NiceHashMiner/Miners/MiningSession.cs | 2 +- .../Parsing/ExtraLaunchParametersParser.cs | 23 ++ NiceHashMiner/Miners/XmrStackCPUMiner.cs | 283 ++++++++++++++++++ NiceHashMiner/Miners/ccminer.cs | 4 - NiceHashMiner/Miners/cpuminer.cs | 5 +- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 1 - .../Miners/ethminer/MinerEtherumOCL.cs | 2 - NiceHashMiner/Miners/excavator.cs | 3 - NiceHashMiner/Miners/sgminer.cs | 14 +- NiceHashMiner/NiceHashMiner.csproj | 1 + 27 files changed, 477 insertions(+), 178 deletions(-) create mode 100644 NiceHashMiner/Miners/XmrStackCPUMiner.cs diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 6dc5d38..6b5a610 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -515,7 +515,6 @@ static public void QueryAMD() { // check the driver version bool EnableOptimizedVersion = true; Dictionary deviceDriverOld = new Dictionary(); Dictionary deviceDriverNO_neoscrypt_lyra2re = new Dictionary(); - string minerPath = MinerPaths.sgminer_5_6_0_general; bool ShowWarningDialog = false; foreach (var vidContrllr in AvaliableVideoControllers) { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 1c5b72a..eef2ee0 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -99,6 +99,10 @@ public static Dictionary> CreateForDevice(Compute } } + if (algoSettings.ContainsKey(MinerBaseType.XmrStackCPU)) { + algoSettings[MinerBaseType.XmrStackCPU][0].LessThreads = device.Threads / 2; // use half + } + return algoSettings; } return null; @@ -132,6 +136,11 @@ public static Dictionary> CreateDefaultsForGroup( new List() { new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") } + }, + { MinerBaseType.XmrStackCPU, + new List() { + new Algorithm(MinerBaseType.XmrStackCPU, AlgorithmType.CryptoNight, "cryptonight") + } } }; diff --git a/NiceHashMiner/Enums/MinerBaseType.cs b/NiceHashMiner/Enums/MinerBaseType.cs index 532e257..c420d9d 100644 --- a/NiceHashMiner/Enums/MinerBaseType.cs +++ b/NiceHashMiner/Enums/MinerBaseType.cs @@ -14,6 +14,7 @@ public enum MinerBaseType { ClaymoreAMD, OptiminerAMD, excavator, + XmrStackCPU, END } } diff --git a/NiceHashMiner/Ethereum.cs b/NiceHashMiner/Ethereum.cs index c496bc2..e93547a 100644 --- a/NiceHashMiner/Ethereum.cs +++ b/NiceHashMiner/Ethereum.cs @@ -136,12 +136,11 @@ namespace NiceHashMiner public static class Ethereum { - public static string EtherMinerPath; + //public static string EtherMinerPath; public static string CurrentBlockNum; static Ethereum() { - EtherMinerPath = MinerPaths.ethminer; CurrentBlockNum = ""; } diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index cc5c932..83ed004 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -382,7 +382,7 @@ void StartBenchmark() { void NextBenchmark() { if (_bechmarkCurrentIndex > -1) { StepUpBenchmarkStepProgress(); - } + } ++_bechmarkCurrentIndex; if (_bechmarkCurrentIndex >= _benchmarkAlgorithmsCount) { EndBenchmark(); @@ -405,7 +405,7 @@ void NextBenchmark() { if (_currentDevice != null && _currentAlgorithm != null) { _currentMiner = MinerFactory.CreateMiner(_currentDevice, _currentAlgorithm); - if(_currentDevice.DeviceType == DeviceType.CPU && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { + if (_currentAlgorithm.MinerBaseType == MinerBaseType.cpuminer && _currentAlgorithm.NiceHashID == AlgorithmType.CryptoNight && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { __CPUBenchmarkStatus = new CPUBenchmarkStatus(); _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; } else { @@ -490,7 +490,7 @@ public void OnBenchmarkComplete(bool success, string status) { this.Invoke((MethodInvoker)delegate { _bechmarkedSuccessCount += success ? 1 : 0; bool rebenchSame = false; - if(success && __CPUBenchmarkStatus != null && CPUAlgos.Contains(_currentAlgorithm.NiceHashID)) { + if(success && __CPUBenchmarkStatus != null && CPUAlgos.Contains(_currentAlgorithm.NiceHashID) && _currentAlgorithm.MinerBaseType == MinerBaseType.cpuminer) { if (__CPUBenchmarkStatus.HasAlreadyBenchmarked && __CPUBenchmarkStatus.BenchmarkSpeed > _currentAlgorithm.BenchmarkSpeed) { rebenchSame = false; _currentAlgorithm.BenchmarkSpeed = __CPUBenchmarkStatus.BenchmarkSpeed; diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index 93e673a..8a5e6ad 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -21,5 +21,34 @@ public class Globals { // change this if TOS changes public static int CURRENT_TOS_VER = 1; + + public static string GetLocationURL(AlgorithmType AlgorithmType, string miningLocation, NHMConectionType ConectionType) { + if (Globals.NiceHashData != null && Globals.NiceHashData.ContainsKey(AlgorithmType)) { + string name = Globals.NiceHashData[AlgorithmType].name; + int n_port = Globals.NiceHashData[AlgorithmType].port; + int ssl_port = 30000 + n_port; + + // NHMConectionType.NONE + string prefix = ""; + int port = n_port; + if (NHMConectionType.LOCKED == ConectionType) { + return miningLocation; + } + if (NHMConectionType.STRATUM_TCP == ConectionType) { + prefix = "stratum+tcp://"; + } + if (NHMConectionType.STRATUM_SSL == ConectionType) { + prefix = "stratum+ssl://"; + port = ssl_port; + } + + return prefix + + name + + "." + miningLocation + + ".nicehash.com:" + + port; + } + return ""; + } } } \ No newline at end of file diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index 7bf1e3c..d733ea7 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -20,17 +20,13 @@ public abstract class ClaymoreBaseMiner : Miner { int benchmark_read_count = 0; double benchmark_sum = 0.0d; protected readonly string LOOK_FOR_START; - protected readonly string MinerExeName; const string LOOK_FOR_END = " h/s"; - public ClaymoreBaseMiner(string minerDeviceName, string minerPath, string minerExeName, string look_FOR_START) + public ClaymoreBaseMiner(string minerDeviceName, string look_FOR_START) : base(minerDeviceName) { ConectionType = NHMConectionType.STRATUM_SSL; - Path = minerPath; - MinerExeName = minerExeName; LOOK_FOR_START = look_FOR_START.ToLower(); - WorkingDirectory = minerPath.Replace(minerExeName + ".exe", ""); IsKillAllUsedMinerProcs = true; } @@ -162,8 +158,10 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { || BenchmarkSignalHanged || BenchmarkSignalTimedout || BenchmarkException != null) { + + string imageName = MinerExeName.Replace(".exe", ""); // maybe will have to KILL process - KillClaymoreMinerBase(MinerExeName); + KillClaymoreMinerBase(imageName); if (BenchmarkSignalTimedout) { throw new Exception("Benchmark timedout"); } diff --git a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs index 2066007..9664844 100644 --- a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs @@ -16,7 +16,7 @@ public class ClaymoreCryptoNightMiner : ClaymoreBaseMiner { const string _LOOK_FOR_START = "hashrate ="; public ClaymoreCryptoNightMiner() - : base("ClaymoreCryptoNightMiner", MinerPaths.ClaymoreCryptoNightMiner, "NsGpuCNMiner", _LOOK_FOR_START) { + : base("ClaymoreCryptoNightMiner", _LOOK_FOR_START) { } public override void Start(string url, string btcAdress, string worker) { @@ -30,15 +30,9 @@ public override void Start(string url, string btcAdress, string worker) { protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { // clean old logs CleanAllOldLogs(); - //benchmarkTimeWait = time; - ////benchmarkTimeWait = 180; - ////benchmarkTimeWait = 30; // when debugging // network workaround - var nhAlgorithmData = Globals.NiceHashData[algorithm.NiceHashID]; - string url = "stratum+tcp://" + nhAlgorithmData.name + "." + - Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation] + ".nicehash.com:" + - nhAlgorithmData.port; + string url = Globals.GetLocationURL(algorithm.NiceHashID, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); // demo for benchmark string username = Globals.DemoUser; if (ConfigManager.GeneralConfig.WorkerName.Length > 0) diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 60d62b1..8a599f9 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -18,7 +18,7 @@ public class ClaymoreZcashMiner : ClaymoreBaseMiner { const string _LOOK_FOR_START = "ZEC - Total Speed:"; public ClaymoreZcashMiner() - : base("ClaymoreZcashMiner", MinerPaths.ClaymoreZcashMiner, "ZecMiner64", _LOOK_FOR_START) { + : base("ClaymoreZcashMiner", _LOOK_FOR_START) { } diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs index 5e81808..8d9bbc4 100644 --- a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -18,8 +18,6 @@ public class OptiminerZcashMiner : Miner { public OptiminerZcashMiner() : base("OptiminerZcashMiner") { ConectionType = NHMConectionType.NONE; - Path = MinerPaths.OptiminerZcashMiner; - WorkingDirectory = MinerPaths.OptiminerZcashMiner.Replace("Optiminer.exe", ""); } private class Stratum { diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Equihash/eqm.cs index a7a8212..6ade6a6 100644 --- a/NiceHashMiner/Miners/Equihash/eqm.cs +++ b/NiceHashMiner/Miners/Equihash/eqm.cs @@ -20,9 +20,6 @@ public override void Start(string url, string btcAdress, string worker) { protected override string GetDevicesCommandString() { - Path = this.MiningSetup.MinerPath; - WorkingDirectory = this.MiningSetup.MinerPath.Replace("eqm.exe", ""); - string deviceStringCommand = " "; if (CPU_Setup.IsInit) { diff --git a/NiceHashMiner/Miners/Equihash/nheqminer.cs b/NiceHashMiner/Miners/Equihash/nheqminer.cs index 50fa517..aec7ee9 100644 --- a/NiceHashMiner/Miners/Equihash/nheqminer.cs +++ b/NiceHashMiner/Miners/Equihash/nheqminer.cs @@ -16,8 +16,6 @@ public class nheqminer : nheqBase { public nheqminer() : base("nheqminer") { ConectionType = NHMConectionType.NONE; - Path = MinerPaths.nheqminer; - WorkingDirectory = MinerPaths.nheqminer.Replace("nheqminer.exe", ""); } // CPU aff set from NHM diff --git a/NiceHashMiner/Miners/Grouping/GroupMiner.cs b/NiceHashMiner/Miners/Grouping/GroupMiner.cs index f4c718e..de29c90 100644 --- a/NiceHashMiner/Miners/Grouping/GroupMiner.cs +++ b/NiceHashMiner/Miners/Grouping/GroupMiner.cs @@ -62,32 +62,6 @@ public void End() { CurrentRate = 0; } - private string GetLocationURL(string miningLocation, NHMConectionType ConectionType) { - string name = Globals.NiceHashData[AlgorithmType].name; - int n_port = Globals.NiceHashData[AlgorithmType].port; - int ssl_port = 30000 + n_port; - - // NHMConectionType.NONE - string prefix = ""; - int port = n_port; - if (NHMConectionType.LOCKED == Miner.ConectionType) { - return miningLocation; - } - if (NHMConectionType.STRATUM_TCP == Miner.ConectionType) { - prefix = "stratum+tcp://"; - } - if (NHMConectionType.STRATUM_SSL == Miner.ConectionType) { - prefix = "stratum+ssl://"; - port = ssl_port; - } - - return prefix - + name - + "." + miningLocation - + ".nicehash.com:" - + port; - } - public void Start(string miningLocation, string btcAdress, string worker) { if(Miner.IsRunning) { return; @@ -95,7 +69,7 @@ public void Start(string miningLocation, string btcAdress, string worker) { // Wait before new start System.Threading.Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); - string locationURL = GetLocationURL(miningLocation, Miner.ConectionType); + string locationURL = Globals.GetLocationURL(AlgorithmType, miningLocation, Miner.ConectionType); Miner.Start(locationURL, btcAdress, worker); } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 0df5abb..4cd5c76 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -12,58 +12,63 @@ namespace NiceHashMiner.Miners.Grouping /// public static class MinerPaths { - // root binary folder - private const string _bin = @"bin"; - /// - /// ccminers - /// - public const string ccminer_decred = _bin + @"\ccminer_decred.exe"; - public const string ccminer_nanashi = _bin + @"\ccminer_nanashi.exe"; - public const string ccminer_neoscrypt = _bin + @"\ccminer_neoscrypt.exe"; - public const string ccminer_sp = _bin + @"\ccminer_sp.exe"; - public const string ccminer_tpruvot = _bin + @"\ccminer_tpruvot.exe"; - public const string ccminer_cryptonight = _bin + @"\ccminer_cryptonight.exe"; - /// - /// cpuminers opt new - /// - public const string cpuminer_opt_AVX2_AES = _bin + @"\cpuminer_opt_AVX2_AES.exe"; - public const string cpuminer_opt_AVX2 = _bin + @"\cpuminer_opt_AVX2.exe"; - public const string cpuminer_opt_AVX_AES = _bin + @"\cpuminer_opt_AVX_AES.exe"; - public const string cpuminer_opt_AVX = _bin + @"\cpuminer_opt_AVX.exe"; - public const string cpuminer_opt_AES = _bin + @"\cpuminer_opt_AES.exe"; - public const string cpuminer_opt_SSE2 = _bin + @"\cpuminer_opt_SSE2.exe"; - /// - /// ethminers - /// - public const string ethminer = _bin + @"\ethminer.exe"; - - /// - /// sgminers - /// - public const string sgminer_5_1_0_optimized = _bin + @"\sgminer-5-1-0-optimized\sgminer.exe"; - //public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; - public const string sgminer_5_6_0_general = _bin + @"\sgminer-5-6-0-general\sgminer.exe"; - public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; - public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; - - /// - /// nheqminer - /// - public const string nheqminer = _bin + @"\nheqminer_v0.4b\nheqminer.exe"; - - /// - /// eqm - /// - public const string eqm = _bin + @"\eqm\eqm.exe"; - public const string excavator = _bin + @"\excavator\excavator.exe"; - - public const string NONE = ""; - - // root binary folder - private const string _bin_3rdparty = @"bin_3rdparty"; - public const string ClaymoreZcashMiner = _bin_3rdparty + @"\claymore_zcash\ZecMiner64.exe"; - public const string ClaymoreCryptoNightMiner = _bin_3rdparty + @"\claymore_cryptonight\NsGpuCNMiner.exe"; - public const string OptiminerZcashMiner = _bin_3rdparty + @"\optiminer_zcash_win\Optiminer.exe"; + + public static class Data { + // root binary folder + private const string _bin = @"bin"; + /// + /// ccminers + /// + public const string ccminer_decred = _bin + @"\ccminer_decred.exe"; + public const string ccminer_nanashi = _bin + @"\ccminer_nanashi.exe"; + public const string ccminer_neoscrypt = _bin + @"\ccminer_neoscrypt.exe"; + public const string ccminer_sp = _bin + @"\ccminer_sp.exe"; + public const string ccminer_tpruvot = _bin + @"\ccminer_tpruvot.exe"; + public const string ccminer_cryptonight = _bin + @"\ccminer_cryptonight.exe"; + /// + /// cpuminers opt new + /// + public const string cpuminer_opt_AVX2_AES = _bin + @"\cpuminer_opt_AVX2_AES.exe"; + public const string cpuminer_opt_AVX2 = _bin + @"\cpuminer_opt_AVX2.exe"; + public const string cpuminer_opt_AVX_AES = _bin + @"\cpuminer_opt_AVX_AES.exe"; + public const string cpuminer_opt_AVX = _bin + @"\cpuminer_opt_AVX.exe"; + public const string cpuminer_opt_AES = _bin + @"\cpuminer_opt_AES.exe"; + public const string cpuminer_opt_SSE2 = _bin + @"\cpuminer_opt_SSE2.exe"; + /// + /// ethminers + /// + public const string ethminer = _bin + @"\ethminer.exe"; + + /// + /// sgminers + /// + public const string sgminer_5_1_0_optimized = _bin + @"\sgminer-5-1-0-optimized\sgminer.exe"; + //public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; + public const string sgminer_5_6_0_general = _bin + @"\sgminer-5-6-0-general\sgminer.exe"; + public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; + public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; + + /// + /// nheqminer + /// + public const string nheqminer = _bin + @"\nheqminer_v0.4b\nheqminer.exe"; + + /// + /// eqm + /// + public const string eqm = _bin + @"\eqm\eqm.exe"; + public const string excavator = _bin + @"\excavator\excavator.exe"; + + public const string XmrStackCPUMiner = _bin + @"\xmr-stak-cpu\xmr-stak-cpu.exe"; + + public const string NONE = ""; + + // root binary folder + private const string _bin_3rdparty = @"bin_3rdparty"; + public const string ClaymoreZcashMiner = _bin_3rdparty + @"\claymore_zcash\ZecMiner64.exe"; + public const string ClaymoreCryptoNightMiner = _bin_3rdparty + @"\claymore_cryptonight\NsGpuCNMiner.exe"; + public const string OptiminerZcashMiner = _bin_3rdparty + @"\optiminer_zcash_win\Optiminer.exe"; + } // NEW START //////////////////////////////////////////// @@ -81,24 +86,26 @@ public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoT case MinerBaseType.sgminer: return AMD_GROUP.sgminer_path(algoType, devCodenameAMD, isOptimizedAMD); case MinerBaseType.nheqminer: - return MinerPaths.nheqminer; + return Data.nheqminer; case MinerBaseType.eqm: - return MinerPaths.eqm; + return Data.eqm; case MinerBaseType.ethminer: - return MinerPaths.ethminer; + return Data.ethminer; case MinerBaseType.ClaymoreAMD: return AMD_GROUP.ClaymorePath(algoType); case MinerBaseType.OptiminerAMD: - return MinerPaths.OptiminerZcashMiner; + return Data.OptiminerZcashMiner; case MinerBaseType.excavator: - return MinerPaths.excavator; + return Data.excavator; + case MinerBaseType.XmrStackCPU: + return Data.XmrStackCPUMiner; } - return MinerPaths.NONE; + return Data.NONE; } public static string GetPathFor(ComputeDevice computeDevice, Algorithm algorithm /*, Options: MinerPathsConfig*/) { if (computeDevice == null || algorithm == null) { - return MinerPaths.NONE; + return Data.NONE; } return GetPathFor( @@ -113,7 +120,7 @@ public static string GetPathFor(ComputeDevice computeDevice, Algorithm algorithm public static bool IsValidMinerPath(string minerPath) { // TODO make a list of valid miner paths and check that instead - return minerPath != null && MinerPaths.NONE != minerPath && minerPath != ""; + return minerPath != null && Data.NONE != minerPath && minerPath != ""; } /** @@ -133,32 +140,32 @@ public static List GetAndInitAlgorithmsMinerPaths(List alg static class NVIDIA_GROUPS { public static string ccminer_sm21_or_sm3x(AlgorithmType algorithmType) { if (AlgorithmType.Decred == algorithmType) { - return MinerPaths.ccminer_decred; + return Data.ccminer_decred; } if (AlgorithmType.CryptoNight == algorithmType) { - return MinerPaths.ccminer_cryptonight; + return Data.ccminer_cryptonight; } - return MinerPaths.ccminer_tpruvot; + return Data.ccminer_tpruvot; } public static string ccminer_sm5x_or_sm6x(AlgorithmType algorithmType) { if (AlgorithmType.Decred == algorithmType) { - return MinerPaths.ccminer_decred; + return Data.ccminer_decred; } if (AlgorithmType.NeoScrypt == algorithmType) { - return MinerPaths.ccminer_neoscrypt; + return Data.ccminer_neoscrypt; } if (AlgorithmType.Lyra2RE == algorithmType || AlgorithmType.Lyra2REv2 == algorithmType) { - return MinerPaths.ccminer_nanashi; + return Data.ccminer_nanashi; } if (AlgorithmType.CryptoNight == algorithmType) { - return MinerPaths.ccminer_cryptonight; + return Data.ccminer_cryptonight; } if (AlgorithmType.Lbry == algorithmType) { - return MinerPaths.ccminer_tpruvot; + return Data.ccminer_tpruvot; } - return MinerPaths.ccminer_sp; + return Data.ccminer_sp; } public static string ccminer_path(AlgorithmType algorithmType, DeviceGroupType nvidiaGroup) { // sm21 and sm3x have same settings @@ -170,37 +177,37 @@ public static string ccminer_path(AlgorithmType algorithmType, DeviceGroupType n return NVIDIA_GROUPS.ccminer_sm5x_or_sm6x(algorithmType); } // TODO wrong case? - return MinerPaths.NONE; // should not happen + return Data.NONE; // should not happen } } static class AMD_GROUP { public static string sgminer_path(AlgorithmType type, string gpuCodename, bool isOptimized) { if (AlgorithmType.CryptoNight == type || AlgorithmType.DaggerHashimoto == type) { - return MinerPaths.sgminer_gm; + return Data.sgminer_gm; } if (isOptimized) { if (AlgorithmType.Lyra2REv2 == type) { if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { if (!Helpers.InternalCheckIsWow64()) - return MinerPaths.sgminer_5_6_0_general; + return Data.sgminer_5_6_0_general; - return MinerPaths.sgminer_5_4_0_tweaked; + return Data.sgminer_5_4_0_tweaked; } - return MinerPaths.sgminer_5_1_0_optimized; + return Data.sgminer_5_1_0_optimized; } } - return MinerPaths.sgminer_5_6_0_general; + return Data.sgminer_5_6_0_general; } public static string ClaymorePath(AlgorithmType type) { if(AlgorithmType.Equihash == type) { - return MinerPaths.ClaymoreZcashMiner; + return Data.ClaymoreZcashMiner; } else if(AlgorithmType.CryptoNight == type) { - return MinerPaths.ClaymoreCryptoNightMiner; + return Data.ClaymoreCryptoNightMiner; } - return MinerPaths.NONE; // should not happen + return Data.NONE; // should not happen } } @@ -208,14 +215,14 @@ static class CPU_GROUP { public static string cpu_miner_opt(CPUExtensionType type) { // algorithmType is not needed ATM // algorithmType: AlgorithmType - if (CPUExtensionType.AVX2_AES == type) { return MinerPaths.cpuminer_opt_AVX2_AES; } - if (CPUExtensionType.AVX2 == type) { return MinerPaths.cpuminer_opt_AVX2; } - if (CPUExtensionType.AVX_AES == type) { return MinerPaths.cpuminer_opt_AVX_AES; } - if (CPUExtensionType.AVX == type) { return MinerPaths.cpuminer_opt_AVX; } - if (CPUExtensionType.AES == type) { return MinerPaths.cpuminer_opt_AES; } - if (CPUExtensionType.SSE2 == type) { return MinerPaths.cpuminer_opt_SSE2; } - - return NONE; // should not happen + if (CPUExtensionType.AVX2_AES == type) { return Data.cpuminer_opt_AVX2_AES; } + if (CPUExtensionType.AVX2 == type) { return Data.cpuminer_opt_AVX2; } + if (CPUExtensionType.AVX_AES == type) { return Data.cpuminer_opt_AVX_AES; } + if (CPUExtensionType.AVX == type) { return Data.cpuminer_opt_AVX; } + if (CPUExtensionType.AES == type) { return Data.cpuminer_opt_AES; } + if (CPUExtensionType.SSE2 == type) { return Data.cpuminer_opt_SSE2; } + + return Data.NONE; // should not happen } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 99af040..8b426f6 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -61,12 +61,13 @@ public abstract class Miner { // sgminer/zcash claymore workaround protected bool IsKillAllUsedMinerProcs { get; set; } public bool IsRunning { get; protected set; } - protected string Path; + protected string Path { get; private set; } protected string LastCommandLine { get; set; } // TODO check this protected double PreviousTotalMH; // the defaults will be - protected string WorkingDirectory; + protected string WorkingDirectory { get; private set; } + protected string MinerExeName { get; private set; } protected NiceHashProcess ProcessHandle; private MinerPID_Data _currentPidData; private List _allPidData = new List(); @@ -115,7 +116,6 @@ public Miner(string minerDeviceName) MinerDeviceName = minerDeviceName; - //WorkingDirectory = @"bin\dlls"; WorkingDirectory = ""; IsRunning = false; @@ -137,6 +137,16 @@ public Miner(string minerDeviceName) Helpers.ConsolePrint(MinerTAG(), "MINER DESTROYED"); } + protected void SetWorkingDirAndProgName(string fullPath) { + this.WorkingDirectory = ""; + this.Path = fullPath; + int lastIndex = fullPath.LastIndexOf("\\") + 1; + if(lastIndex > 0) { + this.WorkingDirectory = fullPath.Substring(0, lastIndex); + this.MinerExeName = fullPath.Substring(lastIndex); + } + } + private void SetAPIPort() { if (IsInit) { var minerBase = MiningSetup.MiningPairs[0].Algorithm.MinerBaseType; @@ -160,6 +170,7 @@ virtual public void InitMiningSetup(MiningSetup miningSetup) { MiningSetup = miningSetup; IsInit = MiningSetup.IsInit; SetAPIPort(); + SetWorkingDirAndProgName(MiningSetup.MinerPath); } public void InitBenchmarkSetup(MiningPair benchmarkPair) { @@ -309,17 +320,14 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { BenchmarkHandle.StartInfo.FileName = MiningSetup.MinerPath; - // TODO sgminer quickfix - + // sgminer quickfix if (this is sgminer) { BenchmarkProcessPath = "cmd / " + BenchmarkHandle.StartInfo.FileName; BenchmarkHandle.StartInfo.FileName = "cmd"; } else { BenchmarkProcessPath = BenchmarkHandle.StartInfo.FileName; Helpers.ConsolePrint(MinerTAG(), "Using miner: " + BenchmarkHandle.StartInfo.FileName); - if (BenchmarkAlgorithm.NiceHashID == AlgorithmType.Equihash) { - BenchmarkHandle.StartInfo.WorkingDirectory = WorkingDirectory; - } + BenchmarkHandle.StartInfo.WorkingDirectory = WorkingDirectory; } BenchmarkHandle.StartInfo.Arguments = (string)CommandLine; diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs index daa17b4..ba21512 100644 --- a/NiceHashMiner/Miners/MinerFactory.cs +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -46,6 +46,8 @@ public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmTy return new OptiminerZcashMiner(/*minersConfig*/); case MinerBaseType.excavator: return new excavator(); + case MinerBaseType.XmrStackCPU: + return new XmrStackCPUMiner(); } return null; } diff --git a/NiceHashMiner/Miners/MinersSettingsManager.cs b/NiceHashMiner/Miners/MinersSettingsManager.cs index baf4894..f9cf4ae 100644 --- a/NiceHashMiner/Miners/MinersSettingsManager.cs +++ b/NiceHashMiner/Miners/MinersSettingsManager.cs @@ -79,7 +79,7 @@ public static void InitMinerReservedPortsFile() { foreach (var cpuExt in CPUExtensions) { var algoType = algo.NiceHashID; var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, "", false, cpuExt); - if (path != MinerPaths.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { + if (path != MinerPaths.Data.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { MinerReservedPorts[minerBaseType][path] = new Dictionary>(); } if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { @@ -93,7 +93,7 @@ public static void InitMinerReservedPortsFile() { foreach (var codename in AMDCodenames) { var algoType = algo.NiceHashID; var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, codename, isOptimized, CPUExtensionType.Automatic); - if (path != MinerPaths.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { + if (path != MinerPaths.Data.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { MinerReservedPorts[minerBaseType][path] = new Dictionary>(); } if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { @@ -106,7 +106,7 @@ public static void InitMinerReservedPortsFile() { foreach (var algo in algos) { var algoType = algo.NiceHashID; var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, "", false, CPUExtensionType.Automatic); - if (path != MinerPaths.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { + if (path != MinerPaths.Data.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { MinerReservedPorts[minerBaseType][path] = new Dictionary>(); } if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 0b79fb2..6b66f57 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -170,7 +170,7 @@ public void StopAllMiners() { // delete generated bin files // check for bins files - var dirInfo = new DirectoryInfo(MinerPaths.nheqminer.Replace("nheqminer.exe", "")); + var dirInfo = new DirectoryInfo(MinerPaths.Data.nheqminer.Replace("nheqminer.exe", "")); var DONT_DELETE = "equiw200k9.bin"; var deleteContains = "equiw200k9"; var alwaysDeleteContains2 = "silentarmy_gpu"; diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 8b5beaf..35042c9 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -379,6 +379,29 @@ private static void CheckAndSetCPUPairs(List MiningPairs) { } } + public static int GetThreadsNumber(MiningPair cpuPair) { + var cDev = cpuPair.Device; + var algo = cpuPair.Algorithm; + // extra thread check + if (algo.ExtraLaunchParameters.Contains("--threads=") || algo.ExtraLaunchParameters.Contains("-t")) { + var strings = algo.ExtraLaunchParameters.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + int i = -1; + for (int cur_i = 0; cur_i < strings.Length; ++cur_i) { + if (strings[cur_i] == "--threads=" || strings[cur_i] == "-t") { + i = cur_i + 1; + break; + } + } + if (i > -1 && strings.Length < i) { + int numTr = cDev.Threads; + if (Int32.TryParse(strings[i], out numTr)) { + if (numTr <= cDev.Threads) return numTr; + } + } + } + return GetThreads(cDev.Threads, cpuPair.Algorithm.LessThreads); + } + private static int GetThreads(int Threads, int LessThreads) { if (Threads > LessThreads) { return Threads - LessThreads; diff --git a/NiceHashMiner/Miners/XmrStackCPUMiner.cs b/NiceHashMiner/Miners/XmrStackCPUMiner.cs new file mode 100644 index 0000000..20a1e4f --- /dev/null +++ b/NiceHashMiner/Miners/XmrStackCPUMiner.cs @@ -0,0 +1,283 @@ +using Newtonsoft.Json.Linq; +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; +using NiceHashMiner.Miners.Parsing; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Net.Sockets; +using System.Text; + +namespace NiceHashMiner.Miners { + + public class XmrStackCPUMinerConfig { + public XmrStackCPUMinerConfig(int numberOfthreads, string poolAddr, string wallet, int port) { + this.cpu_thread_num = numberOfthreads; + this.pool_address = poolAddr; + this.wallet_address = wallet; + this.httpd_port = port; + } + + public void Inti_cpu_threads_conf(bool low_power_mode, bool no_prefetch, bool affine_to_cpu) { + cpu_threads_conf = new List(); + for (int i_cpu = 0; i_cpu < cpu_thread_num; ++i_cpu) { + if (affine_to_cpu) { + cpu_threads_conf.Add(JObject.FromObject(new { low_power_mode = low_power_mode, no_prefetch = no_prefetch, affine_to_cpu = i_cpu })); + } else { + cpu_threads_conf.Add(JObject.FromObject(new { low_power_mode = low_power_mode, no_prefetch = no_prefetch, affine_to_cpu = false })); + } + } + } + + /* + * Number of threads. You can configure them below. Cryptonight uses 2MB of memory, so the optimal setting + * here is the size of your L3 cache divided by 2. Intel mid-to-high end desktop processors have 2MB of L3 + * cache per physical core. Low end cpus can have 1.5 or 1 MB while Xeons can have 2, 2.5 or 3MB per core. + */ + public readonly int cpu_thread_num; + + /* + * Thread configuration for each thread. Make sure it matches the number above. + * low_power_mode - This mode will double the cache usage, and double the single thread performance. It will + * consume much less power (as less cores are working), but will max out at around 80-85% of + * the maximum performance. + * + * no_prefetch - This mode meant for large pages only. It will generate an error if running on slow memory + * Some sytems can gain up to extra 5% here, but sometimes it will have no difference or make + * things slower. + * + * affine_to_cpu - This can be either false (no affinity), or the CPU core number. Note that on hyperthreading + * systems it is better to assign threads to physical cores. On Windows this usually means selecting + * even or odd numbered cpu numbers. For Linux it will be usually the lower CPU numbers, so for a 4 + * physical core CPU you should select cpu numbers 0-3. + * + */ + public List cpu_threads_conf; + //"cpu_threads_conf" : [ + // { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : 0 }, + // { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : 1 }, + //], + + /* + * LARGE PAGE SUPPORT + * Lare pages need a properly set up OS. It can be difficult if you are not used to systems administation, + * but the performace results are worth the trouble - you will get around 20% boost. Slow memory mode is + * meant as a backup, you won't get stellar results there. If you are running into trouble, especially + * on Windows, please read the common issues in the README. + * + * By default we will try to allocate large pages. This means you need to "Run As Administrator" on Windows. + * You need to edit your system's group policies to enable locking large pages. Here are the steps from MSDN + * + * 1. On the Start menu, click Run. In the Open box, type gpedit.msc. + * 2. On the Local Group Policy Editor console, expand Computer Configuration, and then expand Windows Settings. + * 3. Expand Security Settings, and then expand Local Policies. + * 4. Select the User Rights Assignment folder. + * 5. The policies will be displayed in the details pane. + * 6. In the pane, double-click Lock pages in memory. + * 7. In the Local Security Setting – Lock pages in memory dialog box, click Add User or Group. + * 8. In the Select Users, Service Accounts, or Groups dialog box, add an account that you will run the miner on + * 9. Reboot for change to take effect. + * + * Windows also tends to fragment memory a lot. If you are running on a system with 4-8GB of RAM you might need + * to switch off all the auto-start applications and reboot to have a large enough chunk of contiguous memory. + * + * On Linux you will need to configure large page support "sudo sysctl -w vm.nr_hugepages=128" and increase your + * ulimit -l. To do do this you need to add following lines to /etc/security/limits.conf - "* soft memlock 262144" + * and "* hard memlock 262144". You can also do it Windows-style and simply run-as-root, but this is NOT + * recommended for security reasons. + * + * Memory locking means that the kernel can't swap out the page to disk - something that is unlikey to happen on a + * command line system that isn't starved of memory. I haven't observed any difference on a CLI Linux system between + * locked and unlocked memory. If that is your setup see option "no_mlck". + */ + + /* + * use_slow_memory defines our behaviour with regards to large pages. There are three possible options here: + * always - Don't even try to use large pages. Always use slow memory. + * warn - We will try to use large pages, but fall back to slow memory if that fails. + * no_mlck - This option is only relevant on Linux, where we can use large pages without locking memory. + * It will never use slow memory, but it won't attempt to mlock + * never - If we fail to allocate large pages we will print an error and exit. + */ + public string use_slow_memory = "warn"; + + /* + * NiceHash mode + * nicehash_nonce - Limit the noce to 3 bytes as required by nicehash. This cuts all the safety margins, and + * if a block isn't found within 30 minutes then you might run into nonce collisions. Number + * of threads in this mode is hard-limited to 32. + */ + public readonly bool nicehash_nonce = true; // + + /* + * pool_address - Pool address should be in the form "pool.supportxmr.com:3333". Only stratum pools are supported. + * wallet_address - Your wallet, or pool login. + * pool_password - Can be empty in most cases or "x". + */ + + public readonly string pool_address; // : "pool.supportxmr.com:3333", + public readonly string wallet_address; + public readonly string pool_password = "x"; + + /* + * Network timeouts. + * Because of the way this client is written it doesn't need to constantly talk (keep-alive) to the server to make + * sure it is there. We detect a buggy / overloaded server by the call timeout. The default values will be ok for + * nearly all cases. If they aren't the pool has most likely overload issues. Low call timeout values are preferable - + * long timeouts mean that we waste hashes on potentially stale jobs. Connection report will tell you how long the + * server usually takes to process our calls. + * + * call_timeout - How long should we wait for a response from the server before we assume it is dead and drop the connection. + * retry_time - How long should we wait before another connection attempt. + * Both values are in seconds. + */ + public int call_timeout = 10; + public int retry_time = 10; + + /* + * Output control. + * Since most people are used to miners printing all the time, that's what we do by default too. This is suboptimal + * really, since you cannot see errors under pages and pages of text and performance stats. Given that we have internal + * performance monitors, there is very little reason to spew out pages of text instead of concise reports. + * Press 'h' (hashrate), 'r' (results) or 'c' (connection) to print reports. + * + * verbose_level - 0 - Don't print anything. + * 1 - Print intro, connection event, disconnect event + * 2 - All of level 1, and new job (block) event if the difficulty is different from the last job + * 3 - All of level 1, and new job (block) event in all cases, result submission event. + * 4 - All of level 3, and automatic hashrate report printing + */ + public int verbose_level = 3; + + /* + * Automatic hashrate report + * + * h_print_time - How often, in seconds, should we print a hashrate report if verbose_level is set to 4. + * This option has no effect if verbose_level is not 4. + */ + public int h_print_time = 60; + + /* + * Built-in web server + * I like checking my hashrate on my phone. Don't you? + * Keep in mind that you will need to set up port forwarding on your router if you want to access it from + * outside of your home network. Ports lower than 1024 on Linux systems will require root. + * + * httpd_port - Port we should listen on. Default, 0, will switch off the server. + */ + public readonly int httpd_port; + + /* + * prefer_ipv4 - IPv6 preference. If the host is available on both IPv4 and IPv6 net, which one should be choose? + * This setting will only be needed in 2020's. No need to worry about it now. + */ + public bool prefer_ipv4 = true; + + } + + public class XmrStackCPUMiner : Miner { + public XmrStackCPUMiner() + : base("XmrStackCPUMiner") { + this.ConectionType = NHMConectionType.NONE; + } + + protected override int GET_MAX_CooldownTimeInMilliseconds() { + return 3600000; // 1hour + } + + private void prepareConfigFile(string pool, string wallet) { + if (this.MiningSetup.MiningPairs.Count > 0) { + try { + int numTr = ExtraLaunchParametersParser.GetThreadsNumber(this.MiningSetup.MiningPairs[0]); + var config = new XmrStackCPUMinerConfig(numTr, pool, wallet, this.APIPort); + config.Inti_cpu_threads_conf(false, false, true); + var confJson = JObject.FromObject(config); + string writeStr = confJson.ToString(); + int start = writeStr.IndexOf("{"); + int end = writeStr.LastIndexOf("}"); + writeStr = writeStr.Substring(start + 1, end - 1); + System.IO.File.WriteAllText(WorkingDirectory + "config.txt", writeStr); + } catch { + } + } + } + + protected override void _Stop(MinerStopType willswitch) { + Stop_cpu_ccminer_sgminer_nheqminer(willswitch); + } + + public override APIData GetSummary() { + string resp; + APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); + + string DataToSend = GetHttpRequestNHMAgentStrin("h"); + + resp = GetAPIData(APIPort, DataToSend); + if (resp == null) { + Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " summary is null"); + _currentMinerReadStatus = MinerAPIReadStatus.NONE; + return null; + } + const string Totals = "Totals:"; + const string Highest = "Highest:"; + int start_i = resp.IndexOf(Totals); + int end_i = resp.IndexOf(Highest); + if (start_i > -1 && end_i > -1) { + string sub_resp = resp.Substring(start_i, end_i); + sub_resp = sub_resp.Replace(Totals, ""); + sub_resp = sub_resp.Replace(Highest, ""); + var strings = sub_resp.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + foreach (var s in strings) { + if (s != "(na)") { + _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + ad.Speed = Helpers.ParseDouble(s); + break; + } + } + } + // check if speed zero + if (ad.Speed == 0) _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; + + return ad; + } + + public override void Start(string url, string btcAdress, string worker) { + if (!IsInit) { + Helpers.ConsolePrint(MinerTAG(), "MiningSetup is not initialized exiting Start()"); + return; + } + string username = GetUsername(btcAdress, worker); + LastCommandLine = "config.txt"; + + prepareConfigFile(url, username); + + ProcessHandle = _Start(); + } + + // doesn't work stubs + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + string url = Globals.GetLocationURL(algorithm.NiceHashID, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); + prepareConfigFile(url, Globals.DemoUser); + return "benchmark_mode config.txt"; + } + + protected override bool BenchmarkParseLine(string outdata) { + if (outdata.Contains("Total:")) { + string toParse = outdata.Substring(outdata.IndexOf("Total:")).Replace("Total:", "").Trim(); + var strings = toParse.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + foreach (var s in strings) { + double lastSpeed = 0; + if (double.TryParse(s, out lastSpeed)) { + BenchmarkAlgorithm.BenchmarkSpeed = Helpers.ParseDouble(s); + return true; + } + } + } + return false; + } + + protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { + CheckOutdata(outdata); + } + } +} diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index a36a9aa..eadfdd0 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -56,8 +56,6 @@ public override void Start(string url, string btcAdress, string worker) LastCommandLine += GetDevicesCommandString(); - Path = MiningSetup.MinerPath; - ProcessHandle = _Start(); } @@ -80,8 +78,6 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti CommandLine += GetDevicesCommandString(); - Path = MiningSetup.MinerPath; - // cryptonight exception helper variables _cryptonightTotalCount = BenchmarkTimeInSeconds / _cryptonightTotalDelim; _cryptonightTotal = 0.0d; diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/cpuminer.cs index 06d84e1..fd3a852 100644 --- a/NiceHashMiner/Miners/cpuminer.cs +++ b/NiceHashMiner/Miners/cpuminer.cs @@ -16,7 +16,7 @@ public cpuminer() } protected override int GET_MAX_CooldownTimeInMilliseconds() { - return 3 * 60 * 1000; // 1 minute max, whole waiting time 75seconds + return 3600000; // 1hour } public override void Start(string url, string btcAdress, string worker) { @@ -25,7 +25,6 @@ public override void Start(string url, string btcAdress, string worker) { return; } string username = GetUsername(btcAdress, worker); - Path = MiningSetup.MinerPath; LastCommandLine = "--algo=" + MiningSetup.MinerName + " --url=" + url + @@ -60,8 +59,6 @@ protected override NiceHashProcess _Start() { #region Decoupled benchmarking routines protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - Path = MiningSetup.MinerPath; - return "--algo=" + algorithm.MinerName + " --benchmark" + ExtraLaunchParametersParser.ParseForMiningSetup( diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index c504a06..c419d21 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -26,7 +26,6 @@ public abstract class MinerEtherum : Miner { public MinerEtherum(string minerDeviceName, string blockString) : base(minerDeviceName) { - Path = Ethereum.EtherMinerPath; _isEthMinerExit = true; CurrentBlockString = blockString; DagGenerationType = ConfigManager.GeneralConfig.EthminerDagGenerationType; diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs index efffeed..2e31cfe 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs @@ -36,8 +36,6 @@ public override void Start(string url, string btcAdress, string worker) { } protected override string GetStartCommandStringPart(string url, string username) { - // set directory - WorkingDirectory = ""; return " --opencl --opencl-platform " + GPUPlatformNumber + " " + ExtraLaunchParametersParser.ParseForMiningSetup( diff --git a/NiceHashMiner/Miners/excavator.cs b/NiceHashMiner/Miners/excavator.cs index 6aed49e..683038e 100644 --- a/NiceHashMiner/Miners/excavator.cs +++ b/NiceHashMiner/Miners/excavator.cs @@ -45,9 +45,6 @@ public override void Start(string url, string btcAdress, string worker) { } protected override string GetDevicesCommandString() { - Path = this.MiningSetup.MinerPath; - WorkingDirectory = this.MiningSetup.MinerPath.Replace("excavator.exe", ""); - string deviceStringCommand = " -cd "; foreach (var nvidia_pair in this.MiningSetup.MiningPairs) { diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 3ba5106..e3ee0a3 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -67,10 +67,7 @@ public override void Start(string url, string btcAdress, string worker) return; } string username = GetUsername(btcAdress, worker); - - Path = MiningSetup.MinerPath; - WorkingDirectory = Path.Replace("sgminer.exe", ""); - + LastCommandLine = " --gpu-platform " + GPUPlatformNumber + " -k " + MiningSetup.MinerName + " --url=" + url + @@ -94,13 +91,8 @@ public override void Start(string url, string btcAdress, string worker) protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { string CommandLine; - Path = "cmd"; - string MinerPath = MiningSetup.MinerPath; - var nhAlgorithmData = Globals.NiceHashData[algorithm.NiceHashID]; - string url = "stratum+tcp://" + nhAlgorithmData.name + "." + - Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation] + ".nicehash.com:" + - nhAlgorithmData.port; + string url = Globals.GetLocationURL(algorithm.NiceHashID, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); // demo for benchmark string username = Globals.DemoUser; @@ -109,7 +101,7 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti username += "." + ConfigManager.GeneralConfig.WorkerName.Trim(); // cd to the cgminer for the process bins - CommandLine = " /C \"cd /d " + MinerPath.Replace("sgminer.exe", "") + " && sgminer.exe " + + CommandLine = " /C \"cd /d " + WorkingDirectory + " && sgminer.exe " + " --gpu-platform " + GPUPlatformNumber + " -k " + algorithm.MinerName + " --url=" + url + diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index bc2e73f..8b1a1ca 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -224,6 +224,7 @@ + From cbcdc74f75ad92785879e327cee183db01137e72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 9 Feb 2017 22:56:34 +0100 Subject: [PATCH 268/366] remove nheqminer AMD support, sort by algorithms first --- NiceHashMiner/Devices/ComputeDevice.cs | 4 +++- NiceHashMiner/Devices/GroupAlgorithms.cs | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 0ac7fab..c8015af 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -221,7 +221,9 @@ public List GetAlgorithmSettings() { } // sort by miner and algo - retAlgos.Sort((a_1, a_2) => (a_1.MinerBaseType - a_2.MinerBaseType) != 0 ? (a_1.MinerBaseType - a_2.MinerBaseType) : (a_1.NiceHashID - a_2.NiceHashID)); + //retAlgos.Sort((a_1, a_2) => (a_1.MinerBaseType - a_2.MinerBaseType) != 0 ? (a_1.MinerBaseType - a_2.MinerBaseType) : (a_1.NiceHashID - a_2.NiceHashID)); + // sort by algo + retAlgos.Sort((a_1, a_2) => (a_1.NiceHashID - a_2.NiceHashID) != 0 ? (a_1.NiceHashID - a_2.NiceHashID) : (a_1.MinerBaseType - a_2.MinerBaseType)); return retAlgos; } diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index eef2ee0..0349987 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -165,11 +165,6 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto") } }, - { MinerBaseType.nheqminer, - new List() { - new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") - } - }, { MinerBaseType.ClaymoreAMD, new List() { new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.CryptoNight, "cryptonight"), /*, { ExtraLaunchParameters: "-a 4" }*/ From 36142f7cbafd517706aceb08d5c982ad31c6f586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 9 Feb 2017 23:06:49 +0100 Subject: [PATCH 269/366] AMD disable by default, remove old sgminer support --- NiceHashMiner/Devices/GroupAlgorithms.cs | 25 ++++++++++++++---- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 29 +++++++++++---------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 0349987..2c5e850 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -46,13 +46,13 @@ public static Dictionary> CreateForDevice(Compute // Ellesmere sgminer workaround, keep this until sgminer is fixed to work with Ellesmere if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris")) && Globals.IsEllesmereSgminerIgnore) { // remove all algos except equi and dagger - var ignoreRemove = new List {AlgorithmType.DaggerHashimoto, AlgorithmType.Equihash, AlgorithmType.CryptoNight, AlgorithmType.Pascal}; + var ignoreRemove = new List { AlgorithmType.DaggerHashimoto, AlgorithmType.Equihash, AlgorithmType.CryptoNight, AlgorithmType.Pascal }; var toRemove = GetKeysForMinerAlgosGroup(algoSettings).FindAll((algoType) => ignoreRemove.IndexOf(algoType) == -1); algoSettings = FilterMinerAlgos(algoSettings, toRemove); // remove all sgminer? // algoSettings = FilterMinerBaseTypes(algoSettings, [MinerBaseType.sgminer]); } else if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris"))) { - algoSettings = FilterMinerAlgos(algoSettings, new List { AlgorithmType.NeoScrypt} ); + algoSettings = FilterMinerAlgos(algoSettings, new List { AlgorithmType.NeoScrypt }); } // check if 3rd party is enabled and allow 3rd party only algos @@ -87,9 +87,24 @@ public static Dictionary> CreateForDevice(Compute algoSettings = FilterMinerAlgos(algoSettings, new List { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2REv2 }); } - // also check for Equihash as nheqminer it needs 2GB GPU - if (device.IsEtherumCapale == false) { - algoSettings = FilterMinerBaseTypes(algoSettings, new List { MinerBaseType.nheqminer }); + // disable by default + { + var minerBases = new List() { MinerBaseType.ethminer, MinerBaseType.OptiminerAMD }; + foreach (var minerKey in minerBases) { + if (algoSettings.ContainsKey(minerKey)) { + foreach (var algo in algoSettings[minerKey]) { + algo.Enabled = false; + } + } + } + if (algoSettings.ContainsKey(MinerBaseType.ClaymoreAMD)) { + foreach (var algo in algoSettings[MinerBaseType.ClaymoreAMD]) { + if (algo.NiceHashID == AlgorithmType.CryptoNight) { + algo.Enabled = false; + break; + } + } + } } } // END AMD case diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 4cd5c76..1ee2196 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -42,10 +42,11 @@ public static class Data { /// /// sgminers /// - public const string sgminer_5_1_0_optimized = _bin + @"\sgminer-5-1-0-optimized\sgminer.exe"; - //public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; + //public const string sgminer_5_1_0_optimized = _bin + @"\sgminer-5-1-0-optimized\sgminer.exe"; + ////public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; + //public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; + public const string sgminer_5_6_0_general = _bin + @"\sgminer-5-6-0-general\sgminer.exe"; - public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; /// @@ -186,17 +187,17 @@ public static string sgminer_path(AlgorithmType type, string gpuCodename, bool i if (AlgorithmType.CryptoNight == type || AlgorithmType.DaggerHashimoto == type) { return Data.sgminer_gm; } - if (isOptimized) { - if (AlgorithmType.Lyra2REv2 == type) { - if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { - if (!Helpers.InternalCheckIsWow64()) - return Data.sgminer_5_6_0_general; - - return Data.sgminer_5_4_0_tweaked; - } - return Data.sgminer_5_1_0_optimized; - } - } + //if (isOptimized) { + // if (AlgorithmType.Lyra2REv2 == type) { + // if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { + // if (!Helpers.InternalCheckIsWow64()) + // return Data.sgminer_5_6_0_general; + + // return Data.sgminer_5_4_0_tweaked; + // } + // return Data.sgminer_5_1_0_optimized; + // } + //} return Data.sgminer_5_6_0_general; } From 128f148742f5305a2729267365a885a31473862d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 13 Feb 2017 21:00:48 +0100 Subject: [PATCH 270/366] updates --- NiceHashMiner/Devices/CPUUtils.cs | 4 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 24 +- NiceHashMiner/Forms/Form_Settings.Designer.cs | 65 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- NiceHashMiner/Utils/BINS_CODEGEN.cs | 64 +- NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs | 2343 ++++++----------- NiceHashMiner/Utils/MinersDownloadManager.cs | 4 +- 7 files changed, 890 insertions(+), 1618 deletions(-) diff --git a/NiceHashMiner/Devices/CPUUtils.cs b/NiceHashMiner/Devices/CPUUtils.cs index b5d3a33..8a91438 100644 --- a/NiceHashMiner/Devices/CPUUtils.cs +++ b/NiceHashMiner/Devices/CPUUtils.cs @@ -14,7 +14,7 @@ public static class CPUUtils { CPUExtensionType.AVX_AES, CPUExtensionType.AVX, CPUExtensionType.AES, - CPUExtensionType.SSE2, + //CPUExtensionType.SSE2, // disabled }; /// @@ -29,7 +29,7 @@ private static bool HasExtensionSupport(CPUExtensionType type) { case CPUExtensionType.AVX_AES: return (CPUID.SupportsAVX() == 1) && (CPUID.SupportsAES() == 1); case CPUExtensionType.AVX: return CPUID.SupportsAVX() == 1; case CPUExtensionType.AES: return CPUID.SupportsAES() == 1; - case CPUExtensionType.SSE2: return CPUID.SupportsSSE2() == 1; + //case CPUExtensionType.SSE2: return CPUID.SupportsSSE2() == 1; default: // CPUExtensionType.Automatic break; } diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 2c5e850..6571c19 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -135,18 +135,18 @@ public static List CreateForDeviceList(ComputeDevice device) { public static Dictionary> CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { if (DeviceGroupType.CPU == deviceGroupType) { return new Dictionary>() { - { MinerBaseType.cpuminer, - new List() { - new Algorithm(MinerBaseType.cpuminer, AlgorithmType.Lyra2RE, "lyra2"), - new Algorithm(MinerBaseType.cpuminer, AlgorithmType.Hodl, "hodl"), - new Algorithm(MinerBaseType.cpuminer, AlgorithmType.CryptoNight, "cryptonight") - } - }, - { MinerBaseType.nheqminer, - new List() { - new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") - } - }, + //{ MinerBaseType.cpuminer, + // new List() { + // new Algorithm(MinerBaseType.cpuminer, AlgorithmType.Lyra2RE, "lyra2"), + // new Algorithm(MinerBaseType.cpuminer, AlgorithmType.Hodl, "hodl"), + // new Algorithm(MinerBaseType.cpuminer, AlgorithmType.CryptoNight, "cryptonight") + // } + //}, + //{ MinerBaseType.nheqminer, + // new List() { + // new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") + // } + //}, { MinerBaseType.eqm, new List() { new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index 0fe5a4a..b88323d 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -93,6 +93,7 @@ private void InitializeComponent() { this.pictureBox_MinerRestartDelayMS = new System.Windows.Forms.PictureBox(); this.pictureBox_APIBindPortStart = new System.Windows.Forms.PictureBox(); this.pictureBox_SwitchMinSecondsDynamic = new System.Windows.Forms.PictureBox(); + this.pictureBox_SwitchProfitabilityThreshold = new System.Windows.Forms.PictureBox(); this.pictureBox_ethminerDefaultBlockHeight = new System.Windows.Forms.PictureBox(); this.pictureBox_DagGeneration = new System.Windows.Forms.PictureBox(); this.pictureBox_CPU0_ForceCPUExtension = new System.Windows.Forms.PictureBox(); @@ -110,7 +111,9 @@ private void InitializeComponent() { this.label_MinerRestartDelayMS = new System.Windows.Forms.Label(); this.textBox_SwitchMinSecondsAMD = new System.Windows.Forms.TextBox(); this.label_APIBindPortStart = new System.Windows.Forms.Label(); + this.textBox_SwitchProfitabilityThreshold = new System.Windows.Forms.TextBox(); this.textBox_ethminerDefaultBlockHeight = new System.Windows.Forms.TextBox(); + this.label_SwitchProfitabilityThreshold = new System.Windows.Forms.Label(); this.label_ethminerDefaultBlockHeight = new System.Windows.Forms.Label(); this.textBox_APIBindPortStart = new System.Windows.Forms.TextBox(); this.label_SwitchMinSecondsAMD = new System.Windows.Forms.Label(); @@ -133,9 +136,6 @@ private void InitializeComponent() { this.buttonSaveClose = new System.Windows.Forms.Button(); this.buttonDefaults = new System.Windows.Forms.Button(); this.buttonCloseNoSave = new System.Windows.Forms.Button(); - this.label_SwitchProfitabilityThreshold = new System.Windows.Forms.Label(); - this.textBox_SwitchProfitabilityThreshold = new System.Windows.Forms.TextBox(); - this.pictureBox_SwitchProfitabilityThreshold = new System.Windows.Forms.PictureBox(); this.tabControlGeneral.SuspendLayout(); this.tabPageGeneral.SuspendLayout(); this.groupBox_Misc.SuspendLayout(); @@ -173,6 +173,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinerRestartDelayMS)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_APIBindPortStart)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_SwitchMinSecondsDynamic)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_SwitchProfitabilityThreshold)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ethminerDefaultBlockHeight)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DagGeneration)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_CPU0_ForceCPUExtension)).BeginInit(); @@ -182,7 +183,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.SuspendLayout(); this.tabPageDevicesAlgos.SuspendLayout(); this.groupBoxAlgorithmSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_SwitchProfitabilityThreshold)).BeginInit(); this.SuspendLayout(); // // toolTip1 @@ -985,6 +985,16 @@ private void InitializeComponent() { this.pictureBox_SwitchMinSecondsDynamic.TabIndex = 385; this.pictureBox_SwitchMinSecondsDynamic.TabStop = false; // + // pictureBox_SwitchProfitabilityThreshold + // + this.pictureBox_SwitchProfitabilityThreshold.Image = global::NiceHashMiner.Properties.Resources.info_black_18; + this.pictureBox_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(560, 104); + this.pictureBox_SwitchProfitabilityThreshold.Name = "pictureBox_SwitchProfitabilityThreshold"; + this.pictureBox_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(18, 18); + this.pictureBox_SwitchProfitabilityThreshold.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox_SwitchProfitabilityThreshold.TabIndex = 385; + this.pictureBox_SwitchProfitabilityThreshold.TabStop = false; + // // pictureBox_ethminerDefaultBlockHeight // this.pictureBox_ethminerDefaultBlockHeight.Image = global::NiceHashMiner.Properties.Resources.info_black_18; @@ -1078,8 +1088,7 @@ private void InitializeComponent() { "AVX2", "AVX_AES", "AVX", - "AES", - "SSE2"}); + "AES"}); this.comboBox_CPU0_ForceCPUExtension.Location = new System.Drawing.Point(9, 165); this.comboBox_CPU0_ForceCPUExtension.Name = "comboBox_CPU0_ForceCPUExtension"; this.comboBox_CPU0_ForceCPUExtension.Size = new System.Drawing.Size(177, 21); @@ -1156,6 +1165,13 @@ private void InitializeComponent() { this.label_APIBindPortStart.TabIndex = 357; this.label_APIBindPortStart.Text = "API Bind port pool start:"; // + // textBox_SwitchProfitabilityThreshold + // + this.textBox_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(406, 123); + this.textBox_SwitchProfitabilityThreshold.Name = "textBox_SwitchProfitabilityThreshold"; + this.textBox_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(172, 20); + this.textBox_SwitchProfitabilityThreshold.TabIndex = 333; + // // textBox_ethminerDefaultBlockHeight // this.textBox_ethminerDefaultBlockHeight.Location = new System.Drawing.Point(209, 121); @@ -1163,6 +1179,15 @@ private void InitializeComponent() { this.textBox_ethminerDefaultBlockHeight.Size = new System.Drawing.Size(172, 20); this.textBox_ethminerDefaultBlockHeight.TabIndex = 333; // + // label_SwitchProfitabilityThreshold + // + this.label_SwitchProfitabilityThreshold.AutoSize = true; + this.label_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(406, 102); + this.label_SwitchProfitabilityThreshold.Name = "label_SwitchProfitabilityThreshold"; + this.label_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(142, 13); + this.label_SwitchProfitabilityThreshold.TabIndex = 361; + this.label_SwitchProfitabilityThreshold.Text = "ethminerDefaultBlockHeight:"; + // // label_ethminerDefaultBlockHeight // this.label_ethminerDefaultBlockHeight.AutoSize = true; @@ -1372,32 +1397,6 @@ private void InitializeComponent() { this.buttonCloseNoSave.UseVisualStyleBackColor = true; this.buttonCloseNoSave.Click += new System.EventHandler(this.buttonCloseNoSave_Click); // - // label_SwitchProfitabilityThreshold - // - this.label_SwitchProfitabilityThreshold.AutoSize = true; - this.label_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(406, 102); - this.label_SwitchProfitabilityThreshold.Name = "label_SwitchProfitabilityThreshold"; - this.label_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(142, 13); - this.label_SwitchProfitabilityThreshold.TabIndex = 361; - this.label_SwitchProfitabilityThreshold.Text = "ethminerDefaultBlockHeight:"; - // - // textBox_SwitchProfitabilityThreshold - // - this.textBox_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(406, 123); - this.textBox_SwitchProfitabilityThreshold.Name = "textBox_SwitchProfitabilityThreshold"; - this.textBox_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(172, 20); - this.textBox_SwitchProfitabilityThreshold.TabIndex = 333; - // - // pictureBox_SwitchProfitabilityThreshold - // - this.pictureBox_SwitchProfitabilityThreshold.Image = global::NiceHashMiner.Properties.Resources.info_black_18; - this.pictureBox_SwitchProfitabilityThreshold.Location = new System.Drawing.Point(560, 104); - this.pictureBox_SwitchProfitabilityThreshold.Name = "pictureBox_SwitchProfitabilityThreshold"; - this.pictureBox_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(18, 18); - this.pictureBox_SwitchProfitabilityThreshold.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox_SwitchProfitabilityThreshold.TabIndex = 385; - this.pictureBox_SwitchProfitabilityThreshold.TabStop = false; - // // Form_Settings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1455,6 +1454,7 @@ private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this.pictureBox_MinerRestartDelayMS)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_APIBindPortStart)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_SwitchMinSecondsDynamic)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_SwitchProfitabilityThreshold)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_ethminerDefaultBlockHeight)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_DagGeneration)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_CPU0_ForceCPUExtension)).EndInit(); @@ -1464,7 +1464,6 @@ private void InitializeComponent() { this.groupBoxBenchmarkTimeLimits.ResumeLayout(false); this.tabPageDevicesAlgos.ResumeLayout(false); this.groupBoxAlgorithmSettings.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox_SwitchProfitabilityThreshold)).EndInit(); this.ResumeLayout(false); } diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 7f3137d..f987b5d 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.4.5")] -[assembly: AssemblyFileVersion("1.7.4.5")] +[assembly: AssemblyVersion("1.7.4.6")] +[assembly: AssemblyFileVersion("1.7.4.6")] diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index 1e21024..aa01b7c 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -2,20 +2,13 @@ namespace NiceHashMiner.Utils { public static class Bins_Data { #region CODE_GEN STUFF // listFiles.py - public static string[] ALL_FILES_BINS = { -@"\ccminer.exe", + public static string[] ALL_FILES_BINS = {@"\ccminer.exe", @"\ccminer_cryptonight.exe", @"\ccminer_decred.exe", @"\ccminer_nanashi.exe", @"\ccminer_neoscrypt.exe", @"\ccminer_sp.exe", @"\ccminer_tpruvot.exe", -@"\cpuminer_opt_AES.exe", -@"\cpuminer_opt_AVX.exe", -@"\cpuminer_opt_AVX2.exe", -@"\cpuminer_opt_AVX2_AES.exe", -@"\cpuminer_opt_AVX_AES.exe", -@"\cpuminer_opt_SSE2.exe", @"\cudart32_80.dll", @"\cudart64_80.dll", @"\ethminer.exe", @@ -52,60 +45,9 @@ public static class Bins_Data { @"\nheqminer_v0.4b\msvcp120.dll", @"\nheqminer_v0.4b\msvcr120.dll", @"\nheqminer_v0.4b\nheqminer.exe", -@"\sgminer-5-1-0-optimized\darkcoin-modHawaiigw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modPitcairngw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modTahitigw64l4.bin", -@"\sgminer-5-1-0-optimized\darkcoin-modTongagw64l4.bin", -@"\sgminer-5-1-0-optimized\libcurl-4.dll", -@"\sgminer-5-1-0-optimized\libcurl.dll", -@"\sgminer-5-1-0-optimized\libeay32.dll", -@"\sgminer-5-1-0-optimized\libgcc_s_dw2-1.dll", -@"\sgminer-5-1-0-optimized\libidn-11.dll", -@"\sgminer-5-1-0-optimized\libpdcurses.dll", -@"\sgminer-5-1-0-optimized\Lyra2REv2Hawaiigw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Pitcairngw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Tahitigw64l4.bin", -@"\sgminer-5-1-0-optimized\Lyra2REv2Tongagw64l4.bin", -@"\sgminer-5-1-0-optimized\pthreadGC2.dll", -@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTahitigw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTahitigw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTongagw256l4ku0.bin", -@"\sgminer-5-1-0-optimized\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-1-0-optimized\sgminer.exe", -@"\sgminer-5-1-0-optimized\ssleay32.dll", -@"\sgminer-5-1-0-optimized\zlib1.dll", -@"\sgminer-5-4-0-tweaked\darkcoin-modBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\darkcoin-modTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Bonairegw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Fijigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Hawaiigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Pitcairngw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Tahitigw64l4.bin", -@"\sgminer-5-4-0-tweaked\lyra2rev2Tongagw64l4.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\quarkcoinTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinBonairegw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinFijigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinHawaiigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinPitcairngw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinTahitigw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\qubitcoinTongagw64l4ku0.bin", -@"\sgminer-5-4-0-tweaked\sgminer.exe", @"\sgminer-5-6-0-general\sgminer.exe", -@"\sgminer-gm\sgminer.exe", +@"\sgminer-gm\sgminer.exe", +@"\xmr-stak-cpu\xmr-stak-cpu.exe", }; #endregion //CODE_GEN STUFF // listFiles.py } diff --git a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs index 567e04c..decd2ba 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs @@ -1,1506 +1,837 @@ - -namespace NiceHashMiner.Utils { - public static class Bins_Data_3rd { - #region CODE_GEN STUFF // listFiles.py - public static string[] ALL_FILES_BINS = { - - -@"\claymore_cryptonight\Data.bin", - -@"\claymore_cryptonight\msvcr110.dll", - -@"\claymore_cryptonight\NsGpuCNMiner.exe", - -@"\claymore_cryptonight\Remote manager\EthMan.exe", - -@"\claymore_zcash\Data.bin", - -@"\claymore_zcash\Data1a1.bin", - -@"\claymore_zcash\Data1b1.bin", - -@"\claymore_zcash\Data1b2.bin", - -@"\claymore_zcash\Data1c1.bin", - -@"\claymore_zcash\Data1d1.bin", - -@"\claymore_zcash\Data1f1.bin", - -@"\claymore_zcash\Data2.bin", - -@"\claymore_zcash\msvcr110.dll", - -@"\claymore_zcash\ZecMiner64.exe", - -@"\claymore_zcash\Remote manager\EthMan.exe", - -@"\optiminer_zcash_win\Optiminer.exe", - -@"\optiminer_zcash_win\bin\asm.bin", - -@"\optiminer_zcash_win\bin\base.bin", - -@"\optiminer_zcash_win\bin\round1.bin", - -@"\optiminer_zcash_win\bin\round2.bin", - -@"\optiminer_zcash_win\bin\round3.bin", - -@"\optiminer_zcash_win\bin\round4.bin", - -@"\optiminer_zcash_win\bin\round5.bin", - -@"\optiminer_zcash_win\bin\round6.bin", - -@"\optiminer_zcash_win\bin\round7.bin", - -@"\optiminer_zcash_win\bin\round8.bin", - -@"\optiminer_zcash_win\bin\round9.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Bonaire_round9.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round1.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round2.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round3.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round4.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round5.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round6.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round7.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round8.bin", - -@"\optiminer_zcash_win\bin-191205\CapeVerde_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Carrizo_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Fiji_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Hawaii_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Iceland_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Kalindi_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Mullins_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Oland_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Pitcairn_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Spectre_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Spooky_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Tahiti_round9.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round1.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round2.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round3.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round4.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round5.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round6.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round7.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round8.bin", - -@"\optiminer_zcash_win\bin-191205\Tonga_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Bonaire_round9.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round1.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round2.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round3.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round4.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round5.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round6.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round7.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round8.bin", - -@"\optiminer_zcash_win\bin-200406\CapeVerde_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Carrizo_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Fiji_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Hawaii_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Iceland_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Kalindi_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Mullins_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Oland_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Pitcairn_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Spectre_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Spooky_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Stoney_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Tahiti_round9.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round1.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round2.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round3.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round4.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round5.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round6.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round7.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round8.bin", - -@"\optiminer_zcash_win\bin-200406\Tonga_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Baffin_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Bonaire_round9.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round1.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round2.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round3.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round4.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round5.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round6.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round7.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round8.bin", - -@"\optiminer_zcash_win\bin-203603\CapeVerde_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Carrizo_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Ellesmere_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Fiji_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Hawaii_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Iceland_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Kalindi_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Mullins_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Oland_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Pitcairn_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Spectre_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Spooky_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Stoney_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Tahiti_round9.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round1.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round2.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round3.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round4.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round5.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round6.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round7.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round8.bin", - -@"\optiminer_zcash_win\bin-203603\Tonga_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Baffin_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Bonaire_round9.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round1.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round2.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round3.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round4.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round5.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round6.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round7.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round8.bin", - -@"\optiminer_zcash_win\bin-207903\CapeVerde_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Carrizo_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Ellesmere_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Fiji_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Hawaii_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Iceland_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Kalindi_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Mullins_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Oland_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Pitcairn_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Spectre_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Spooky_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Stoney_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Tahiti_round9.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round1.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round2.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round3.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round4.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round5.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round6.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round7.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round8.bin", - -@"\optiminer_zcash_win\bin-207903\Tonga_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Baffin_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Bonaire_round9.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round1.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round2.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round3.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round4.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round5.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round6.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round7.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round8.bin", - -@"\optiminer_zcash_win\bin-223600\CapeVerde_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Carrizo_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Ellesmere_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Fiji_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Hawaii_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Iceland_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Kalindi_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Mullins_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Oland_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Pitcairn_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Spectre_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Spooky_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Stoney_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Tahiti_round9.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round1.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round2.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round3.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round4.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round5.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round6.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round7.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round8.bin", - -@"\optiminer_zcash_win\bin-223600\Tonga_round9.bin", - -}; - #endregion //CODE_GEN STUFF // listFiles.py - } -} - + +namespace NiceHashMiner.Utils { + public static class Bins_Data_3rd { + #region CODE_GEN STUFF // listFiles.py + public static string[] ALL_FILES_BINS = { +@"\claymore_cryptonight\Data.bin", +@"\claymore_cryptonight\msvcr110.dll", +@"\claymore_cryptonight\NsGpuCNMiner.exe", +@"\claymore_cryptonight\Remote manager\EthMan.exe", +@"\claymore_zcash\Data.bin", +@"\claymore_zcash\Data1a1.bin", +@"\claymore_zcash\Data1b1.bin", +@"\claymore_zcash\Data1c1.bin", +@"\claymore_zcash\Data1d1.bin", +@"\claymore_zcash\Data1e1.bin", +@"\claymore_zcash\Data1g1.bin", +@"\claymore_zcash\Data2.bin", +@"\claymore_zcash\msvcr110.dll", +@"\claymore_zcash\ZecMiner64.exe", +@"\claymore_zcash\Remote manager\EthMan.exe", +@"\optiminer_zcash_win\Optiminer.exe", +@"\optiminer_zcash_win\bin\asm.bin", +@"\optiminer_zcash_win\bin\base.bin", +@"\optiminer_zcash_win\bin\round1.bin", +@"\optiminer_zcash_win\bin\round2.bin", +@"\optiminer_zcash_win\bin\round3.bin", +@"\optiminer_zcash_win\bin\round4.bin", +@"\optiminer_zcash_win\bin\round5.bin", +@"\optiminer_zcash_win\bin\round6.bin", +@"\optiminer_zcash_win\bin\round7.bin", +@"\optiminer_zcash_win\bin\round8.bin", +@"\optiminer_zcash_win\bin\round9.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round0.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round1.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round2.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round3.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round4.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round5.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round6.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round7.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round8.bin", +@"\optiminer_zcash_win\bin-191205\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round0.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round1.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round2.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round3.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round4.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round5.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round6.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round7.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round8.bin", +@"\optiminer_zcash_win\bin-191205\CapeVerde_round9.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round0.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round1.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round2.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round3.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round4.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round5.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round6.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round7.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round8.bin", +@"\optiminer_zcash_win\bin-191205\Carrizo_round9.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round0.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round1.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round2.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round3.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round4.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round5.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round6.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round7.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round8.bin", +@"\optiminer_zcash_win\bin-191205\Fiji_round9.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round0.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round1.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round2.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round3.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round4.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round5.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round6.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round7.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round8.bin", +@"\optiminer_zcash_win\bin-191205\Hawaii_round9.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round0.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round1.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round2.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round3.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round4.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round5.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round6.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round7.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round8.bin", +@"\optiminer_zcash_win\bin-191205\Iceland_round9.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round0.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round1.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round2.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round3.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round4.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round5.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round6.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round7.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round8.bin", +@"\optiminer_zcash_win\bin-191205\Kalindi_round9.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round0.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round1.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round2.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round3.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round4.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round5.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round6.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round7.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round8.bin", +@"\optiminer_zcash_win\bin-191205\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round0.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round1.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round2.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round3.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round4.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round5.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round6.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round7.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round8.bin", +@"\optiminer_zcash_win\bin-191205\Oland_round9.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round0.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round1.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round2.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round3.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round4.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round5.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round6.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round7.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round8.bin", +@"\optiminer_zcash_win\bin-191205\Pitcairn_round9.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round0.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round1.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round2.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round3.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round4.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round5.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round6.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round7.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round8.bin", +@"\optiminer_zcash_win\bin-191205\Spectre_round9.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round0.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round1.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round2.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round3.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round4.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round5.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round6.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round7.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round8.bin", +@"\optiminer_zcash_win\bin-191205\Spooky_round9.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round0.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round1.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round2.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round3.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round4.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round5.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round6.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round7.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round8.bin", +@"\optiminer_zcash_win\bin-191205\Tahiti_round9.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round0.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round1.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round2.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round3.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round4.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round5.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round6.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round7.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round8.bin", +@"\optiminer_zcash_win\bin-191205\Tonga_round9.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round0.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round1.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round2.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round3.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round4.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round5.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round6.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round7.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round8.bin", +@"\optiminer_zcash_win\bin-200406\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round0.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round1.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round2.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round3.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round4.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round5.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round6.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round7.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round8.bin", +@"\optiminer_zcash_win\bin-200406\CapeVerde_round9.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round0.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round1.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round2.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round3.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round4.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round5.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round6.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round7.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round8.bin", +@"\optiminer_zcash_win\bin-200406\Carrizo_round9.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round0.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round1.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round2.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round3.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round4.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round5.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round6.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round7.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round8.bin", +@"\optiminer_zcash_win\bin-200406\Fiji_round9.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round0.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round1.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round2.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round3.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round4.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round5.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round6.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round7.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round8.bin", +@"\optiminer_zcash_win\bin-200406\Hawaii_round9.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round0.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round1.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round2.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round3.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round4.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round5.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round6.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round7.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round8.bin", +@"\optiminer_zcash_win\bin-200406\Iceland_round9.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round0.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round1.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round2.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round3.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round4.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round5.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round6.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round7.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round8.bin", +@"\optiminer_zcash_win\bin-200406\Kalindi_round9.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round0.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round1.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round2.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round3.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round4.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round5.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round6.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round7.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round8.bin", +@"\optiminer_zcash_win\bin-200406\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round0.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round1.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round2.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round3.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round4.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round5.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round6.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round7.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round8.bin", +@"\optiminer_zcash_win\bin-200406\Oland_round9.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round0.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round1.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round2.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round3.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round4.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round5.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round6.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round7.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round8.bin", +@"\optiminer_zcash_win\bin-200406\Pitcairn_round9.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round0.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round1.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round2.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round3.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round4.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round5.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round6.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round7.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round8.bin", +@"\optiminer_zcash_win\bin-200406\Spectre_round9.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round0.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round1.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round2.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round3.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round4.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round5.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round6.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round7.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round8.bin", +@"\optiminer_zcash_win\bin-200406\Spooky_round9.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round0.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round1.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round2.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round3.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round4.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round5.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round6.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round7.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round8.bin", +@"\optiminer_zcash_win\bin-200406\Stoney_round9.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round0.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round1.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round2.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round3.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round4.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round5.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round6.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round7.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round8.bin", +@"\optiminer_zcash_win\bin-200406\Tahiti_round9.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round0.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round1.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round2.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round3.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round4.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round5.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round6.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round7.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round8.bin", +@"\optiminer_zcash_win\bin-200406\Tonga_round9.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round0.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round1.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round2.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round3.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round4.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round5.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round6.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round7.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round8.bin", +@"\optiminer_zcash_win\bin-203603\Baffin_round9.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round0.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round1.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round2.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round3.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round4.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round5.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round6.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round7.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round8.bin", +@"\optiminer_zcash_win\bin-203603\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round0.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round1.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round2.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round3.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round4.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round5.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round6.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round7.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round8.bin", +@"\optiminer_zcash_win\bin-203603\CapeVerde_round9.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round0.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round1.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round2.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round3.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round4.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round5.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round6.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round7.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round8.bin", +@"\optiminer_zcash_win\bin-203603\Carrizo_round9.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round0.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round1.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round2.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round3.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round4.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round5.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round6.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round7.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round8.bin", +@"\optiminer_zcash_win\bin-203603\Ellesmere_round9.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round0.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round1.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round2.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round3.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round4.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round5.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round6.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round7.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round8.bin", +@"\optiminer_zcash_win\bin-203603\Fiji_round9.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round0.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round1.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round2.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round3.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round4.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round5.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round6.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round7.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round8.bin", +@"\optiminer_zcash_win\bin-203603\Hawaii_round9.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round0.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round1.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round2.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round3.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round4.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round5.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round6.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round7.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round8.bin", +@"\optiminer_zcash_win\bin-203603\Iceland_round9.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round0.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round1.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round2.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round3.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round4.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round5.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round6.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round7.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round8.bin", +@"\optiminer_zcash_win\bin-203603\Kalindi_round9.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round0.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round1.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round2.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round3.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round4.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round5.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round6.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round7.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round8.bin", +@"\optiminer_zcash_win\bin-203603\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round0.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round1.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round2.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round3.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round4.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round5.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round6.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round7.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round8.bin", +@"\optiminer_zcash_win\bin-203603\Oland_round9.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round0.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round1.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round2.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round3.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round4.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round5.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round6.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round7.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round8.bin", +@"\optiminer_zcash_win\bin-203603\Pitcairn_round9.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round0.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round1.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round2.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round3.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round4.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round5.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round6.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round7.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round8.bin", +@"\optiminer_zcash_win\bin-203603\Spectre_round9.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round0.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round1.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round2.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round3.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round4.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round5.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round6.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round7.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round8.bin", +@"\optiminer_zcash_win\bin-203603\Spooky_round9.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round0.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round1.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round2.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round3.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round4.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round5.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round6.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round7.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round8.bin", +@"\optiminer_zcash_win\bin-203603\Stoney_round9.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round0.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round1.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round2.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round3.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round4.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round5.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round6.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round7.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round8.bin", +@"\optiminer_zcash_win\bin-203603\Tahiti_round9.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round0.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round1.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round2.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round3.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round4.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round5.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round6.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round7.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round8.bin", +@"\optiminer_zcash_win\bin-203603\Tonga_round9.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round0.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round1.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round2.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round3.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round4.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round5.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round6.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round7.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round8.bin", +@"\optiminer_zcash_win\bin-207903\Baffin_round9.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round0.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round1.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round2.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round3.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round4.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round5.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round6.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round7.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round8.bin", +@"\optiminer_zcash_win\bin-207903\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round0.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round1.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round2.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round3.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round4.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round5.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round6.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round7.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round8.bin", +@"\optiminer_zcash_win\bin-207903\CapeVerde_round9.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round0.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round1.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round2.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round3.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round4.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round5.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round6.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round7.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round8.bin", +@"\optiminer_zcash_win\bin-207903\Carrizo_round9.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round0.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round1.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round2.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round3.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round4.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round5.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round6.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round7.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round8.bin", +@"\optiminer_zcash_win\bin-207903\Ellesmere_round9.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round0.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round1.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round2.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round3.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round4.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round5.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round6.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round7.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round8.bin", +@"\optiminer_zcash_win\bin-207903\Fiji_round9.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round0.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round1.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round2.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round3.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round4.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round5.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round6.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round7.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round8.bin", +@"\optiminer_zcash_win\bin-207903\Hawaii_round9.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round0.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round1.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round2.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round3.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round4.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round5.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round6.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round7.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round8.bin", +@"\optiminer_zcash_win\bin-207903\Iceland_round9.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round0.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round1.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round2.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round3.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round4.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round5.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round6.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round7.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round8.bin", +@"\optiminer_zcash_win\bin-207903\Kalindi_round9.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round0.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round1.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round2.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round3.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round4.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round5.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round6.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round7.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round8.bin", +@"\optiminer_zcash_win\bin-207903\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round0.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round1.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round2.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round3.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round4.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round5.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round6.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round7.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round8.bin", +@"\optiminer_zcash_win\bin-207903\Oland_round9.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round0.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round1.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round2.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round3.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round4.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round5.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round6.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round7.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round8.bin", +@"\optiminer_zcash_win\bin-207903\Pitcairn_round9.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round0.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round1.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round2.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round3.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round4.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round5.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round6.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round7.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round8.bin", +@"\optiminer_zcash_win\bin-207903\Spectre_round9.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round0.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round1.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round2.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round3.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round4.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round5.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round6.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round7.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round8.bin", +@"\optiminer_zcash_win\bin-207903\Spooky_round9.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round0.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round1.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round2.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round3.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round4.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round5.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round6.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round7.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round8.bin", +@"\optiminer_zcash_win\bin-207903\Stoney_round9.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round0.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round1.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round2.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round3.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round4.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round5.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round6.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round7.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round8.bin", +@"\optiminer_zcash_win\bin-207903\Tahiti_round9.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round0.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round1.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round2.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round3.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round4.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round5.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round6.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round7.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round8.bin", +@"\optiminer_zcash_win\bin-207903\Tonga_round9.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round0.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round1.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round2.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round3.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round4.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round5.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round6.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round7.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round8.bin", +@"\optiminer_zcash_win\bin-223600\Baffin_round9.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round0.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round1.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round2.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round3.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round4.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round5.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round6.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round7.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round8.bin", +@"\optiminer_zcash_win\bin-223600\Bonaire_round9.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round0.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round1.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round2.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round3.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round4.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round5.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round6.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round7.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round8.bin", +@"\optiminer_zcash_win\bin-223600\CapeVerde_round9.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round0.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round1.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round2.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round3.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round4.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round5.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round6.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round7.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round8.bin", +@"\optiminer_zcash_win\bin-223600\Carrizo_round9.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round0.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round1.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round2.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round3.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round4.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round5.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round6.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round7.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round8.bin", +@"\optiminer_zcash_win\bin-223600\Ellesmere_round9.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round0.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round1.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round2.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round3.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round4.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round5.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round6.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round7.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round8.bin", +@"\optiminer_zcash_win\bin-223600\Fiji_round9.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round0.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round1.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round2.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round3.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round4.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round5.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round6.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round7.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round8.bin", +@"\optiminer_zcash_win\bin-223600\Hawaii_round9.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round0.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round1.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round2.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round3.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round4.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round5.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round6.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round7.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round8.bin", +@"\optiminer_zcash_win\bin-223600\Iceland_round9.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round0.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round1.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round2.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round3.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round4.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round5.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round6.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round7.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round8.bin", +@"\optiminer_zcash_win\bin-223600\Kalindi_round9.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round0.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round1.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round2.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round3.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round4.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round5.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round6.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round7.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round8.bin", +@"\optiminer_zcash_win\bin-223600\Mullins_round9.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round0.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round1.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round2.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round3.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round4.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round5.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round6.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round7.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round8.bin", +@"\optiminer_zcash_win\bin-223600\Oland_round9.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round0.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round1.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round2.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round3.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round4.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round5.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round6.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round7.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round8.bin", +@"\optiminer_zcash_win\bin-223600\Pitcairn_round9.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round0.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round1.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round2.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round3.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round4.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round5.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round6.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round7.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round8.bin", +@"\optiminer_zcash_win\bin-223600\Spectre_round9.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round0.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round1.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round2.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round3.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round4.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round5.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round6.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round7.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round8.bin", +@"\optiminer_zcash_win\bin-223600\Spooky_round9.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round0.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round1.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round2.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round3.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round4.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round5.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round6.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round7.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round8.bin", +@"\optiminer_zcash_win\bin-223600\Stoney_round9.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round0.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round1.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round2.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round3.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round4.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round5.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round6.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round7.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round8.bin", +@"\optiminer_zcash_win\bin-223600\Tahiti_round9.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round0.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round1.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round2.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round3.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round4.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round5.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round6.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round7.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round8.bin", +@"\optiminer_zcash_win\bin-223600\Tonga_round9.bin" +}; + #endregion //CODE_GEN STUFF // listFiles.py + } +} + diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 2c023de..c4e5ed3 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,12 +15,12 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_4_4.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_4_6.zip", "bins.zip", "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_4_2.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_4_6.zip", "bins_3rdparty.zip", "bin_3rdparty"); From b209ad1f1438eafd49e466da874d5b06638e30c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 13 Feb 2017 21:51:53 +0100 Subject: [PATCH 271/366] AMD,NVIDIA enable sibcoin X11-Gost algorithm --- NiceHashMiner/AlgorithmNiceHashNames.cs | 2 +- NiceHashMiner/Devices/GroupAlgorithms.cs | 11 +++++++---- NiceHashMiner/Enums/AlgorithmType.cs | 3 ++- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/NiceHashMiner/AlgorithmNiceHashNames.cs b/NiceHashMiner/AlgorithmNiceHashNames.cs index 5b3a8c8..76e227b 100644 --- a/NiceHashMiner/AlgorithmNiceHashNames.cs +++ b/NiceHashMiner/AlgorithmNiceHashNames.cs @@ -11,7 +11,7 @@ namespace NiceHashMiner public static class AlgorithmNiceHashNames { public static string GetName(AlgorithmType type) { - if (AlgorithmType.INVALID <= type && type <= AlgorithmType.Pascal) { + if (AlgorithmType.INVALID <= type && type <= AlgorithmType.X11Gost) { return Enum.GetName(typeof(AlgorithmType), type); } return "NameNotFound type not supported"; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 6571c19..f1150d4 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -46,7 +46,7 @@ public static Dictionary> CreateForDevice(Compute // Ellesmere sgminer workaround, keep this until sgminer is fixed to work with Ellesmere if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris")) && Globals.IsEllesmereSgminerIgnore) { // remove all algos except equi and dagger - var ignoreRemove = new List { AlgorithmType.DaggerHashimoto, AlgorithmType.Equihash, AlgorithmType.CryptoNight, AlgorithmType.Pascal }; + var ignoreRemove = new List { AlgorithmType.DaggerHashimoto, AlgorithmType.Equihash, AlgorithmType.CryptoNight, AlgorithmType.Pascal, AlgorithmType.X11Gost }; var toRemove = GetKeysForMinerAlgosGroup(algoSettings).FindAll((algoType) => ignoreRemove.IndexOf(algoType) == -1); algoSettings = FilterMinerAlgos(algoSettings, toRemove); // remove all sgminer? @@ -172,7 +172,8 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.Pascal, "pascal") { ExtraLaunchParameters = DefaultParam + "--intensity 21 -w 64 -g 2" } + new Algorithm(MinerBaseType.sgminer, AlgorithmType.Pascal, "pascal") { ExtraLaunchParameters = DefaultParam + "--intensity 21 -w 64 -g 2" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.X11Gost, "gost") } }, { MinerBaseType.ethminer, @@ -204,7 +205,8 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lyra2REv2, "lyra2v2"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.Decred, "decred"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.CryptoNight, "cryptonight"), - new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lbry, "lbry") + new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lbry, "lbry"), + new Algorithm(MinerBaseType.ccminer, AlgorithmType.X11Gost, "sib") } }, { MinerBaseType.ethminer, @@ -240,7 +242,8 @@ public static Dictionary> CreateDefaultsForGroup( ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { AlgorithmType.DaggerHashimoto, AlgorithmType.CryptoNight, - AlgorithmType.Pascal + AlgorithmType.Pascal, + AlgorithmType.X11Gost }); } diff --git a/NiceHashMiner/Enums/AlgorithmType.cs b/NiceHashMiner/Enums/AlgorithmType.cs index 015c791..a180c28 100644 --- a/NiceHashMiner/Enums/AlgorithmType.cs +++ b/NiceHashMiner/Enums/AlgorithmType.cs @@ -71,7 +71,8 @@ public enum AlgorithmType : int CryptoNight = 22, Lbry = 23, Equihash = 24, - Pascal = 25 + Pascal = 25, + X11Gost = 26 #endregion // NiceHashAPI } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 1ee2196..52528c6 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -162,7 +162,7 @@ public static string ccminer_sm5x_or_sm6x(AlgorithmType algorithmType) { if (AlgorithmType.CryptoNight == algorithmType) { return Data.ccminer_cryptonight; } - if (AlgorithmType.Lbry == algorithmType) { + if (AlgorithmType.Lbry == algorithmType || AlgorithmType.X11Gost == algorithmType) { return Data.ccminer_tpruvot; } From 2657141d26894b44ebba1bb827ce50a4d5839dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 13 Feb 2017 22:01:50 +0100 Subject: [PATCH 272/366] remove eqm for CPU, CPU AES mandatory detection --- NiceHashMiner/Devices/CPUUtils.cs | 6 +++--- NiceHashMiner/Devices/GroupAlgorithms.cs | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/NiceHashMiner/Devices/CPUUtils.cs b/NiceHashMiner/Devices/CPUUtils.cs index 8a91438..61867bb 100644 --- a/NiceHashMiner/Devices/CPUUtils.cs +++ b/NiceHashMiner/Devices/CPUUtils.cs @@ -14,7 +14,7 @@ public static class CPUUtils { CPUExtensionType.AVX_AES, CPUExtensionType.AVX, CPUExtensionType.AES, - //CPUExtensionType.SSE2, // disabled + CPUExtensionType.SSE2, // disabled }; /// @@ -29,7 +29,7 @@ private static bool HasExtensionSupport(CPUExtensionType type) { case CPUExtensionType.AVX_AES: return (CPUID.SupportsAVX() == 1) && (CPUID.SupportsAES() == 1); case CPUExtensionType.AVX: return CPUID.SupportsAVX() == 1; case CPUExtensionType.AES: return CPUID.SupportsAES() == 1; - //case CPUExtensionType.SSE2: return CPUID.SupportsSSE2() == 1; + case CPUExtensionType.SSE2: return CPUID.SupportsSSE2() == 1; default: // CPUExtensionType.Automatic break; } @@ -59,7 +59,7 @@ public static CPUExtensionType GetMostOptimized() { /// /// public static bool IsCPUMiningCapable() { - return CPUExtensionType.Automatic != GetMostOptimized(); + return HasExtensionSupport(CPUExtensionType.AES); } } } diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index f1150d4..404cd85 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -147,11 +147,11 @@ public static Dictionary> CreateDefaultsForGroup( // new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") // } //}, - { MinerBaseType.eqm, - new List() { - new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") - } - }, + //{ MinerBaseType.eqm, + // new List() { + // new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") + // } + //}, { MinerBaseType.XmrStackCPU, new List() { new Algorithm(MinerBaseType.XmrStackCPU, AlgorithmType.CryptoNight, "cryptonight") From 3155f8d7f358d7800b4512d5f6a51da09a31ac6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 13 Feb 2017 23:01:02 +0100 Subject: [PATCH 273/366] fix sgminer sibcoin kernel --- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 404cd85..22c8fb2 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -173,7 +173,7 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Pascal, "pascal") { ExtraLaunchParameters = DefaultParam + "--intensity 21 -w 64 -g 2" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.X11Gost, "gost") + new Algorithm(MinerBaseType.sgminer, AlgorithmType.X11Gost, "sibcoin-mod") } }, { MinerBaseType.ethminer, From 027243c88d57841f7f8409ec8045890ee1d75a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 13 Feb 2017 23:16:14 +0100 Subject: [PATCH 274/366] sibcoin sgminer default optimizations --- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 22c8fb2..9908046 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -173,7 +173,7 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Pascal, "pascal") { ExtraLaunchParameters = DefaultParam + "--intensity 21 -w 64 -g 2" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.X11Gost, "sibcoin-mod") + new Algorithm(MinerBaseType.sgminer, AlgorithmType.X11Gost, "sibcoin-mod") { ExtraLaunchParameters = DefaultParam + "--intensity 16 -w 64 -g 2" } } }, { MinerBaseType.ethminer, From f886333ca5a02c356bc48611d9e05a65a54050e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 14 Feb 2017 00:32:59 +0100 Subject: [PATCH 275/366] Parameter parser set do not ignore defaults --- NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 35042c9..ecdd096 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -68,7 +68,7 @@ private static void IgnorePrintLog(string param, string IGNORE_PARAM, List MiningPairs, List options, bool useIfDefaults = false, List ignoreLogOpions = null) { + private static string Parse(List MiningPairs, List options, bool useIfDefaults = true, List ignoreLogOpions = null) { const string IGNORE_PARAM = "Cannot parse \"{0}\", not supported, set to ignore, or wrong extra launch parameter settings"; List optionsOrder = new List(); Dictionary> cdevOptions = new Dictionary>(); From f1a368eec41cbb5dbe2ac502ce5771fe4f51fbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 14 Feb 2017 00:36:49 +0100 Subject: [PATCH 276/366] Parameter parser set do not ignore defaults, fix passed value --- NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index ecdd096..31e4e82 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -351,7 +351,7 @@ private static string ParseForMiningPairs(List MiningPairs, DeviceTy } string ret = ""; - string general = Parse(setMiningPairs, minerOptionPackage.GeneralOptions, false, minerOptionPackage.TemperatureOptions); + string general = Parse(setMiningPairs, minerOptionPackage.GeneralOptions, true, minerOptionPackage.TemperatureOptions); // temp control and parse if (ConfigManager.GeneralConfig.DisableAMDTempControl) { LogParser("DisableAMDTempControl is TRUE, temp control parameters will be ignored"); @@ -359,7 +359,7 @@ private static string ParseForMiningPairs(List MiningPairs, DeviceTy } else { LogParser("AMD parsing temperature control parameters"); // temp = Parse(setMiningPairs, minerOptionPackage.TemperatureOptions, true, minerOptionPackage.GeneralOptions); - string temp = Parse(setMiningPairs, minerOptionPackage.TemperatureOptions, false, minerOptionPackage.GeneralOptions); + string temp = Parse(setMiningPairs, minerOptionPackage.TemperatureOptions, true, minerOptionPackage.GeneralOptions); ret = general + " " + temp; } From 9a1e26cd42c055e031da671e2b6871dfbc1c7568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 14 Feb 2017 11:29:24 +0100 Subject: [PATCH 277/366] ver bump, benchmakr logging, algo cleanup --- NiceHashMiner/Devices/GroupAlgorithms.cs | 4 +-- NiceHashMiner/Helpers.cs | 36 ------------------- NiceHashMiner/Logger.cs | 2 +- NiceHashMiner/Miners/Miner.cs | 23 ++++++++++-- NiceHashMiner/Miners/ethminer/MinerEtherum.cs | 1 - NiceHashMiner/Properties/AssemblyInfo.cs | 4 +-- NiceHashMiner/Utils/MinersDownloadManager.cs | 4 +-- 7 files changed, 28 insertions(+), 46 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 9908046..25ae74d 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -201,10 +201,10 @@ public static Dictionary> CreateDefaultsForGroup( var ret = new Dictionary>() { { MinerBaseType.ccminer, new List() { - new Algorithm(MinerBaseType.ccminer, AlgorithmType.NeoScrypt, "neoscrypt"), + //new Algorithm(MinerBaseType.ccminer, AlgorithmType.NeoScrypt, "neoscrypt"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lyra2REv2, "lyra2v2"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.Decred, "decred"), - new Algorithm(MinerBaseType.ccminer, AlgorithmType.CryptoNight, "cryptonight"), + //new Algorithm(MinerBaseType.ccminer, AlgorithmType.CryptoNight, "cryptonight"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lbry, "lbry"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.X11Gost, "sib") } diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index 64feb12..9df4f2c 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -176,42 +176,6 @@ public static bool WebRequestTestGoogle() { return true; } - // Checking the version using >= will enable forward compatibility, - // however you should always compile your code on newer versions of - // the framework to ensure your app works the same. - //private static bool Is45DotVersion(int releaseKey) { - // if (releaseKey >= 393295) { - // //return "4.6 or later"; - // return true; - // } - // if ((releaseKey >= 379893)) { - // //return "4.5.2 or later"; - // return true; - // } - // if ((releaseKey >= 378675)) { - // //return "4.5.1 or later"; - // return true; - // } - // if ((releaseKey >= 378389)) { - // //return "4.5 or later"; - // return true; - // } - // // This line should never execute. A non-null release key should mean - // // that 4.5 or later is installed. - // //return "No 4.5 or later version detected"; - // return false; - //} - - //public static bool Is45NetOrHigher() { - // using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) { - // if (ndpKey != null && ndpKey.GetValue("Release") != null) { - // return Is45DotVersion((int)ndpKey.GetValue("Release")); - // } else { - // return false; - // } - // } - //} - public static bool IsConnectedToInternet() { bool returnValue = false; try { diff --git a/NiceHashMiner/Logger.cs b/NiceHashMiner/Logger.cs index 1085f9c..ab08a59 100644 --- a/NiceHashMiner/Logger.cs +++ b/NiceHashMiner/Logger.cs @@ -15,7 +15,7 @@ public class Logger { public static readonly ILog log = LogManager.GetLogger(typeof(Logger)); - const string _logPath = @"logs\"; + public const string _logPath = @"logs\"; public static void ConfigureWithFile() { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 8b426f6..afa9845 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -18,6 +18,7 @@ using Timer = System.Timers.Timer; using System.Timers; using NiceHashMiner.Net20_backport; +using System.IO; namespace NiceHashMiner { @@ -87,9 +88,10 @@ public abstract class Miner { protected Exception BenchmarkException = null; protected int BenchmarkTimeInSeconds; - - protected bool _isEthMinerExit = false; + string benchmarkLogPath = ""; + List bench_lines; + // TODO maybe set for individual miner cooldown/retries logic variables // this replaces MinerAPIGraceSeconds(AMD) private const int _MIN_CooldownTimeInMilliseconds = 5 * 1000; // 5 seconds @@ -306,6 +308,15 @@ virtual public void BenchmarkStart(int time, IBenchmarkComunicator benchmarkComu OnBenchmarkCompleteCalled = false; BenchmarkTimeOutStopWatch = null; + + try { + if (!Directory.Exists("logs")) { + Directory.CreateDirectory("logs"); + } + } catch { } + bench_lines = new List(); + benchmarkLogPath = String.Format("{0}Log_{1}_{2}", Logger._logPath, MiningSetup.MiningPairs[0].Device.UUID, MiningSetup.MiningPairs[0].Algorithm.AlgorithmStringID); + string CommandLine = BenchmarkCreateCommandLine(BenchmarkAlgorithm, time); Thread BenchmarkThread = new Thread(BenchmarkThreadRoutine); @@ -374,6 +385,8 @@ private void BenchmarkOutputErrorDataReceived(object sender, DataReceivedEventAr protected abstract void BenchmarkOutputErrorDataReceivedImpl(string outdata); protected void CheckOutdata(string outdata) { + //Helpers.ConsolePrint("BENCHMARK" + benchmarkLogPath, outdata); + bench_lines.Add(outdata); // ccminer, cpuminer if (outdata.Contains("Cuda error")) BenchmarkException = new Exception("CUDA error"); @@ -491,6 +504,12 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); } } finally { + + using (StreamWriter sw = File.AppendText(benchmarkLogPath)) { + foreach (var line in bench_lines) { + sw.WriteLine(line); + } + } BenchmarkProcessStatus = BenchmarkProcessStatus.Success; Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs index c419d21..4ba2fac 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherum.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherum.cs @@ -26,7 +26,6 @@ public abstract class MinerEtherum : Miner { public MinerEtherum(string minerDeviceName, string blockString) : base(minerDeviceName) { - _isEthMinerExit = true; CurrentBlockString = blockString; DagGenerationType = ConfigManager.GeneralConfig.EthminerDagGenerationType; } diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index f987b5d..cfefb08 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.4.6")] -[assembly: AssemblyFileVersion("1.7.4.6")] +[assembly: AssemblyVersion("1.7.5.0")] +[assembly: AssemblyFileVersion("1.7.5.0")] diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index c4e5ed3..301227f 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,12 +15,12 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_4_6.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_0.zip", "bins.zip", "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_4_6.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_5_0.zip", "bins_3rdparty.zip", "bin_3rdparty"); From 13d2133813f5cd4071fb0862cf0cefdfa81f34f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 14 Feb 2017 11:39:00 +0100 Subject: [PATCH 278/366] logger init error catching --- NiceHashMiner/Helpers.cs | 2 +- NiceHashMiner/Logger.cs | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index 9df4f2c..579821e 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -43,7 +43,7 @@ public static void ConsolePrint(string grp, string text) { Console.WriteLine("[" +DateTime.Now.ToLongTimeString() + "] [" + grp + "] " + text); - if (ConfigManager.GeneralConfig.LogToFile) + if (ConfigManager.GeneralConfig.LogToFile && Logger.IsInit) Logger.log.Info("[" + grp + "] " + text); } diff --git a/NiceHashMiner/Logger.cs b/NiceHashMiner/Logger.cs index ab08a59..723b992 100644 --- a/NiceHashMiner/Logger.cs +++ b/NiceHashMiner/Logger.cs @@ -13,6 +13,7 @@ namespace NiceHashMiner { public class Logger { + public static bool IsInit = false; public static readonly ILog log = LogManager.GetLogger(typeof(Logger)); public const string _logPath = @"logs\"; @@ -25,17 +26,22 @@ public static void ConfigureWithFile() } } catch { } - Hierarchy h = (Hierarchy)LogManager.GetRepository(); + IsInit = true; + try { + Hierarchy h = (Hierarchy)LogManager.GetRepository(); - if (ConfigManager.GeneralConfig.LogToFile) - h.Root.Level = Level.Info; - //else if (ConfigManager.Instance.GeneralConfig.LogLevel == 2) - // h.Root.Level = Level.Warn; - //else if (ConfigManager.Instance.GeneralConfig.LogLevel == 3) - // h.Root.Level = Level.Error; + if (ConfigManager.GeneralConfig.LogToFile) + h.Root.Level = Level.Info; + //else if (ConfigManager.Instance.GeneralConfig.LogLevel == 2) + // h.Root.Level = Level.Warn; + //else if (ConfigManager.Instance.GeneralConfig.LogLevel == 3) + // h.Root.Level = Level.Error; - h.Root.AddAppender(CreateFileAppender()); - h.Configured = true; + h.Root.AddAppender(CreateFileAppender()); + h.Configured = true; + } catch (Exception e) { + IsInit = false; + } } public static IAppender CreateFileAppender() From ce170999054d7c0d49a38c32bc4dbeb7657c2569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 14 Feb 2017 11:49:40 +0100 Subject: [PATCH 279/366] win form leave event handling fix --- NiceHashMiner/Forms/Form_Settings.Designer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index b88323d..b9df65f 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -1171,6 +1171,7 @@ private void InitializeComponent() { this.textBox_SwitchProfitabilityThreshold.Name = "textBox_SwitchProfitabilityThreshold"; this.textBox_SwitchProfitabilityThreshold.Size = new System.Drawing.Size(172, 20); this.textBox_SwitchProfitabilityThreshold.TabIndex = 333; + this.textBox_SwitchProfitabilityThreshold.Leave += new System.EventHandler(this.GeneralTextBoxes_Leave); // // textBox_ethminerDefaultBlockHeight // From 188505538cc517b3230699b40aad1e870ab7ad33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 14 Feb 2017 12:13:17 +0100 Subject: [PATCH 280/366] disable unstable algos for SM6.x --- NiceHashMiner/Devices/GroupAlgorithms.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 25ae74d..4aa43c1 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -201,10 +201,10 @@ public static Dictionary> CreateDefaultsForGroup( var ret = new Dictionary>() { { MinerBaseType.ccminer, new List() { - //new Algorithm(MinerBaseType.ccminer, AlgorithmType.NeoScrypt, "neoscrypt"), + new Algorithm(MinerBaseType.ccminer, AlgorithmType.NeoScrypt, "neoscrypt"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lyra2REv2, "lyra2v2"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.Decred, "decred"), - //new Algorithm(MinerBaseType.ccminer, AlgorithmType.CryptoNight, "cryptonight"), + new Algorithm(MinerBaseType.ccminer, AlgorithmType.CryptoNight, "cryptonight"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.Lbry, "lbry"), new Algorithm(MinerBaseType.ccminer, AlgorithmType.X11Gost, "sib") } @@ -230,6 +230,12 @@ public static Dictionary> CreateDefaultsForGroup( } }, }; + if (DeviceGroupType.NVIDIA_6_x == deviceGroupType) { + ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { + AlgorithmType.NeoScrypt, + AlgorithmType.CryptoNight + }); + } if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { AlgorithmType.NeoScrypt, From 15265efae9f6f68fbc16bb464f5832b0b8b1d85e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 15 Feb 2017 11:24:34 +0100 Subject: [PATCH 281/366] fix benchmark logging --- NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 20 +++------ NiceHashMiner/Miners/Miner.cs | 49 +++++++++++++---------- NiceHashMiner/Miners/sgminer.cs | 16 +------- 3 files changed, 36 insertions(+), 49 deletions(-) diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index d733ea7..74d9d6a 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -183,15 +183,10 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { } } catch (Exception ex) { - BenchmarkAlgorithm.BenchmarkSpeed = 0; - Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); - if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { - OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); - } + BenchmarkThreadRoutineCatch(ex); } finally { BenchmarkAlgorithm.BenchmarkSpeed = 0; - BenchmarkProcessStatus = BenchmarkProcessStatus.Finished; + var status = BenchmarkProcessStatus.Finished; // find latest log file string latestLogFile = ""; var dirInfo = new DirectoryInfo(this.WorkingDirectory); @@ -202,8 +197,10 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { // read file log if (File.Exists(WorkingDirectory + latestLogFile)) { var lines = File.ReadAllLines(WorkingDirectory + latestLogFile); + var addBenchLines = bench_lines.Count == 0; foreach (var line in lines) { if (line != null) { + bench_lines.Add(line); string lineLowered = line.ToLower(); if (lineLowered.Contains(LOOK_FOR_START)) { benchmark_sum += getNumber(lineLowered); @@ -213,15 +210,10 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { } if (benchmark_read_count > 0) { BenchmarkAlgorithm.BenchmarkSpeed = benchmark_sum / benchmark_read_count; - BenchmarkProcessStatus = BenchmarkProcessStatus.Success; + status = BenchmarkProcessStatus.Success; } } - Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); - Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); - if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { - OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); - } + BenchmarkThreadRoutineFinish(status); } } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index afa9845..6b4515c 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -89,7 +89,7 @@ public abstract class Miner { protected int BenchmarkTimeInSeconds; string benchmarkLogPath = ""; - List bench_lines; + protected List bench_lines; // TODO maybe set for individual miner cooldown/retries logic variables @@ -461,6 +461,31 @@ virtual protected void BenchmarkThreadRoutineStartSettup() { BenchmarkHandle.BeginOutputReadLine(); } + protected void BenchmarkThreadRoutineCatch(Exception ex) { + BenchmarkAlgorithm.BenchmarkSpeed = 0; + + Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); + if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { + OnBenchmarkCompleteCalled = true; + BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); + } + } + + protected void BenchmarkThreadRoutineFinish(BenchmarkProcessStatus status) { + using (StreamWriter sw = File.AppendText(benchmarkLogPath)) { + foreach (var line in bench_lines) { + sw.WriteLine(line); + } + } + BenchmarkProcessStatus = status; + Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); + Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); + if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { + OnBenchmarkCompleteCalled = true; + BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); + } + } + virtual protected void BenchmarkThreadRoutine(object CommandLine) { Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); @@ -496,27 +521,9 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { //break; } } catch (Exception ex) { - BenchmarkAlgorithm.BenchmarkSpeed = 0; - - Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); - if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { - OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); - } + BenchmarkThreadRoutineCatch(ex); } finally { - - using (StreamWriter sw = File.AppendText(benchmarkLogPath)) { - foreach (var line in bench_lines) { - sw.WriteLine(line); - } - } - BenchmarkProcessStatus = BenchmarkProcessStatus.Success; - Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); - Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); - if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { - OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); - } + BenchmarkThreadRoutineFinish(BenchmarkProcessStatus.Success); } } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index e3ee0a3..49b2dd5 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -260,21 +260,9 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { } } } catch (Exception ex) { - BenchmarkAlgorithm.BenchmarkSpeed = 0; - - Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); - if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { - OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); - } + BenchmarkThreadRoutineCatch(ex); } finally { - BenchmarkProcessStatus = BenchmarkProcessStatus.Success; - Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + Helpers.FormatSpeedOutput(BenchmarkAlgorithm.BenchmarkSpeed)); - Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); - if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { - OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); - } + BenchmarkThreadRoutineFinish(BenchmarkProcessStatus.Success); } } From 2ed1ffc8f5100cab3086d8967c7b95e9f28f9e90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 16 Feb 2017 20:47:59 +0100 Subject: [PATCH 282/366] xmr hyperthreading optimization config, revert parser settings --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 4 ++++ .../Parsing/ExtraLaunchParametersParser.cs | 4 ++-- NiceHashMiner/Miners/XmrStackCPUMiner.cs | 24 +++++++++++++------ NiceHashMiner/PInvoke/CPUID.cs | 14 +++++++++++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 6b5a610..a6c7a36 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -288,6 +288,9 @@ public static void QueryCPUs() { Helpers.ConsolePrint(TAG, "QueryCPUs START"); // get all CPUs Avaliable.CPUsCount = CPUID.GetPhysicalProcessorCount(); + Avaliable.IsHyperThreadingEnabled = CPUID.IsHypeThreadingEnabled(); + + Helpers.ConsolePrint(TAG, Avaliable.IsHyperThreadingEnabled ? "HyperThreadingEnabled = TRUE" : "HyperThreadingEnabled = FALSE"); // get all cores (including virtual - HT can benefit mining) int ThreadsPerCPU = CPUID.GetVirtualCoresCount() / Avaliable.CPUsCount; @@ -825,6 +828,7 @@ public static class Avaliable { public static int CPUsCount = 0; public static int GPUsCount = 0; public static int AMDOpenCLPlatformNum = -1; + public static bool IsHyperThreadingEnabled = false; public static List AllAvaliableDevices = new List(); diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 31e4e82..ecdd096 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -351,7 +351,7 @@ private static string ParseForMiningPairs(List MiningPairs, DeviceTy } string ret = ""; - string general = Parse(setMiningPairs, minerOptionPackage.GeneralOptions, true, minerOptionPackage.TemperatureOptions); + string general = Parse(setMiningPairs, minerOptionPackage.GeneralOptions, false, minerOptionPackage.TemperatureOptions); // temp control and parse if (ConfigManager.GeneralConfig.DisableAMDTempControl) { LogParser("DisableAMDTempControl is TRUE, temp control parameters will be ignored"); @@ -359,7 +359,7 @@ private static string ParseForMiningPairs(List MiningPairs, DeviceTy } else { LogParser("AMD parsing temperature control parameters"); // temp = Parse(setMiningPairs, minerOptionPackage.TemperatureOptions, true, minerOptionPackage.GeneralOptions); - string temp = Parse(setMiningPairs, minerOptionPackage.TemperatureOptions, true, minerOptionPackage.GeneralOptions); + string temp = Parse(setMiningPairs, minerOptionPackage.TemperatureOptions, false, minerOptionPackage.GeneralOptions); ret = general + " " + temp; } diff --git a/NiceHashMiner/Miners/XmrStackCPUMiner.cs b/NiceHashMiner/Miners/XmrStackCPUMiner.cs index 20a1e4f..0607a45 100644 --- a/NiceHashMiner/Miners/XmrStackCPUMiner.cs +++ b/NiceHashMiner/Miners/XmrStackCPUMiner.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json.Linq; using NiceHashMiner.Configs; +using NiceHashMiner.Devices; using NiceHashMiner.Enums; using NiceHashMiner.Miners.Parsing; using System; @@ -18,13 +19,19 @@ public XmrStackCPUMinerConfig(int numberOfthreads, string poolAddr, string walle this.httpd_port = port; } - public void Inti_cpu_threads_conf(bool low_power_mode, bool no_prefetch, bool affine_to_cpu) { + public void Inti_cpu_threads_conf(bool low_power_mode, bool no_prefetch, bool affine_to_cpu, bool isHyperThreading) { cpu_threads_conf = new List(); - for (int i_cpu = 0; i_cpu < cpu_thread_num; ++i_cpu) { - if (affine_to_cpu) { - cpu_threads_conf.Add(JObject.FromObject(new { low_power_mode = low_power_mode, no_prefetch = no_prefetch, affine_to_cpu = i_cpu })); - } else { - cpu_threads_conf.Add(JObject.FromObject(new { low_power_mode = low_power_mode, no_prefetch = no_prefetch, affine_to_cpu = false })); + if (isHyperThreading) { + for (int i_cpu = 0; i_cpu < cpu_thread_num; ++i_cpu) { + cpu_threads_conf.Add(JObject.FromObject(new { low_power_mode = low_power_mode, no_prefetch = no_prefetch, affine_to_cpu = i_cpu * 2 })); + } + } else { + for (int i_cpu = 0; i_cpu < cpu_thread_num; ++i_cpu) { + if (affine_to_cpu) { + cpu_threads_conf.Add(JObject.FromObject(new { low_power_mode = low_power_mode, no_prefetch = no_prefetch, affine_to_cpu = i_cpu })); + } else { + cpu_threads_conf.Add(JObject.FromObject(new { low_power_mode = low_power_mode, no_prefetch = no_prefetch, affine_to_cpu = false })); + } } } } @@ -189,8 +196,11 @@ private void prepareConfigFile(string pool, string wallet) { if (this.MiningSetup.MiningPairs.Count > 0) { try { int numTr = ExtraLaunchParametersParser.GetThreadsNumber(this.MiningSetup.MiningPairs[0]); + if (ComputeDeviceManager.Avaliable.IsHyperThreadingEnabled) { + numTr /= 2; + } var config = new XmrStackCPUMinerConfig(numTr, pool, wallet, this.APIPort); - config.Inti_cpu_threads_conf(false, false, true); + config.Inti_cpu_threads_conf(false, false, true, ComputeDeviceManager.Avaliable.IsHyperThreadingEnabled); var confJson = JObject.FromObject(config); string writeStr = confJson.ToString(); int start = writeStr.IndexOf("{"); diff --git a/NiceHashMiner/PInvoke/CPUID.cs b/NiceHashMiner/PInvoke/CPUID.cs index ccb0567..c0e87e0 100644 --- a/NiceHashMiner/PInvoke/CPUID.cs +++ b/NiceHashMiner/PInvoke/CPUID.cs @@ -53,6 +53,20 @@ public static int GetVirtualCoresCount() return coreCount; } + public static int GetNumberOfCores() { + int coreCount = 0; + + foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get()) { + coreCount += int.Parse(item["NumberOfCores"].ToString()); + } + + return coreCount; + } + + public static bool IsHypeThreadingEnabled() { + return GetVirtualCoresCount() > GetNumberOfCores(); + } + public static ulong CreateAffinityMask(int index, int percpu) { ulong mask = 0; From 41f6c4c81c91db9a0e7f48c417e6612806fa2024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 17 Feb 2017 14:52:00 +0100 Subject: [PATCH 283/366] speed parse fix, new miner added --- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 6 ++++- NiceHashMiner/Miners/Miner.cs | 30 ++++++++++++++------- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +-- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 52528c6..56f624b 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -25,6 +25,7 @@ public static class Data { public const string ccminer_sp = _bin + @"\ccminer_sp.exe"; public const string ccminer_tpruvot = _bin + @"\ccminer_tpruvot.exe"; public const string ccminer_cryptonight = _bin + @"\ccminer_cryptonight.exe"; + public const string ccminer_x11gost = _bin + @"\ccminer_x11gost.exe"; /// /// cpuminers opt new /// @@ -162,9 +163,12 @@ public static string ccminer_sm5x_or_sm6x(AlgorithmType algorithmType) { if (AlgorithmType.CryptoNight == algorithmType) { return Data.ccminer_cryptonight; } - if (AlgorithmType.Lbry == algorithmType || AlgorithmType.X11Gost == algorithmType) { + if (AlgorithmType.Lbry == algorithmType) { return Data.ccminer_tpruvot; } + if (AlgorithmType.X11Gost == algorithmType) { + return Data.ccminer_x11gost; + } return Data.ccminer_sp; } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 6b4515c..ab93878 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -424,15 +424,27 @@ protected double BenchmarkParseLine_cpu_ccminer_extra(string outdata) { // save speed int b = hashspeed.IndexOf(" "); - double spd = Double.Parse(hashspeed.Substring(0, b), CultureInfo.InvariantCulture); - if (hashspeed.Contains("kH/s")) - spd *= 1000; - else if (hashspeed.Contains("MH/s")) - spd *= 1000000; - else if (hashspeed.Contains("GH/s")) - spd *= 1000000000; - - return spd; + if (b < 0) { + int stub; + for (int _i = hashspeed.Length - 1; _i >= 0; --_i ) { + if (Int32.TryParse(hashspeed[_i].ToString(), out stub)) { + b = _i; + break; + } + } + } + if (b >= 0) { + string speedStr = hashspeed.Substring(0, b); + double spd = Helpers.ParseDouble(speedStr); + if (hashspeed.Contains("kH/s")) + spd *= 1000; + else if (hashspeed.Contains("MH/s")) + spd *= 1000000; + else if (hashspeed.Contains("GH/s")) + spd *= 1000000000; + + return spd; + } } return 0.0d; } diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index cfefb08..f5f9d97 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.0")] -[assembly: AssemblyFileVersion("1.7.5.0")] +[assembly: AssemblyVersion("1.7.5.1")] +[assembly: AssemblyFileVersion("1.7.5.1")] From c6cf02a6c7372787aadd00542436a5fa947a4774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 17 Feb 2017 17:45:57 +0100 Subject: [PATCH 284/366] changes --- NiceHashMiner/Devices/ComputeDevice.cs | 7 +- NiceHashMiner/Devices/ComputeDeviceManager.cs | 88 +++++++++++++++++++ NiceHashMiner/Forms/Form_Main.cs | 2 + NiceHashMiner/Miners/ccminer.cs | 3 + NiceHashMiner/langs/en.lang | 3 +- 5 files changed, 101 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index c8015af..bde5521 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -32,6 +32,7 @@ public class ComputeDevice readonly public ulong AffinityMask; // GPU extras + public readonly ulong GpuRam; public readonly bool IsEtherumCapale; public static readonly ulong MEMORY_3GB = 3221225472; @@ -62,6 +63,7 @@ public ComputeDevice(int id) { IsOptimizedVersion = false; Codename = "fake"; UUID = GetUUID(ID, GroupNames.GetGroupName(DeviceGroupType, ID), Name, DeviceGroupType); + GpuRam = 0; } // CPU @@ -78,6 +80,7 @@ public ComputeDevice(int id, string group, string name, int threads, ulong affin UUID = GetUUID(ID, GroupNames.GetGroupName(DeviceGroupType, ID), Name, DeviceGroupType); AlgorithmSettings = GroupAlgorithms.CreateForDeviceList(this); IsEtherumCapale = false; + GpuRam = 0; } // GPU NVIDIA @@ -91,6 +94,7 @@ public ComputeDevice(CudaDevice cudaDevice, DeviceGroupType group, int GPUCount) NameCount = String.Format(International.GetText("ComputeDevice_Short_Name_NVIDIA_GPU"), GPUCount); UUID = cudaDevice.UUID; AlgorithmSettings = GroupAlgorithms.CreateForDeviceList(this); + GpuRam = cudaDevice.DeviceGlobalMemory; } // GPU AMD @@ -112,7 +116,8 @@ public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount, bool isDetectionFallb Codename = amdDevice.Codename; InfSection = amdDevice.InfSection; AlgorithmSettings = GroupAlgorithms.CreateForDeviceList(this); - DriverDisableAlgos = amdDevice.DriverDisableAlgos; ; + DriverDisableAlgos = amdDevice.DriverDisableAlgos; + GpuRam = amdDevice.DeviceGlobalMemory; } // combines long and short name diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index a6c7a36..ff34816 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -196,6 +196,28 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { International.GetText("Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title"), MessageBoxButtons.OK, MessageBoxIcon.Warning); } + // get GPUs RAM sum + // bytes + Avaliable.NVIDIA_RAM_SUM = 0; + Avaliable.AMD_RAM_SUM = 0; + foreach (var dev in Avaliable.AllAvaliableDevices) { + if (dev.DeviceType == DeviceType.NVIDIA) { + Avaliable.NVIDIA_RAM_SUM += dev.GpuRam; + } else if (dev.DeviceType == DeviceType.AMD) { + Avaliable.AMD_RAM_SUM += dev.GpuRam; + } + } + double total_GPU_RAM = (Avaliable.NVIDIA_RAM_SUM + Avaliable.AMD_RAM_SUM) / 1024; // b to kb + double total_Sys_RAM = SystemSpecs.FreePhysicalMemory + SystemSpecs.FreeVirtualMemory; + // check + if (total_Sys_RAM < total_GPU_RAM * 0.6) { + Helpers.ConsolePrint(TAG, "virtual memory size BAD"); + MessageBox.Show(International.GetText("VirtualMemorySize_BAD"), + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.OK); + } else { + Helpers.ConsolePrint(TAG, "virtual memory size GOOD"); + } // #x remove reference MessageNotifier = null; @@ -821,6 +843,69 @@ static public void QueryAMD() { #endregion Helpers } + public static class SystemSpecs { + public static UInt64 FreePhysicalMemory; + public static UInt64 FreeSpaceInPagingFiles; + public static UInt64 FreeVirtualMemory; + public static UInt32 LargeSystemCache; + public static UInt32 MaxNumberOfProcesses; + public static UInt64 MaxProcessMemorySize; + + public static UInt32 NumberOfLicensedUsers; + public static UInt32 NumberOfProcesses; + public static UInt32 NumberOfUsers; + public static UInt32 OperatingSystemSKU; + + public static UInt64 SizeStoredInPagingFiles; + + public static UInt32 SuiteMask; + + public static UInt64 TotalSwapSpaceSize; + public static UInt64 TotalVirtualMemorySize; + public static UInt64 TotalVisibleMemorySize; + + + public static void QueryAndLog() { + ObjectQuery winQuery = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); + + ManagementObjectSearcher searcher = new ManagementObjectSearcher(winQuery); + + foreach (ManagementObject item in searcher.Get()) { + if (item["FreePhysicalMemory"] != null) UInt64.TryParse(item["FreePhysicalMemory"].ToString(), out FreePhysicalMemory); + if (item["FreeSpaceInPagingFiles"] != null) UInt64.TryParse(item["FreeSpaceInPagingFiles"].ToString(), out FreeSpaceInPagingFiles); + if (item["FreeVirtualMemory"] != null) UInt64.TryParse(item["FreeVirtualMemory"].ToString(), out FreeVirtualMemory); + if (item["LargeSystemCache"] != null) UInt32.TryParse(item["LargeSystemCache"].ToString(), out LargeSystemCache); + if (item["MaxNumberOfProcesses"] != null) UInt32.TryParse(item["MaxNumberOfProcesses"].ToString(), out MaxNumberOfProcesses); + if (item["MaxProcessMemorySize"] != null) UInt64.TryParse(item["MaxProcessMemorySize"].ToString(), out MaxProcessMemorySize); + if (item["NumberOfLicensedUsers"] != null) UInt32.TryParse(item["NumberOfLicensedUsers"].ToString(), out NumberOfLicensedUsers); + if (item["NumberOfProcesses"] != null) UInt32.TryParse(item["NumberOfProcesses"].ToString(), out NumberOfProcesses); + if (item["NumberOfUsers"] != null) UInt32.TryParse(item["NumberOfUsers"].ToString(), out NumberOfUsers); + if (item["OperatingSystemSKU"] != null) UInt32.TryParse(item["OperatingSystemSKU"].ToString(), out OperatingSystemSKU); + if (item["SizeStoredInPagingFiles"] != null) UInt64.TryParse(item["SizeStoredInPagingFiles"].ToString(), out SizeStoredInPagingFiles); + if (item["SuiteMask"] != null) UInt32.TryParse(item["SuiteMask"].ToString(), out SuiteMask); + if (item["TotalSwapSpaceSize"] != null) UInt64.TryParse(item["TotalSwapSpaceSize"].ToString(), out TotalSwapSpaceSize); + if (item["TotalVirtualMemorySize"] != null) UInt64.TryParse(item["TotalVirtualMemorySize"].ToString(), out TotalVirtualMemorySize); + if (item["TotalVisibleMemorySize"] != null) UInt64.TryParse(item["TotalVisibleMemorySize"].ToString(), out TotalVisibleMemorySize); + // log + Helpers.ConsolePrint("SystemSpecs", String.Format("FreePhysicalMemory = {0}", FreePhysicalMemory)); + Helpers.ConsolePrint("SystemSpecs", String.Format("FreeSpaceInPagingFiles = {0}", FreeSpaceInPagingFiles)); + Helpers.ConsolePrint("SystemSpecs", String.Format("FreeVirtualMemory = {0}", FreeVirtualMemory)); + Helpers.ConsolePrint("SystemSpecs", String.Format("LargeSystemCache = {0}", LargeSystemCache)); + Helpers.ConsolePrint("SystemSpecs", String.Format("MaxNumberOfProcesses = {0}", MaxNumberOfProcesses)); + Helpers.ConsolePrint("SystemSpecs", String.Format("MaxProcessMemorySize = {0}", MaxProcessMemorySize)); + Helpers.ConsolePrint("SystemSpecs", String.Format("NumberOfLicensedUsers = {0}", NumberOfLicensedUsers)); + Helpers.ConsolePrint("SystemSpecs", String.Format("NumberOfProcesses = {0}", NumberOfProcesses)); + Helpers.ConsolePrint("SystemSpecs", String.Format("NumberOfUsers = {0}", NumberOfUsers)); + Helpers.ConsolePrint("SystemSpecs", String.Format("OperatingSystemSKU = {0}", OperatingSystemSKU)); + Helpers.ConsolePrint("SystemSpecs", String.Format("SizeStoredInPagingFiles = {0}", SizeStoredInPagingFiles)); + Helpers.ConsolePrint("SystemSpecs", String.Format("SuiteMask = {0}", SuiteMask)); + Helpers.ConsolePrint("SystemSpecs", String.Format("TotalSwapSpaceSize = {0}", TotalSwapSpaceSize)); + Helpers.ConsolePrint("SystemSpecs", String.Format("TotalVirtualMemorySize = {0}", TotalVirtualMemorySize)); + Helpers.ConsolePrint("SystemSpecs", String.Format("TotalVisibleMemorySize = {0}", TotalVisibleMemorySize)); + } + } + } + public static class Avaliable { public static bool HasNVIDIA = false; public static bool HasAMD = false; @@ -829,6 +914,9 @@ public static class Avaliable { public static int GPUsCount = 0; public static int AMDOpenCLPlatformNum = -1; public static bool IsHyperThreadingEnabled = false; + + public static ulong NVIDIA_RAM_SUM = 0; + public static ulong AMD_RAM_SUM = 0; public static List AllAvaliableDevices = new List(); diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index ee09cef..e1c0e1a 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -65,6 +65,8 @@ public Form_Main() InitLocalization(); + ComputeDeviceManager.SystemSpecs.QueryAndLog(); + // Log the computer's amount of Total RAM and Page File Size ManagementObjectCollection moc = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_OperatingSystem").Get(); foreach (ManagementObject mo in moc) diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index eadfdd0..9dbabc8 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -25,6 +25,9 @@ public ccminer() : base("ccminer_NVIDIA") { } const int _cryptonightTotalDelim = 2; protected override int GET_MAX_CooldownTimeInMilliseconds() { + if (this.MiningSetup.MinerPath == MinerPaths.Data.ccminer_x11gost) { + return 60 * 1000 * 3; // wait a little longer + } return 60 * 1000; // 1 minute max, whole waiting time 75seconds } diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index d8fd19f..42fde4a 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -341,6 +341,7 @@ "NHM_TOS": "NiceHash Miners Term Of Use NiceHash operates as in intermediate service by providing hashing power from hashing power owners to hashing power buyers. NiceHash does not directly provide it's own hashing power. We will do our best to provide stable, secure and feature full service. We do not take responsibility for any kind of hashing power loss or funds loss and do not take any kind of financial, material, legal or other responsibilities for any issues that my arise from using NiceHash Miner. NiceHash service and it's products (NiceHash Miner, etc.) is still in development, therefore some bugs or other issues may arise. We will work hard to fix any issues as soon as possible, add new features and overall improve our service. NiceHash reserves the rights to seize any funds of suspicious illegal activity such as mining with botnets, money laundering, hacking attempts, etc.\r\n\r\nAs a user of NiceHash Miner, you are providing your hashing power (your are a seller) to the hashing power buyers though NiceHash's hashing power marketplace. You earn Bitcoins from selling your hashing power for every valid share your miner generates and is accepted by NiceHash service. In some cases no shares are sent to or are accepted by NiceHash service. This cases are rare and includes usage of slower hardware, software or network errors or simmilar. In these cases (no shares generated and accepted by NiceHash service) no reward in form of Bitcoins can be accounted to you. Payouts are automatic and are paid to BTC address, used in NiceHash Miner. Payment schedule can be found in FAQ on our website and is subject to change. You can always monitor your statistics on this site: https://www.nicehash.com/?p=myminer\r\n\r\nIf you have any questions relating to these Terms of Use, your rights and obligations arising from these Terms and/or your use of the NiceHash service, or any other matter, please contact us at support@nicehash.com.", "Form_Settings_General_SwitchProfitabilityThreshold": "SwitchProfitabilityThreshold", - "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Miner will not switch if the profitability is below SwitchProfitabilityThreshold. Value is in percentage [0 - 1]" + "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Miner will not switch if the profitability is below SwitchProfitabilityThreshold. Value is in percentage [0 - 1]", + "VirtualMemorySize_BAD": "NiceHash Miner recommends increasing virtual memory size so that all algorithms would work fine." } } From fec7da3712f58e7908dfaa86e9313030657070df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 17 Feb 2017 22:36:49 +0100 Subject: [PATCH 285/366] fixes --- NiceHashMiner/Forms/Form_Main.cs | 20 +++++++++++++------- NiceHashMiner/Helpers.cs | 15 +++++++++++++++ NiceHashMiner/Utils/BINS_CODEGEN.cs | 9 ++++++--- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- NiceHashMiner/langs/ru.lang | 1 + 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index e1c0e1a..2eb647e 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -189,7 +189,6 @@ private void StartupTimer_Tick(object sender, EventArgs e) { // TODO add loading step MinersSettingsManager.Init(); - if (!Helpers.InternalCheckIsWow64()) { MessageBox.Show(International.GetText("Form_Main_x64_Support_Only"), International.GetText("Warning_with_Exclamation"), @@ -304,6 +303,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { LoadingScreen.FinishLoad(); + bool runVCRed = !MinersExistanceChecker.IsMinersBinsInit() && !ConfigManager.GeneralConfig.DownloadInit; // standard miners check scope { // check if download needed @@ -363,6 +363,10 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } } + if (runVCRed) { + Helpers.InstallVcRedist(); + } + // no bots please if (ConfigManager.GeneralConfigHwidLoadFromFile() && !ConfigManager.GeneralConfigHwidOK()) { var result = MessageBox.Show("NiceHash Miner has detected change of hardware ID. If you did not download and install NiceHash Miner, your computer may be compromised. In that case, we suggest you to install an antivirus program or reinstall your Windows.\r\n\r\nContinue with NiceHash Miner?", @@ -891,14 +895,16 @@ private bool StartMining(bool showWarnings) { } else if (result == System.Windows.Forms.DialogResult.No) { // check devices without benchmarks foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - bool Enabled = false; - foreach (var algo in cdev.GetAlgorithmSettings()) { - if (algo.BenchmarkSpeed > 0) { - Enabled = true; - break; + if (cdev.Enabled) { + bool Enabled = false; + foreach (var algo in cdev.GetAlgorithmSettings()) { + if (algo.BenchmarkSpeed > 0) { + Enabled = true; + break; + } } + cdev.Enabled = Enabled; } - cdev.Enabled = Enabled; } } else { return false; diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index 579821e..3c18ddf 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -222,5 +222,20 @@ public static bool IsWMIEnabled() { } return false; } + + public static void InstallVcRedist() { + Process CudaDevicesDetection = new Process(); + CudaDevicesDetection.StartInfo.FileName = @"bin\vc_redist.x64.exe"; + CudaDevicesDetection.StartInfo.Arguments = "/q /norestart"; + CudaDevicesDetection.StartInfo.UseShellExecute = false; + CudaDevicesDetection.StartInfo.RedirectStandardError = false; + CudaDevicesDetection.StartInfo.RedirectStandardOutput = false; + CudaDevicesDetection.StartInfo.CreateNoWindow = false; + + //const int waitTime = 45 * 1000; // 45seconds + //CudaDevicesDetection.WaitForExit(waitTime); + CudaDevicesDetection.Start(); + } + } } diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index aa01b7c..7d4418d 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -2,13 +2,13 @@ namespace NiceHashMiner.Utils { public static class Bins_Data { #region CODE_GEN STUFF // listFiles.py - public static string[] ALL_FILES_BINS = {@"\ccminer.exe", -@"\ccminer_cryptonight.exe", + public static string[] ALL_FILES_BINS = { @"\ccminer_cryptonight.exe", @"\ccminer_decred.exe", @"\ccminer_nanashi.exe", @"\ccminer_neoscrypt.exe", @"\ccminer_sp.exe", @"\ccminer_tpruvot.exe", +@"\ccminer_x11gost.exe", @"\cudart32_80.dll", @"\cudart64_80.dll", @"\ethminer.exe", @@ -28,6 +28,7 @@ public static class Bins_Data { @"\libz-1.dll", @"\msvcr120.dll", @"\OpenCL.dll", +@"\vc_redist.x64.exe", @"\zlib1.dll", @"\eqm\cudart64_80.dll", @"\eqm\eqm.exe", @@ -47,7 +48,9 @@ public static class Bins_Data { @"\nheqminer_v0.4b\nheqminer.exe", @"\sgminer-5-6-0-general\sgminer.exe", @"\sgminer-gm\sgminer.exe", -@"\xmr-stak-cpu\xmr-stak-cpu.exe", +@"\xmr-stak-cpu\msvcp140.dll", +@"\xmr-stak-cpu\vcruntime140.dll", +@"\xmr-stak-cpu\xmr-stak-cpu.exe" }; #endregion //CODE_GEN STUFF // listFiles.py } diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 301227f..92ab3c0 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_0.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_1.zip", "bins.zip", "bin"); diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 50eb629..2b30409 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -341,5 +341,6 @@ "Form_Settings_General_SwitchProfitabilityThreshold": "Порог переключения прибыльности", "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Майнер не будет переключаться, если разница между прибыльностью алгоритмов ниже Порога переключения прибыльности. Значение в процентах [0 — 1]", + "VirtualMemorySize_BAD": "NiceHash Miner рекомендует увеличить размер виртуальной памяти для нормальной работы всех алгоритмов." } } \ No newline at end of file From 60f4f91ceca5315f9d2b5325472b25182d6a23fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 18 Feb 2017 19:07:38 +0100 Subject: [PATCH 286/366] remove dll checks --- NiceHashMiner/Utils/BINS_CODEGEN.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index 7d4418d..4ff9f24 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -48,8 +48,6 @@ public static class Bins_Data { @"\nheqminer_v0.4b\nheqminer.exe", @"\sgminer-5-6-0-general\sgminer.exe", @"\sgminer-gm\sgminer.exe", -@"\xmr-stak-cpu\msvcp140.dll", -@"\xmr-stak-cpu\vcruntime140.dll", @"\xmr-stak-cpu\xmr-stak-cpu.exe" }; #endregion //CODE_GEN STUFF // listFiles.py From 930e1a5e445bb2e7f4318fe3aa92d70ff3e70a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 18 Feb 2017 19:19:58 +0100 Subject: [PATCH 287/366] separate ccminer_unstable group --- NiceHashMiner/Devices/GroupAlgorithms.cs | 11 +++++++++++ NiceHashMiner/Enums/MinerBaseType.cs | 1 + NiceHashMiner/Miners/Grouping/MinerPaths.cs | 18 ++++++++++++++---- NiceHashMiner/Miners/MinerFactory.cs | 2 ++ .../Parsing/ExtraLaunchParametersParser.cs | 2 +- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 4aa43c1..365a991 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -118,6 +118,12 @@ public static Dictionary> CreateForDevice(Compute algoSettings[MinerBaseType.XmrStackCPU][0].LessThreads = device.Threads / 2; // use half } + if (algoSettings.ContainsKey(MinerBaseType.ccminer_unstable)) { + foreach (var unstable_algo in algoSettings[MinerBaseType.ccminer_unstable]) { + unstable_algo.Enabled = false; + } + } + return algoSettings; } return null; @@ -209,6 +215,11 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.ccminer, AlgorithmType.X11Gost, "sib") } }, + { MinerBaseType.ccminer_unstable, + new List() { + new Algorithm(MinerBaseType.ccminer_unstable, AlgorithmType.X11Gost, "sib") + } + }, { MinerBaseType.ethminer, new List() { new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto") diff --git a/NiceHashMiner/Enums/MinerBaseType.cs b/NiceHashMiner/Enums/MinerBaseType.cs index c420d9d..c0a1f60 100644 --- a/NiceHashMiner/Enums/MinerBaseType.cs +++ b/NiceHashMiner/Enums/MinerBaseType.cs @@ -15,6 +15,7 @@ public enum MinerBaseType { OptiminerAMD, excavator, XmrStackCPU, + ccminer_unstable, END } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 56f624b..0d5e8a7 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -101,6 +101,8 @@ public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoT return Data.excavator; case MinerBaseType.XmrStackCPU: return Data.XmrStackCPUMiner; + case MinerBaseType.ccminer_unstable: + return NVIDIA_GROUPS.ccminer_unstable_path(algoType, devGroupType); } return Data.NONE; } @@ -163,12 +165,9 @@ public static string ccminer_sm5x_or_sm6x(AlgorithmType algorithmType) { if (AlgorithmType.CryptoNight == algorithmType) { return Data.ccminer_cryptonight; } - if (AlgorithmType.Lbry == algorithmType) { + if (AlgorithmType.Lbry == algorithmType || AlgorithmType.X11Gost == algorithmType) { return Data.ccminer_tpruvot; } - if (AlgorithmType.X11Gost == algorithmType) { - return Data.ccminer_x11gost; - } return Data.ccminer_sp; } @@ -184,6 +183,17 @@ public static string ccminer_path(AlgorithmType algorithmType, DeviceGroupType n // TODO wrong case? return Data.NONE; // should not happen } + + public static string ccminer_unstable_path(AlgorithmType algorithmType, DeviceGroupType nvidiaGroup) { + // sm5x and sm6x have same settings + if (nvidiaGroup == DeviceGroupType.NVIDIA_5_x || nvidiaGroup == DeviceGroupType.NVIDIA_6_x) { + if (AlgorithmType.X11Gost == algorithmType) { + return Data.ccminer_x11gost; + } + } + // TODO wrong case? + return Data.NONE; // should not happen + } } static class AMD_GROUP { diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs index ba21512..bef7720 100644 --- a/NiceHashMiner/Miners/MinerFactory.cs +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -48,6 +48,8 @@ public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmTy return new excavator(); case MinerBaseType.XmrStackCPU: return new XmrStackCPUMiner(); + case MinerBaseType.ccminer_unstable: + return new ccminer(/*minersConfig*/); } return null; } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index ecdd096..5fdd1e5 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -220,7 +220,7 @@ private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType miner if (MinerBaseType.sgminer == minerBaseType) { return MinerType.sgminer; } - if (MinerBaseType.ccminer == minerBaseType) { + if (MinerBaseType.ccminer == minerBaseType || MinerBaseType.ccminer_unstable == minerBaseType) { if (AlgorithmType.CryptoNight == algorithmType) { return MinerType.ccminer_CryptoNight; } From 32ce5d80e4e9d11e1e7b681cdaf473adbef6d523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sat, 18 Feb 2017 19:57:38 +0100 Subject: [PATCH 288/366] rename miner base name --- NiceHashMiner/Devices/GroupAlgorithms.cs | 8 ++++---- NiceHashMiner/Enums/MinerBaseType.cs | 2 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 2 +- NiceHashMiner/Miners/MinerFactory.cs | 2 +- .../Miners/Parsing/ExtraLaunchParametersParser.cs | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 365a991..d18c28e 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -118,8 +118,8 @@ public static Dictionary> CreateForDevice(Compute algoSettings[MinerBaseType.XmrStackCPU][0].LessThreads = device.Threads / 2; // use half } - if (algoSettings.ContainsKey(MinerBaseType.ccminer_unstable)) { - foreach (var unstable_algo in algoSettings[MinerBaseType.ccminer_unstable]) { + if (algoSettings.ContainsKey(MinerBaseType.ccminer_alexis)) { + foreach (var unstable_algo in algoSettings[MinerBaseType.ccminer_alexis]) { unstable_algo.Enabled = false; } } @@ -215,9 +215,9 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.ccminer, AlgorithmType.X11Gost, "sib") } }, - { MinerBaseType.ccminer_unstable, + { MinerBaseType.ccminer_alexis, new List() { - new Algorithm(MinerBaseType.ccminer_unstable, AlgorithmType.X11Gost, "sib") + new Algorithm(MinerBaseType.ccminer_alexis, AlgorithmType.X11Gost, "sib") } }, { MinerBaseType.ethminer, diff --git a/NiceHashMiner/Enums/MinerBaseType.cs b/NiceHashMiner/Enums/MinerBaseType.cs index c0a1f60..510d73b 100644 --- a/NiceHashMiner/Enums/MinerBaseType.cs +++ b/NiceHashMiner/Enums/MinerBaseType.cs @@ -15,7 +15,7 @@ public enum MinerBaseType { OptiminerAMD, excavator, XmrStackCPU, - ccminer_unstable, + ccminer_alexis, END } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 0d5e8a7..b2fca9a 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -101,7 +101,7 @@ public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoT return Data.excavator; case MinerBaseType.XmrStackCPU: return Data.XmrStackCPUMiner; - case MinerBaseType.ccminer_unstable: + case MinerBaseType.ccminer_alexis: return NVIDIA_GROUPS.ccminer_unstable_path(algoType, devGroupType); } return Data.NONE; diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs index bef7720..b86e6c5 100644 --- a/NiceHashMiner/Miners/MinerFactory.cs +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -48,7 +48,7 @@ public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmTy return new excavator(); case MinerBaseType.XmrStackCPU: return new XmrStackCPUMiner(); - case MinerBaseType.ccminer_unstable: + case MinerBaseType.ccminer_alexis: return new ccminer(/*minersConfig*/); } return null; diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 5fdd1e5..b29ddcd 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -220,7 +220,7 @@ private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType miner if (MinerBaseType.sgminer == minerBaseType) { return MinerType.sgminer; } - if (MinerBaseType.ccminer == minerBaseType || MinerBaseType.ccminer_unstable == minerBaseType) { + if (MinerBaseType.ccminer == minerBaseType || MinerBaseType.ccminer_alexis == minerBaseType) { if (AlgorithmType.CryptoNight == algorithmType) { return MinerType.ccminer_CryptoNight; } From fb7954685dbfeca6271e5dd6956b888e99b9efd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 20 Feb 2017 16:06:40 +0100 Subject: [PATCH 289/366] don't half threads for xmr --- NiceHashMiner/Devices/GroupAlgorithms.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index d18c28e..96fb79b 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -114,9 +114,9 @@ public static Dictionary> CreateForDevice(Compute } } - if (algoSettings.ContainsKey(MinerBaseType.XmrStackCPU)) { - algoSettings[MinerBaseType.XmrStackCPU][0].LessThreads = device.Threads / 2; // use half - } + //if (algoSettings.ContainsKey(MinerBaseType.XmrStackCPU)) { + // algoSettings[MinerBaseType.XmrStackCPU][0].LessThreads = device.Threads / 2; // use half + //} if (algoSettings.ContainsKey(MinerBaseType.ccminer_alexis)) { foreach (var unstable_algo in algoSettings[MinerBaseType.ccminer_alexis]) { From ba097d7893c594478a44299f180d1419e1cc788b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 27 Feb 2017 12:24:05 +0100 Subject: [PATCH 290/366] fixes (xmr dual cpu, default optimizations, minox GUI fixes,...) added Claymore Etherum, remove AMD ethminer --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 3 +- NiceHashMiner/Devices/ComputeDevice.cs | 14 ++--- NiceHashMiner/Devices/GroupAlgorithms.cs | 21 +++++-- NiceHashMiner/Enums/MinerType.cs | 1 + .../Enums/XmrStackCPUMinerConfigType.cs | 11 ++++ .../Components/AlgorithmSettingsControl.cs | 26 ++++---- NiceHashMiner/Forms/Form_Benchmark.cs | 60 ++++++++----------- NiceHashMiner/Forms/Form_Main.cs | 3 + .../{ => Forms}/TextBoxKeyPressEvents.cs | 0 NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 34 ++++++++--- NiceHashMiner/Miners/ClaymoreDual.cs | 52 ++++++++++++++++ .../Miners/Equihash/ClaymoreZcashMiner.cs | 4 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 7 +-- NiceHashMiner/Miners/Miner.cs | 12 +++- NiceHashMiner/Miners/MinerFactory.cs | 2 + .../Miners/Parsing/ExtraLaunchParameters.cs | 35 ++++++++++- .../Parsing/ExtraLaunchParametersParser.cs | 3 + NiceHashMiner/Miners/XmrStackCPUMiner.cs | 41 ++++++++++--- .../{ => Miners/ethminer}/Ethereum.cs | 0 NiceHashMiner/Miners/sgminer.cs | 2 +- NiceHashMiner/NiceHashMiner.csproj | 20 ++++--- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- .../{ => Utils}/AlgorithmNiceHashNames.cs | 0 NiceHashMiner/{ => Utils}/BitcoinAddress.cs | 0 NiceHashMiner/{ => Utils}/Helpers.cs | 0 NiceHashMiner/{ => Utils}/Links.cs | 0 NiceHashMiner/{ => Utils}/Logger.cs | 0 NiceHashMiner/{ => Utils}/MemoryHelper.cs | 0 .../{ => Utils}/ProfitabilityCalculator.cs | 3 +- 29 files changed, 259 insertions(+), 99 deletions(-) create mode 100644 NiceHashMiner/Enums/XmrStackCPUMinerConfigType.cs rename NiceHashMiner/{ => Forms}/TextBoxKeyPressEvents.cs (100%) create mode 100644 NiceHashMiner/Miners/ClaymoreDual.cs rename NiceHashMiner/{ => Miners/ethminer}/Ethereum.cs (100%) rename NiceHashMiner/{ => Utils}/AlgorithmNiceHashNames.cs (100%) rename NiceHashMiner/{ => Utils}/BitcoinAddress.cs (100%) rename NiceHashMiner/{ => Utils}/Helpers.cs (100%) rename NiceHashMiner/{ => Utils}/Links.cs (100%) rename NiceHashMiner/{ => Utils}/Logger.cs (100%) rename NiceHashMiner/{ => Utils}/MemoryHelper.cs (100%) rename NiceHashMiner/{ => Utils}/ProfitabilityCalculator.cs (97%) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index 9c8a8fc..bf9486d 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -25,7 +25,7 @@ public class GeneralConfig { public int SwitchMinSecondsFixed = 90; public int SwitchMinSecondsDynamic = 30; public int SwitchMinSecondsAMD = 60; - public double SwitchProfitabilityThreshold = 0.02; // percent + public double SwitchProfitabilityThreshold = 0.05; // percent public int MinerAPIQueryInterval = 5; public int MinerRestartDelayMS = 500; @@ -97,6 +97,7 @@ public void SetDefaults() { SwitchMinSecondsFixed = 90; SwitchMinSecondsDynamic = 30; SwitchMinSecondsAMD = 90; + SwitchProfitabilityThreshold = 0.05; // percent MinIdleSeconds = 60; DisplayCurrency = "USD"; ApiBindPortPoolStart = 4000; diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index bde5521..7576b15 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -133,13 +133,13 @@ public Algorithm GetAlgorithm(MinerBaseType MinerBaseType, AlgorithmType Algorit return null; } - public Algorithm GetAlgorithm(string algoID) { - int toSetIndex = this.AlgorithmSettings.FindIndex((a) => a.AlgorithmStringID == algoID); - if (toSetIndex > -1) { - return this.AlgorithmSettings[toSetIndex]; - } - return null; - } + //public Algorithm GetAlgorithm(string algoID) { + // int toSetIndex = this.AlgorithmSettings.FindIndex((a) => a.AlgorithmStringID == algoID); + // if (toSetIndex > -1) { + // return this.AlgorithmSettings[toSetIndex]; + // } + // return null; + //} public void CopyBenchmarkSettingsFrom(ComputeDevice copyBenchCDev) { foreach (var copyFromAlgo in copyBenchCDev.AlgorithmSettings) { diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 96fb79b..c2a3647 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -105,6 +105,14 @@ public static Dictionary> CreateForDevice(Compute } } } + if (algoSettings.ContainsKey(MinerBaseType.sgminer)) { + foreach (var algo in algoSettings[MinerBaseType.sgminer]) { + if (algo.NiceHashID == AlgorithmType.DaggerHashimoto) { + algo.Enabled = false; + break; + } + } + } } } // END AMD case @@ -182,15 +190,16 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.sgminer, AlgorithmType.X11Gost, "sibcoin-mod") { ExtraLaunchParameters = DefaultParam + "--intensity 16 -w 64 -g 2" } } }, - { MinerBaseType.ethminer, - new List() { - new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto") - } - }, + //{ MinerBaseType.ethminer, + // new List() { + // new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto") + // } + //}, { MinerBaseType.ClaymoreAMD, new List() { new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.CryptoNight, "cryptonight"), /*, { ExtraLaunchParameters: "-a 4" }*/ - new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.Equihash, "equihash") + new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.Equihash, "equihash"), + new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.DaggerHashimoto, "") } }, { MinerBaseType.OptiminerAMD, diff --git a/NiceHashMiner/Enums/MinerType.cs b/NiceHashMiner/Enums/MinerType.cs index e4d9343..6c1cda6 100644 --- a/NiceHashMiner/Enums/MinerType.cs +++ b/NiceHashMiner/Enums/MinerType.cs @@ -20,6 +20,7 @@ public enum MinerType { ClaymoreCryptoNight, OptiminerZcash, excavator, + ClaymoreDual, END } } diff --git a/NiceHashMiner/Enums/XmrStackCPUMinerConfigType.cs b/NiceHashMiner/Enums/XmrStackCPUMinerConfigType.cs new file mode 100644 index 0000000..7fde6fe --- /dev/null +++ b/NiceHashMiner/Enums/XmrStackCPUMinerConfigType.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Enums { + public enum XmrStackCPUMinerConfigType { + DEFAULT = 0, + HT, + FILE + } +} diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index 85027c3..2e9a4ff 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -138,19 +138,19 @@ private void textChangedExtraLaunchParameters(object sender, EventArgs e) { } #endregion - private void buttonBenchmark_Click(object sender, EventArgs e) { - var device = new List(); - device.Add(_computeDevice); - var BenchmarkForm = new Form_Benchmark( - BenchmarkPerformanceType.Standard, - false, _currentlySelectedAlgorithm.NiceHashID); - BenchmarkForm.ShowDialog(); - fieldBoxBenchmarkSpeed.EntryText = _currentlySelectedAlgorithm.BenchmarkSpeed.ToString(); - // update lvi speed - if (_currentlySelectedLvi != null) { - _currentlySelectedLvi.SubItems[2].Text = Helpers.FormatSpeedOutput(_currentlySelectedAlgorithm.BenchmarkSpeed); - } - } + //private void buttonBenchmark_Click(object sender, EventArgs e) { + // var device = new List(); + // device.Add(_computeDevice); + // var BenchmarkForm = new Form_Benchmark( + // BenchmarkPerformanceType.Standard, + // false, _currentlySelectedAlgorithm.NiceHashID); + // BenchmarkForm.ShowDialog(); + // fieldBoxBenchmarkSpeed.EntryText = _currentlySelectedAlgorithm.BenchmarkSpeed.ToString(); + // // update lvi speed + // if (_currentlySelectedLvi != null) { + // _currentlySelectedLvi.SubItems[2].Text = Helpers.FormatSpeedOutput(_currentlySelectedAlgorithm.BenchmarkSpeed); + // } + //} } } diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 83ed004..c52a941 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -27,7 +27,7 @@ public partial class Form_Benchmark : Form, IListItemCheckColorSetter, IBenchmar private List>> _benchmarkDevicesAlgorithmQueue; private bool ExitWhenFinished = false; - private AlgorithmType _singleBenchmarkType = AlgorithmType.NONE; + //private AlgorithmType _singleBenchmarkType = AlgorithmType.NONE; private Timer _benchmarkingTimer; private int dotCount = 0; @@ -97,15 +97,12 @@ public void LviSetColor(ListViewItem lvi) { } public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = BenchmarkPerformanceType.Standard, - bool autostart = false, - //List enabledDevices = null, - AlgorithmType singleBenchmarkType = AlgorithmType.NONE) { + bool autostart = false) { InitializeComponent(); this.Icon = NiceHashMiner.Properties.Resources.logo; StartMining = false; - _singleBenchmarkType = singleBenchmarkType; benchmarkOptions1.SetPerformanceType(benchmarkPerformanceType); @@ -122,23 +119,23 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm _benchmarkingTimer.Tick += BenchmarkingTimer_Tick; _benchmarkingTimer.Interval = 1000; // 1s - // name, UUID - Dictionary benchNamesUUIDs = new Dictionary(); - // initialize benchmark settings for same cards to only copy settings - foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - var plainDevName = cDev.Name; - if (benchNamesUUIDs.ContainsKey(plainDevName)) { - cDev.Enabled = false; - cDev.BenchmarkCopyUUID = benchNamesUUIDs[plainDevName]; - } else { - benchNamesUUIDs.Add(plainDevName, cDev.UUID); - cDev.Enabled = true; // enable benchmark - cDev.BenchmarkCopyUUID = null; - } - } + //// name, UUID + //Dictionary benchNamesUUIDs = new Dictionary(); + //// initialize benchmark settings for same cards to only copy settings + //foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // var plainDevName = cDev.Name; + // if (benchNamesUUIDs.ContainsKey(plainDevName)) { + // cDev.Enabled = false; + // cDev.BenchmarkCopyUUID = benchNamesUUIDs[plainDevName]; + // } else if (cDev.Enabled == true) { + // benchNamesUUIDs.Add(plainDevName, cDev.UUID); + // //cDev.Enabled = true; // enable benchmark + // cDev.BenchmarkCopyUUID = null; + // } + //} //groupBoxAlgorithmBenchmarkSettings.Enabled = _singleBenchmarkType == AlgorithmType.NONE; - devicesListViewEnableControl1.Enabled = _singleBenchmarkType == AlgorithmType.NONE; + devicesListViewEnableControl1.Enabled = true; devicesListViewEnableControl1.SetDeviceSelectionChangedCallback(devicesListView1_ItemSelectionChanged); devicesListViewEnableControl1.SetAlgorithmsListView(algorithmsListView1); @@ -319,21 +316,14 @@ public void CalcBenchmarkDevicesAlgorithmQueue() { _benchmarkDevicesAlgorithmQueue = new List>>(); foreach (var cDev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { var algorithmQueue = new Queue(); - if (_singleBenchmarkType == AlgorithmType.NONE) { - foreach (var algo in cDev.GetAlgorithmSettings()) { - if (ShoulBenchmark(algo)) { - algorithmQueue.Enqueue(algo); - algo.SetBenchmarkPendingNoMsg(); - } else { - algo.ClearBenchmarkPending(); - } + foreach (var algo in cDev.GetAlgorithmSettings()) { + if (ShoulBenchmark(algo)) { + algorithmQueue.Enqueue(algo); + algo.SetBenchmarkPendingNoMsg(); + } else { + algo.ClearBenchmarkPending(); } } - // NOT USED for a while now - //else { // single bench - // var algo = cDev.AlgorithmSettings[_singleBenchmarkType]; - // algorithmQueue.Enqueue(algo); - //} BenchmarkSettingsStatus status; @@ -405,7 +395,7 @@ void NextBenchmark() { if (_currentDevice != null && _currentAlgorithm != null) { _currentMiner = MinerFactory.CreateMiner(_currentDevice, _currentAlgorithm); - if (_currentAlgorithm.MinerBaseType == MinerBaseType.cpuminer && _currentAlgorithm.NiceHashID == AlgorithmType.CryptoNight && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { + if (_currentAlgorithm.MinerBaseType == MinerBaseType.XmrStackCPU && _currentAlgorithm.NiceHashID == AlgorithmType.CryptoNight && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { __CPUBenchmarkStatus = new CPUBenchmarkStatus(); _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; } else { @@ -490,7 +480,7 @@ public void OnBenchmarkComplete(bool success, string status) { this.Invoke((MethodInvoker)delegate { _bechmarkedSuccessCount += success ? 1 : 0; bool rebenchSame = false; - if(success && __CPUBenchmarkStatus != null && CPUAlgos.Contains(_currentAlgorithm.NiceHashID) && _currentAlgorithm.MinerBaseType == MinerBaseType.cpuminer) { + if(success && __CPUBenchmarkStatus != null && CPUAlgos.Contains(_currentAlgorithm.NiceHashID) && _currentAlgorithm.MinerBaseType == MinerBaseType.XmrStackCPU) { if (__CPUBenchmarkStatus.HasAlreadyBenchmarked && __CPUBenchmarkStatus.BenchmarkSpeed > _currentAlgorithm.BenchmarkSpeed) { rebenchSame = false; _currentAlgorithm.BenchmarkSpeed = __CPUBenchmarkStatus.BenchmarkSpeed; diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 2eb647e..9bdd205 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -58,6 +58,8 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, private bool IsManuallyStarted = false; private bool IsMining = false; + int MainFormHeight = 0; + public Form_Main() { InitializeComponent(); @@ -135,6 +137,7 @@ private void InitMainConfigGUIData() { CurrencyConverter.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; toolStripStatusLabelBalanceDollarValue.Text = "(" + CurrencyConverter.ActiveDisplayCurrency + ")"; + toolStripStatusLabelBalanceText.Text = (CurrencyConverter.ActiveDisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; BalanceCheck_Tick(null, null); // update currency changes if (_isDeviceDetectionInitialized) { diff --git a/NiceHashMiner/TextBoxKeyPressEvents.cs b/NiceHashMiner/Forms/TextBoxKeyPressEvents.cs similarity index 100% rename from NiceHashMiner/TextBoxKeyPressEvents.cs rename to NiceHashMiner/Forms/TextBoxKeyPressEvents.cs diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index 74d9d6a..fef208f 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -20,8 +20,11 @@ public abstract class ClaymoreBaseMiner : Miner { int benchmark_read_count = 0; double benchmark_sum = 0.0d; protected readonly string LOOK_FOR_START; - const string LOOK_FOR_END = " h/s"; + const string LOOK_FOR_END = "h/s"; + // only dagger change + protected bool ignoreZero = false; + protected double api_read_mult = 1; public ClaymoreBaseMiner(string minerDeviceName, string look_FOR_START) : base(minerDeviceName) { @@ -83,6 +86,7 @@ public override APIData GetSummary() { } ad.Speed += tmpSpeed; } + ad.Speed *= api_read_mult; _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; } if (ad.Speed == 0) { @@ -186,7 +190,6 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { BenchmarkThreadRoutineCatch(ex); } finally { BenchmarkAlgorithm.BenchmarkSpeed = 0; - var status = BenchmarkProcessStatus.Finished; // find latest log file string latestLogFile = ""; var dirInfo = new DirectoryInfo(this.WorkingDirectory); @@ -203,17 +206,24 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { bench_lines.Add(line); string lineLowered = line.ToLower(); if (lineLowered.Contains(LOOK_FOR_START)) { - benchmark_sum += getNumber(lineLowered); - ++benchmark_read_count; + if (ignoreZero) { + double got = getNumber(lineLowered); + if (got != 0) { + benchmark_sum += got; + ++benchmark_read_count; + } + } else { + benchmark_sum += getNumber(lineLowered); + ++benchmark_read_count; + } } } } if (benchmark_read_count > 0) { BenchmarkAlgorithm.BenchmarkSpeed = benchmark_sum / benchmark_read_count; - status = BenchmarkProcessStatus.Success; } } - BenchmarkThreadRoutineFinish(status); + BenchmarkThreadRoutineFinish(); } } @@ -248,12 +258,22 @@ protected double getNumber(string outdata) { protected double getNumber(string outdata, string LOOK_FOR_START, string LOOK_FOR_END) { try { + double mult = 1; int speedStart = outdata.IndexOf(LOOK_FOR_START); string speed = outdata.Substring(speedStart, outdata.Length - speedStart); speed = speed.Replace(LOOK_FOR_START, ""); speed = speed.Substring(0, speed.IndexOf(LOOK_FOR_END)); + + if (speed.Contains("k")) { + mult = 1000; + speed = speed.Replace("k", ""); + } else if (speed.Contains("m")) { + mult = 1000000; + speed = speed.Replace("m", ""); + } + //Helpers.ConsolePrint("speed", speed); speed = speed.Trim(); - return Double.Parse(speed, CultureInfo.InvariantCulture); + return Double.Parse(speed, CultureInfo.InvariantCulture) * mult; } catch (Exception ex) { Helpers.ConsolePrint("getNumber", ex.Message + " | args => " + outdata + " | " + LOOK_FOR_END + " | " + LOOK_FOR_START); } diff --git a/NiceHashMiner/Miners/ClaymoreDual.cs b/NiceHashMiner/Miners/ClaymoreDual.cs new file mode 100644 index 0000000..d97df24 --- /dev/null +++ b/NiceHashMiner/Miners/ClaymoreDual.cs @@ -0,0 +1,52 @@ +using NiceHashMiner.Configs; +using NiceHashMiner.Enums; +using System; +using System.Collections.Generic; +using System.Text; + +namespace NiceHashMiner.Miners { + public class ClaymoreDual : ClaymoreBaseMiner { + + const string _LOOK_FOR_START = "ETH - Total Speed:"; + public ClaymoreDual() + : base("ClaymoreDual", _LOOK_FOR_START) { + ignoreZero = true; + api_read_mult = 1000; + ConectionType = NHMConectionType.STRATUM_TCP; + } + + protected override int GET_MAX_CooldownTimeInMilliseconds() { + return 90 * 1000; // 1.5 minute max, whole waiting time 75seconds + } + + private string GetStartCommand(string url, string btcAdress, string worker) { + string useWorker = worker; + if (useWorker == null || useWorker == "") { + useWorker = "worker1"; + } + return " " + + GetDevicesCommandString() + + String.Format("-epool {0} -ewal {1} -mport -{2} -eworker {3} -esm 3 -epsw x -mode 1 -allpools 1", url, btcAdress, APIPort, useWorker); + } + + public override void Start(string url, string btcAdress, string worker) { + string username = GetUsername(btcAdress, worker); + LastCommandLine = GetStartCommand(url, btcAdress, worker) + " -dbg -1"; + ProcessHandle = _Start(); + } + + // benchmark stuff + + protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { + // clean old logs + CleanAllOldLogs(); + + // network workaround + string url = Globals.GetLocationURL(algorithm.NiceHashID, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); + // demo for benchmark + string ret = GetStartCommand(url, Globals.DemoUser, ConfigManager.GeneralConfig.WorkerName.Trim()); + return ret; + } + + } +} diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 8a599f9..914f9ae 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -24,7 +24,7 @@ public ClaymoreZcashMiner() public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); - LastCommandLine = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -zpool " + url + " -zwal " + username + " -zpsw x -dbg -1"; + LastCommandLine = " " + GetDevicesCommandString() + " -mport 127.0.0.1:" + APIPort + " -zpool " + url + " -zwal " + username + " -zpsw x -dbg -1"; ProcessHandle = _Start(); } @@ -35,7 +35,7 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti //benchmarkTimeWait = time / 3; // 3 times faster than sgminer //benchmarkTimeWait = 30; // when debugging - string ret = " -benchmark 1 " + GetDevicesCommandString(); + string ret = " -mport 127.0.0.1:" + APIPort + " -benchmark 1 " + GetDevicesCommandString(); return ret; } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index b2fca9a..fa14da2 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -43,10 +43,6 @@ public static class Data { /// /// sgminers /// - //public const string sgminer_5_1_0_optimized = _bin + @"\sgminer-5-1-0-optimized\sgminer.exe"; - ////public const string sgminer_5_1_1_optimized = _bin + @"\sgminer-5-1-1-optimized\sgminer.exe"; - //public const string sgminer_5_4_0_tweaked = _bin + @"\sgminer-5-4-0-tweaked\sgminer.exe"; - public const string sgminer_5_6_0_general = _bin + @"\sgminer-5-6-0-general\sgminer.exe"; public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; @@ -70,6 +66,7 @@ public static class Data { public const string ClaymoreZcashMiner = _bin_3rdparty + @"\claymore_zcash\ZecMiner64.exe"; public const string ClaymoreCryptoNightMiner = _bin_3rdparty + @"\claymore_cryptonight\NsGpuCNMiner.exe"; public const string OptiminerZcashMiner = _bin_3rdparty + @"\optiminer_zcash_win\Optiminer.exe"; + public const string ClaymoreDual = _bin_3rdparty + @"\claymore_dual\EthDcrMiner64.exe"; } // NEW START @@ -221,6 +218,8 @@ public static string ClaymorePath(AlgorithmType type) { return Data.ClaymoreZcashMiner; } else if(AlgorithmType.CryptoNight == type) { return Data.ClaymoreCryptoNightMiner; + } else if (AlgorithmType.DaggerHashimoto == type) { + return Data.ClaymoreDual; } return Data.NONE; // should not happen } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index ab93878..34c807e 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -483,7 +483,13 @@ protected void BenchmarkThreadRoutineCatch(Exception ex) { } } - protected void BenchmarkThreadRoutineFinish(BenchmarkProcessStatus status) { + protected void BenchmarkThreadRoutineFinish() { + BenchmarkProcessStatus status = BenchmarkProcessStatus.Finished; + + if (BenchmarkAlgorithm.BenchmarkSpeed > 0) { + status = BenchmarkProcessStatus.Success; + } + using (StreamWriter sw = File.AppendText(benchmarkLogPath)) { foreach (var line in bench_lines) { sw.WriteLine(line); @@ -494,7 +500,7 @@ protected void BenchmarkThreadRoutineFinish(BenchmarkProcessStatus status) { Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(true, "Success"); + BenchmarkComunicator.OnBenchmarkComplete(BenchmarkProcessStatus.Success == status, "Success"); } } @@ -535,7 +541,7 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { } catch (Exception ex) { BenchmarkThreadRoutineCatch(ex); } finally { - BenchmarkThreadRoutineFinish(BenchmarkProcessStatus.Success); + BenchmarkThreadRoutineFinish(); } } diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs index b86e6c5..17840c3 100644 --- a/NiceHashMiner/Miners/MinerFactory.cs +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -22,6 +22,8 @@ private static Miner CreateClaymore(AlgorithmType algorithmType) { return new ClaymoreZcashMiner(/*minersConfig*/); } else if (AlgorithmType.CryptoNight == algorithmType) { return new ClaymoreCryptoNightMiner(/*minersConfig*/); + } else if (AlgorithmType.DaggerHashimoto == algorithmType) { + return new ClaymoreDual(/*minersConfig*/); } return null; } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 8fafbbc..86606c9 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -190,7 +190,40 @@ public static class ExtraLaunchParameters { }, new List() ), - + new MinerOptionPackage( + MinerType.ClaymoreDual, + new List() { + new MinerOption("ClaymoreDual_etha" , "-etha", "-etha", "-1", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreDual_ethi" , "-ethi", "-ethi", "8", MinerOptionFlagType.MultiParam, ","), + + new MinerOption("ClaymoreDual_eres" , "-eres", "-eres", "2", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_erate" , "-erate", "-erate", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_estale" , "-estale", "-estale", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_gser" , "-gser", "-gser", "0", MinerOptionFlagType.SingleParam, ","), + + new MinerOption("ClaymoreDual_wd" , "-wd", "-wd", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_retrydelay" , "-retrydelay", "-retrydelay", "20", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_nofee" , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_li" , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreDual_lidag" , "-lidag", "-lidag", "0", MinerOptionFlagType.MultiParam, ","), + + //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all + new MinerOption("ClaymoreDual_cclock" , "-cclock", "-cclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreDual_mclock" , "-mclock", "-mclock", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreDual_powlim" , "-powlim", "-powlim", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreDual_cvddc" , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreDual_mvddc" , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), + }, + new List() { + // temperature stuff + //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all + new MinerOption("ClaymoreDual_tt" , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_ttli" , "-ttli", "-ttli", "70", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_tstop" , "-tstop", "-tstop", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_fanmax" , "-fanmax", "-fanmax", "100", MinerOptionFlagType.MultiParam, ","), + new MinerOption("ClaymoreDual_fanmin" , "-fanmin", "-fanmin", "0", MinerOptionFlagType.MultiParam, ","), + } + ), }; private static List MinerOptionPackages = new List(); diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index b29ddcd..f2af9b6 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -233,6 +233,9 @@ private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType miner if (AlgorithmType.Equihash == algorithmType) { return MinerType.ClaymoreZcash; } + if (AlgorithmType.DaggerHashimoto == algorithmType) { + return MinerType.ClaymoreDual; + } } if (MinerBaseType.ethminer == minerBaseType) { if(DeviceType.AMD == deviceType) { diff --git a/NiceHashMiner/Miners/XmrStackCPUMiner.cs b/NiceHashMiner/Miners/XmrStackCPUMiner.cs index 0607a45..047e0b1 100644 --- a/NiceHashMiner/Miners/XmrStackCPUMiner.cs +++ b/NiceHashMiner/Miners/XmrStackCPUMiner.cs @@ -5,6 +5,7 @@ using NiceHashMiner.Miners.Parsing; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Globalization; using System.Net.Sockets; using System.Text; @@ -192,21 +193,27 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { return 3600000; // 1hour } + + private string GetConfigFileName() { + return String.Format("config_{0}.txt", this.MiningSetup.MiningPairs[0].Device.ID); + } + private void prepareConfigFile(string pool, string wallet) { if (this.MiningSetup.MiningPairs.Count > 0) { try { int numTr = ExtraLaunchParametersParser.GetThreadsNumber(this.MiningSetup.MiningPairs[0]); - if (ComputeDeviceManager.Avaliable.IsHyperThreadingEnabled) { - numTr /= 2; - } + //if (ComputeDeviceManager.Avaliable.IsHyperThreadingEnabled) { + // numTr /= 2; + //} var config = new XmrStackCPUMinerConfig(numTr, pool, wallet, this.APIPort); - config.Inti_cpu_threads_conf(false, false, true, ComputeDeviceManager.Avaliable.IsHyperThreadingEnabled); + //config.Inti_cpu_threads_conf(false, false, true, ComputeDeviceManager.Avaliable.IsHyperThreadingEnabled); + config.Inti_cpu_threads_conf(false, false, false, false); var confJson = JObject.FromObject(config); string writeStr = confJson.ToString(); int start = writeStr.IndexOf("{"); int end = writeStr.LastIndexOf("}"); writeStr = writeStr.Substring(start + 1, end - 1); - System.IO.File.WriteAllText(WorkingDirectory + "config.txt", writeStr); + System.IO.File.WriteAllText(WorkingDirectory + GetConfigFileName(), writeStr); } catch { } } @@ -257,18 +264,38 @@ public override void Start(string url, string btcAdress, string worker) { return; } string username = GetUsername(btcAdress, worker); - LastCommandLine = "config.txt"; + LastCommandLine = GetConfigFileName(); prepareConfigFile(url, username); ProcessHandle = _Start(); } + protected override NiceHashProcess _Start() { + NiceHashProcess P = base._Start(); + + var AffinityMask = MiningSetup.MiningPairs[0].Device.AffinityMask; + if (AffinityMask != 0 && P != null) + CPUID.AdjustAffinity(P.Id, AffinityMask); + + return P; + } + // doesn't work stubs protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { string url = Globals.GetLocationURL(algorithm.NiceHashID, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); prepareConfigFile(url, Globals.DemoUser); - return "benchmark_mode config.txt"; + return "benchmark_mode " + GetConfigFileName(); + } + + protected override Process BenchmarkStartProcess(string CommandLine) { + Process BenchmarkHandle = base.BenchmarkStartProcess(CommandLine); + + var AffinityMask = MiningSetup.MiningPairs[0].Device.AffinityMask; + if (AffinityMask != 0 && BenchmarkHandle != null) + CPUID.AdjustAffinity(BenchmarkHandle.Id, AffinityMask); + + return BenchmarkHandle; } protected override bool BenchmarkParseLine(string outdata) { diff --git a/NiceHashMiner/Ethereum.cs b/NiceHashMiner/Miners/ethminer/Ethereum.cs similarity index 100% rename from NiceHashMiner/Ethereum.cs rename to NiceHashMiner/Miners/ethminer/Ethereum.cs diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 49b2dd5..def33fa 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -262,7 +262,7 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { } catch (Exception ex) { BenchmarkThreadRoutineCatch(ex); } finally { - BenchmarkThreadRoutineFinish(BenchmarkProcessStatus.Success); + BenchmarkThreadRoutineFinish(); } } diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 8b1a1ca..202f098 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -80,7 +80,9 @@ - + + + @@ -195,8 +197,8 @@ - - + + @@ -231,7 +233,7 @@ - + @@ -240,8 +242,8 @@ DriverVersionConfirmationDialog.cs - - + + @@ -256,7 +258,7 @@ Form_Loading.cs - + Form @@ -266,11 +268,11 @@ - + - + diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index f5f9d97..c4c234b 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.1")] -[assembly: AssemblyFileVersion("1.7.5.1")] +[assembly: AssemblyVersion("1.7.5.2")] +[assembly: AssemblyFileVersion("1.7.5.2")] diff --git a/NiceHashMiner/AlgorithmNiceHashNames.cs b/NiceHashMiner/Utils/AlgorithmNiceHashNames.cs similarity index 100% rename from NiceHashMiner/AlgorithmNiceHashNames.cs rename to NiceHashMiner/Utils/AlgorithmNiceHashNames.cs diff --git a/NiceHashMiner/BitcoinAddress.cs b/NiceHashMiner/Utils/BitcoinAddress.cs similarity index 100% rename from NiceHashMiner/BitcoinAddress.cs rename to NiceHashMiner/Utils/BitcoinAddress.cs diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Utils/Helpers.cs similarity index 100% rename from NiceHashMiner/Helpers.cs rename to NiceHashMiner/Utils/Helpers.cs diff --git a/NiceHashMiner/Links.cs b/NiceHashMiner/Utils/Links.cs similarity index 100% rename from NiceHashMiner/Links.cs rename to NiceHashMiner/Utils/Links.cs diff --git a/NiceHashMiner/Logger.cs b/NiceHashMiner/Utils/Logger.cs similarity index 100% rename from NiceHashMiner/Logger.cs rename to NiceHashMiner/Utils/Logger.cs diff --git a/NiceHashMiner/MemoryHelper.cs b/NiceHashMiner/Utils/MemoryHelper.cs similarity index 100% rename from NiceHashMiner/MemoryHelper.cs rename to NiceHashMiner/Utils/MemoryHelper.cs diff --git a/NiceHashMiner/ProfitabilityCalculator.cs b/NiceHashMiner/Utils/ProfitabilityCalculator.cs similarity index 97% rename from NiceHashMiner/ProfitabilityCalculator.cs rename to NiceHashMiner/Utils/ProfitabilityCalculator.cs index 0116176..90fc5f8 100644 --- a/NiceHashMiner/ProfitabilityCalculator.cs +++ b/NiceHashMiner/Utils/ProfitabilityCalculator.cs @@ -41,7 +41,8 @@ static class ProfitabilityCalculator { { AlgorithmType.CryptoNight , kHs }, { AlgorithmType.Lbry , GHs }, { AlgorithmType.Equihash , 1 }, // Sols /s - { AlgorithmType.Pascal , GHs }, // Sols /s + { AlgorithmType.Pascal , GHs }, + { AlgorithmType.X11Gost , MHs }, }; public static double GetFormatedSpeed(double speed, AlgorithmType type) { From cd6d723c84ebfb1c96e83dbba72c29c107cc47cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 27 Feb 2017 15:15:10 +0100 Subject: [PATCH 291/366] fix height calculation (GUI BUG) --- NiceHashMiner/Forms/Form_Main.cs | 32 ++++++++++++++---------- NiceHashMiner/Miners/XmrStackCPUMiner.cs | 1 + 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 9bdd205..c94acaa 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -59,6 +59,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, private bool IsMining = false; int MainFormHeight = 0; + int EmtpyGroupPanelHeight = 0; public Form_Main() { @@ -89,6 +90,14 @@ public Form_Main() // for resizing InitFlowPanelStart(); + + if (groupBox1.Size.Height > 0 && this.Size.Height > 0) { + EmtpyGroupPanelHeight = groupBox1.Size.Height; + MainFormHeight = this.Size.Height - EmtpyGroupPanelHeight; + } else { + EmtpyGroupPanelHeight = 59; + MainFormHeight = 330 - EmtpyGroupPanelHeight; + } ClearRatesALL(); } @@ -452,7 +461,6 @@ public void ClearRatesALL() { } public void ClearRates(int groupCount) { - float panelHeight = -1; if (flowLayoutPanelVisibleCount != groupCount) { flowLayoutPanelVisibleCount = groupCount; // hide some Controls @@ -463,21 +471,19 @@ public void ClearRates(int groupCount) { } } flowLayoutPanelRatesIndex = 0; - int visibleGroupCount = groupCount + 1; - if (visibleGroupCount <= 0) visibleGroupCount = 1; - if (panelHeight <= 0) { - if (flowLayoutPanelRates.Controls != null && flowLayoutPanelRates.Controls.Count > 0) { - var control = flowLayoutPanelRates.Controls[0]; - panelHeight = ((GroupProfitControl)control).Size.Height * 1.2f; - } else { - panelHeight = 40; - } + int visibleGroupCount = 1; + if (groupCount > 0) visibleGroupCount += groupCount; + + int groupBox1Height = EmtpyGroupPanelHeight; + if (flowLayoutPanelRates.Controls != null && flowLayoutPanelRates.Controls.Count > 0) { + var control = flowLayoutPanelRates.Controls[0]; + float panelHeight = ((GroupProfitControl)control).Size.Height * 1.2f; + groupBox1Height = (int)((visibleGroupCount) * panelHeight); } - var oldHeight = groupBox1.Size.Height; - groupBox1.Size = new Size(groupBox1.Size.Width, (int)( (visibleGroupCount) * panelHeight )); + groupBox1.Size = new Size(groupBox1.Size.Width, groupBox1Height); // set new height - this.Size = new Size(this.Size.Width, this.Size.Height + groupBox1.Size.Height - oldHeight); + this.Size = new Size(this.Size.Width, MainFormHeight + groupBox1Height); } public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPIData, double paying, bool isApiGetException) { diff --git a/NiceHashMiner/Miners/XmrStackCPUMiner.cs b/NiceHashMiner/Miners/XmrStackCPUMiner.cs index 047e0b1..b553712 100644 --- a/NiceHashMiner/Miners/XmrStackCPUMiner.cs +++ b/NiceHashMiner/Miners/XmrStackCPUMiner.cs @@ -187,6 +187,7 @@ public class XmrStackCPUMiner : Miner { public XmrStackCPUMiner() : base("XmrStackCPUMiner") { this.ConectionType = NHMConectionType.NONE; + IsNeverHideMiningWindow = true; } protected override int GET_MAX_CooldownTimeInMilliseconds() { From c6a4f693c87bb98edc10ca86c314fcdc5f961d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 27 Feb 2017 18:56:24 +0100 Subject: [PATCH 292/366] update 3rd party dl link, check ClaymoreDual miner --- NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs | 4 +++- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs index decd2ba..51ef112 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN_3rd.cs @@ -829,7 +829,9 @@ public static class Bins_Data_3rd { @"\optiminer_zcash_win\bin-223600\Tonga_round6.bin", @"\optiminer_zcash_win\bin-223600\Tonga_round7.bin", @"\optiminer_zcash_win\bin-223600\Tonga_round8.bin", -@"\optiminer_zcash_win\bin-223600\Tonga_round9.bin" +@"\optiminer_zcash_win\bin-223600\Tonga_round9.bin", + +@"\claymore_dual\EthDcrMiner64.exe", }; #endregion //CODE_GEN STUFF // listFiles.py } diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 92ab3c0..ed766c5 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -20,7 +20,7 @@ public static class MinersDownloadManager { "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_5_0.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_5_2.zip", "bins_3rdparty.zip", "bin_3rdparty"); From b6d366ab0530f73b1aa7f096d7b3b6bf5ff102b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 28 Feb 2017 13:23:13 +0100 Subject: [PATCH 293/366] sgminer benchmark seconds fix --- NiceHashMiner/Miners/sgminer.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index def33fa..a259c80 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -20,8 +20,6 @@ namespace NiceHashMiner.Miners class sgminer : Miner { private readonly int GPUPlatformNumber; - // benchmark helper variables - bool _benchmarkOnce = true; Stopwatch _benchmarkTimer = new Stopwatch(); public sgminer() @@ -194,12 +192,11 @@ protected override void BenchmarkThreadRoutineStartSettup() { } protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { - if (_benchmarkTimer.Elapsed.Minutes >= BenchmarkTimeInSeconds + 1 && _benchmarkOnce == true) { - _benchmarkOnce = false; + if (_benchmarkTimer.Elapsed.Seconds >= BenchmarkTimeInSeconds) { string resp = GetAPIData(APIPort, "quit").TrimEnd(new char[] { (char)0 }); Helpers.ConsolePrint("BENCHMARK", "SGMiner Response: " + resp); } - if (_benchmarkTimer.Elapsed.Minutes >= BenchmarkTimeInSeconds + 2) { + if (_benchmarkTimer.Elapsed.Seconds >= BenchmarkTimeInSeconds + 2) { _benchmarkTimer.Stop(); // this is safe in a benchmark KillSGMiner(); From 997bf42551984463671bd22856d3f25defbadaaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 28 Feb 2017 16:10:47 +0100 Subject: [PATCH 294/366] claymore zec test -asm when benchmarking --- NiceHashMiner/Forms/Form_Benchmark.cs | 79 ++++++++++++++++++++++++++- NiceHashMiner/Miners/Miner.cs | 5 ++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index c52a941..f72842d 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -61,6 +61,55 @@ private class CPUBenchmarkStatus { } private CPUBenchmarkStatus __CPUBenchmarkStatus = null; + private class ClaymoreZcashStatus { + private const int MAX_BENCH = 2; + private readonly string[] ASM_MODES = new string[] { " -asm 0", " -asm 1" }; + + private double[] speeds = new double[] { 0.0d, 0.0d }; + private int CurIndex = 0; + private readonly string originalExtraParams; + + public ClaymoreZcashStatus(string oep) { + originalExtraParams = oep; + } + + public bool HasTest() { + return CurIndex < MAX_BENCH; + } + + public void SetSpeed(double speed) { + if (HasTest()) { + speeds[CurIndex] = speed; + } + } + + public void SetNext() { + CurIndex += 1; + } + + public string GetTestExtraParams() { + if (HasTest()) { + return originalExtraParams + ASM_MODES[CurIndex]; + } + return originalExtraParams; + } + + private int FastestIndex() { + if (speeds[1] > speeds[0]) { + return 1; + } + return 0; + } + + public string GetFastestExtraParams() { + return originalExtraParams + ASM_MODES[FastestIndex()]; + } + public double GetFastestTime() { + return speeds[FastestIndex()]; + } + } + private ClaymoreZcashStatus __ClaymoreZcashStatus = null; + // CPU sweet spots private List CPUAlgos = new List() { AlgorithmType.CryptoNight @@ -401,6 +450,12 @@ void NextBenchmark() { } else { __CPUBenchmarkStatus = null; } + if (_currentAlgorithm.MinerBaseType == MinerBaseType.ClaymoreAMD && _currentAlgorithm.NiceHashID == AlgorithmType.Equihash && _currentAlgorithm.ExtraLaunchParameters != null && !_currentAlgorithm.ExtraLaunchParameters.Contains("-asm")) { + __ClaymoreZcashStatus = new ClaymoreZcashStatus(_currentAlgorithm.ExtraLaunchParameters); + _currentAlgorithm.ExtraLaunchParameters = __ClaymoreZcashStatus.GetTestExtraParams(); + } else { + __ClaymoreZcashStatus = null; + } } if (_currentMiner != null && _currentAlgorithm != null) { @@ -498,6 +553,24 @@ public void OnBenchmarkComplete(bool success, string status) { } } + if (__ClaymoreZcashStatus != null && _currentAlgorithm.MinerBaseType == MinerBaseType.ClaymoreAMD && _currentAlgorithm.NiceHashID == AlgorithmType.Equihash) { + if (__ClaymoreZcashStatus.HasTest()) { + rebenchSame = true; + __ClaymoreZcashStatus.SetSpeed(_currentAlgorithm.BenchmarkSpeed); + __ClaymoreZcashStatus.SetNext(); + _currentAlgorithm.ExtraLaunchParameters = __ClaymoreZcashStatus.GetTestExtraParams(); + Helpers.ConsolePrint("ClaymoreAMD_Equihash", _currentAlgorithm.ExtraLaunchParameters); + _currentMiner.InitBenchmarkSetup(new MiningPair(_currentDevice, _currentAlgorithm)); + } + + if (__ClaymoreZcashStatus.HasTest() == false) { + rebenchSame = false; + // set fastest mode + _currentAlgorithm.BenchmarkSpeed = __ClaymoreZcashStatus.GetFastestTime(); + _currentAlgorithm.ExtraLaunchParameters = __ClaymoreZcashStatus.GetFastestExtraParams(); + } + } + if(!rebenchSame) { _benchmarkingTimer.Stop(); } @@ -516,7 +589,11 @@ public void OnBenchmarkComplete(bool success, string status) { algorithmsListView1.SetSpeedStatus(_currentDevice, _currentAlgorithm, ""); } if (rebenchSame) { - _currentMiner.BenchmarkStart(__CPUBenchmarkStatus.Time, this); + if (__CPUBenchmarkStatus != null) { + _currentMiner.BenchmarkStart(__CPUBenchmarkStatus.Time, this); + } else if (__ClaymoreZcashStatus != null) { + _currentMiner.BenchmarkStart(45, this); + } } else { NextBenchmark(); } diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 34c807e..160df54 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -348,6 +348,7 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { BenchmarkHandle.StartInfo.CreateNoWindow = true; BenchmarkHandle.OutputDataReceived += BenchmarkOutputErrorDataReceived; BenchmarkHandle.ErrorDataReceived += BenchmarkOutputErrorDataReceived; + BenchmarkHandle.Exited += BenchmarkHandle_Exited; if (!BenchmarkHandle.Start()) return null; @@ -359,6 +360,10 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { return BenchmarkHandle; } + void BenchmarkHandle_Exited(object sender, EventArgs e) { + BenchmarkSignalFinnished = true; + } + private void BenchmarkOutputErrorDataReceived(object sender, DataReceivedEventArgs e) { if (BenchmarkTimeOutStopWatch == null) { BenchmarkTimeOutStopWatch = new Stopwatch(); From 1988262a053a7ad917153addaa890a96c3e9bfe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 28 Feb 2017 16:33:14 +0100 Subject: [PATCH 295/366] Fix Claymore default optimization settings --- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index c2a3647..20bc52b 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -57,7 +57,7 @@ public static Dictionary> CreateForDevice(Compute // check if 3rd party is enabled and allow 3rd party only algos if (algoSettings.ContainsKey(MinerBaseType.ClaymoreAMD)) { - var ClaymoreAlgos = algoSettings[MinerBaseType.sgminer]; + var ClaymoreAlgos = algoSettings[MinerBaseType.ClaymoreAMD]; int CryptoNight_Index = ClaymoreAlgos.FindIndex((el) => el.NiceHashID == AlgorithmType.CryptoNight); if (CryptoNight_Index > -1) { //string regex_a_3 = "[5|6][0-9][0-9][0-9]"; From 9767dad4725d668d626c75f3bbd972aaae841391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 28 Feb 2017 21:35:44 +0100 Subject: [PATCH 296/366] update bins dl link --- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index ed766c5..d22aa81 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_1.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_2.zip", "bins.zip", "bin"); From 5845b2caf51a723207ac8acd0b2454e84306f898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 28 Feb 2017 22:44:55 +0100 Subject: [PATCH 297/366] add needed space --- NiceHashMiner/Miners/ClaymoreDual.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/ClaymoreDual.cs b/NiceHashMiner/Miners/ClaymoreDual.cs index d97df24..b686332 100644 --- a/NiceHashMiner/Miners/ClaymoreDual.cs +++ b/NiceHashMiner/Miners/ClaymoreDual.cs @@ -26,7 +26,7 @@ private string GetStartCommand(string url, string btcAdress, string worker) { } return " " + GetDevicesCommandString() - + String.Format("-epool {0} -ewal {1} -mport -{2} -eworker {3} -esm 3 -epsw x -mode 1 -allpools 1", url, btcAdress, APIPort, useWorker); + + String.Format(" -epool {0} -ewal {1} -mport -{2} -eworker {3} -esm 3 -epsw x -mode 1 -allpools 1", url, btcAdress, APIPort, useWorker); } public override void Start(string url, string btcAdress, string worker) { From 8dc28dcd646724ae77ad7d1fc960788ae0fc165d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 1 Mar 2017 09:53:09 +0100 Subject: [PATCH 298/366] fix warning notice --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index ff34816..7f255aa 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -210,7 +210,7 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { double total_GPU_RAM = (Avaliable.NVIDIA_RAM_SUM + Avaliable.AMD_RAM_SUM) / 1024; // b to kb double total_Sys_RAM = SystemSpecs.FreePhysicalMemory + SystemSpecs.FreeVirtualMemory; // check - if (total_Sys_RAM < total_GPU_RAM * 0.6) { + if (ConfigManager.GeneralConfig.ShowDriverVersionWarning && total_Sys_RAM < total_GPU_RAM * 0.6) { Helpers.ConsolePrint(TAG, "virtual memory size BAD"); MessageBox.Show(International.GetText("VirtualMemorySize_BAD"), International.GetText("Warning_with_Exclamation"), From f0d15d9258cb352fc36e1195b50146fda1fb6b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 1 Mar 2017 10:32:32 +0100 Subject: [PATCH 299/366] XMR culture invariant parse fix --- NiceHashMiner/Miners/XmrStackCPUMiner.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/XmrStackCPUMiner.cs b/NiceHashMiner/Miners/XmrStackCPUMiner.cs index b553712..d967524 100644 --- a/NiceHashMiner/Miners/XmrStackCPUMiner.cs +++ b/NiceHashMiner/Miners/XmrStackCPUMiner.cs @@ -305,7 +305,7 @@ protected override bool BenchmarkParseLine(string outdata) { var strings = toParse.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (var s in strings) { double lastSpeed = 0; - if (double.TryParse(s, out lastSpeed)) { + if (double.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out lastSpeed)) { BenchmarkAlgorithm.BenchmarkSpeed = Helpers.ParseDouble(s); return true; } From f34a7cb792ef1615858e2a0afe8ce521c6c2af6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 1 Mar 2017 12:42:05 +0100 Subject: [PATCH 300/366] add '--remove-disabled' by default for sgminer --- NiceHashMiner/Devices/AmdGpuDevice.cs | 6 +++--- NiceHashMiner/Devices/GroupAlgorithms.cs | 5 +++-- NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Devices/AmdGpuDevice.cs b/NiceHashMiner/Devices/AmdGpuDevice.cs index 25b3d6c..7a1000c 100644 --- a/NiceHashMiner/Devices/AmdGpuDevice.cs +++ b/NiceHashMiner/Devices/AmdGpuDevice.cs @@ -6,9 +6,9 @@ namespace NiceHashMiner.Devices { [Serializable] public class AmdGpuDevice { - public static readonly string DefaultParam = "--keccak-unroll 0 --hamsi-expand-big 4 "; - public static readonly string TemperatureParam = " --gpu-fan 30-95 --temp-cutoff 95 --temp-overheat 90" + - " --temp-target 75 --auto-fan --auto-gpu"; + public static readonly string DefaultParam = "--keccak-unroll 0 --hamsi-expand-big 4 --remove-disabled "; + public static readonly string TemperatureParam = " --gpu-fan 30-95 --temp-cutoff 95 --temp-overheat 90 " + + " --temp-target 75 --auto-fan --auto-gpu "; public int DeviceID { get { return (int)_openClSubset.DeviceID; } } public string DeviceName; // init this with the ADL diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 20bc52b..fbe0084 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -176,14 +176,15 @@ public static Dictionary> CreateDefaultsForGroup( } if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { // DisableAMDTempControl = false; TemperatureParam must be appended lastly + string RemDis = " --remove-disabled "; string DefaultParam = AmdGpuDevice.DefaultParam; return new Dictionary>() { { MinerBaseType.sgminer, new List() { new Algorithm(MinerBaseType.sgminer, AlgorithmType.NeoScrypt, "neoscrypt") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lyra2REv2, "Lyra2REv2") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.DaggerHashimoto, "ethash") { ExtraLaunchParameters = "--xintensity 512 -w 192 -g 1" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.DaggerHashimoto, "ethash") { ExtraLaunchParameters = RemDis + "--xintensity 512 -w 192 -g 1" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = RemDis + "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Pascal, "pascal") { ExtraLaunchParameters = DefaultParam + "--intensity 21 -w 64 -g 2" }, diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 86606c9..21b9d31 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -60,6 +60,7 @@ public static class ExtraLaunchParameters { new MinerOption("GpuThreads", "-g", "--gpu-threads", "1", MinerOptionFlagType.MultiParam, ","), new MinerOption("LookupGap", "", "--lookup-gap", "-1", MinerOptionFlagType.MultiParam, ","), // default none // Uni + new MinerOption("RemoveDisabled", "--remove-disabled", "--remove-disabled", "", MinerOptionFlagType.Uni, ""), // default none }, // TemperatureOptions new List() { From 5c62ff56a66f16b2650cde653036b0faf1c3f4e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 1 Mar 2017 12:49:41 +0100 Subject: [PATCH 301/366] double parse extra check --- NiceHashMiner/Utils/Helpers.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Utils/Helpers.cs b/NiceHashMiner/Utils/Helpers.cs index 3c18ddf..f49aa64 100644 --- a/NiceHashMiner/Utils/Helpers.cs +++ b/NiceHashMiner/Utils/Helpers.cs @@ -204,7 +204,8 @@ public static long ParseLong(string text) { } public static double ParseDouble(string text) { try { - return Double.Parse(text, CultureInfo.InvariantCulture); + string parseText = text.Replace(',', '.'); + return Double.Parse(parseText, CultureInfo.InvariantCulture); } catch { return 0; } From 366e23f212ae79a6c53ba30a495fe706fde916d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 1 Mar 2017 13:17:11 +0100 Subject: [PATCH 302/366] AMD remove NeoScrypt --- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- NiceHashMiner/Miners/XmrStackCPUMiner.cs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index fbe0084..6b894e2 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -181,7 +181,7 @@ public static Dictionary> CreateDefaultsForGroup( return new Dictionary>() { { MinerBaseType.sgminer, new List() { - new Algorithm(MinerBaseType.sgminer, AlgorithmType.NeoScrypt, "neoscrypt") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" }, + //new Algorithm(MinerBaseType.sgminer, AlgorithmType.NeoScrypt, "neoscrypt") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lyra2REv2, "Lyra2REv2") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.DaggerHashimoto, "ethash") { ExtraLaunchParameters = RemDis + "--xintensity 512 -w 192 -g 1" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = RemDis + "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, diff --git a/NiceHashMiner/Miners/XmrStackCPUMiner.cs b/NiceHashMiner/Miners/XmrStackCPUMiner.cs index d967524..c603a84 100644 --- a/NiceHashMiner/Miners/XmrStackCPUMiner.cs +++ b/NiceHashMiner/Miners/XmrStackCPUMiner.cs @@ -306,6 +306,7 @@ protected override bool BenchmarkParseLine(string outdata) { foreach (var s in strings) { double lastSpeed = 0; if (double.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out lastSpeed)) { + Helpers.ConsolePrint("BENCHMARK " + MinerTAG(), "double.TryParse true. Last speed is" + lastSpeed.ToString()); BenchmarkAlgorithm.BenchmarkSpeed = Helpers.ParseDouble(s); return true; } From 0b9c99c0a6708f79104dd460ada78d07ba876103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 1 Mar 2017 17:05:28 +0100 Subject: [PATCH 303/366] claymore subtract fee from benchmark --- NiceHashMiner/Globals.cs | 2 +- NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 4 +++- NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs | 4 ++++ NiceHashMiner/Miners/ClaymoreDual.cs | 4 ++++ NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs | 4 ++++ 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index 8a5e6ad..a10a8b5 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -20,7 +20,7 @@ public class Globals { public static bool IsEllesmereSgminerIgnore = true; // change this if TOS changes - public static int CURRENT_TOS_VER = 1; + public static int CURRENT_TOS_VER = 2; public static string GetLocationURL(AlgorithmType AlgorithmType, string miningLocation, NHMConectionType ConectionType) { if (Globals.NiceHashData != null && Globals.NiceHashData.ContainsKey(AlgorithmType)) { diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index fef208f..ae1a2ab 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -33,6 +33,8 @@ public ClaymoreBaseMiner(string minerDeviceName, string look_FOR_START) IsKillAllUsedMinerProcs = true; } + protected abstract double DevFee(); + protected override int GET_MAX_CooldownTimeInMilliseconds() { return 60 * 1000 * 5; // 5 minute max, whole waiting time 75seconds } @@ -273,7 +275,7 @@ protected double getNumber(string outdata, string LOOK_FOR_START, string LOOK_FO } //Helpers.ConsolePrint("speed", speed); speed = speed.Trim(); - return Double.Parse(speed, CultureInfo.InvariantCulture) * mult; + return (Double.Parse(speed, CultureInfo.InvariantCulture) * mult) * (1.0 - DevFee() * 0.01); } catch (Exception ex) { Helpers.ConsolePrint("getNumber", ex.Message + " | args => " + outdata + " | " + LOOK_FOR_END + " | " + LOOK_FOR_START); } diff --git a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs index 9664844..9e8ab3b 100644 --- a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs @@ -19,6 +19,10 @@ public ClaymoreCryptoNightMiner() : base("ClaymoreCryptoNightMiner", _LOOK_FOR_START) { } + protected override double DevFee() { + return 2.0; + } + public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); LastCommandLine = " " + GetDevicesCommandString() + " -mport -" + APIPort + " -o " + url + " -u " + username + " -p x -dbg -1"; diff --git a/NiceHashMiner/Miners/ClaymoreDual.cs b/NiceHashMiner/Miners/ClaymoreDual.cs index b686332..e4f4c7b 100644 --- a/NiceHashMiner/Miners/ClaymoreDual.cs +++ b/NiceHashMiner/Miners/ClaymoreDual.cs @@ -15,6 +15,10 @@ public ClaymoreDual() ConectionType = NHMConectionType.STRATUM_TCP; } + protected override double DevFee() { + return 1.0; + } + protected override int GET_MAX_CooldownTimeInMilliseconds() { return 90 * 1000; // 1.5 minute max, whole waiting time 75seconds } diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 914f9ae..e7a21d5 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -21,6 +21,10 @@ public ClaymoreZcashMiner() : base("ClaymoreZcashMiner", _LOOK_FOR_START) { } + protected override double DevFee() { + return 2.0; + } + public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); From 38e3aaae218be9132a2466ca66b3f9f69387419b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 2 Mar 2017 10:33:48 +0100 Subject: [PATCH 304/366] fixes, claymore dual aditional params --- NiceHashMiner/Devices/GroupAlgorithms.cs | 20 +++++++++--------- NiceHashMiner/Forms/Form_Main.cs | 14 +++++++++++++ NiceHashMiner/Miners/ClaymoreDual.cs | 4 +++- NiceHashMiner/Miners/Miner.cs | 4 +++- .../Miners/Parsing/ExtraLaunchParameters.cs | 21 +++++++++++++++++-- NiceHashMiner/Utils/MinersDownloadManager.cs | 16 ++++++++++++++ 6 files changed, 65 insertions(+), 14 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 6b894e2..43f5a84 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -99,20 +99,20 @@ public static Dictionary> CreateForDevice(Compute } if (algoSettings.ContainsKey(MinerBaseType.ClaymoreAMD)) { foreach (var algo in algoSettings[MinerBaseType.ClaymoreAMD]) { - if (algo.NiceHashID == AlgorithmType.CryptoNight) { + if (algo.NiceHashID == AlgorithmType.CryptoNight || algo.NiceHashID == AlgorithmType.DaggerHashimoto) { algo.Enabled = false; - break; - } - } - } - if (algoSettings.ContainsKey(MinerBaseType.sgminer)) { - foreach (var algo in algoSettings[MinerBaseType.sgminer]) { - if (algo.NiceHashID == AlgorithmType.DaggerHashimoto) { - algo.Enabled = false; - break; + //break; } } } + //if (algoSettings.ContainsKey(MinerBaseType.sgminer)) { + // foreach (var algo in algoSettings[MinerBaseType.sgminer]) { + // if (algo.NiceHashID == AlgorithmType.DaggerHashimoto) { + // algo.Enabled = false; + // break; + // } + // } + //} } } // END AMD case diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index c94acaa..72e62fd 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -40,6 +40,8 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, private Timer StartupTimer; private Timer IdleCheck; + private Timer DeleteDl; + private bool ShowWarningNiceHashData; private bool DemoMode; @@ -402,6 +404,18 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } } } + // cleanup + DeleteDl = new Timer(); + DeleteDl.Tick += DeletSingleShot_Tick; + DeleteDl.Interval = 10 * 1000; + DeleteDl.Start(); + } + + private void DeletSingleShot_Tick(object sender, EventArgs e) { + DeleteDl.Stop(); + DeleteDl = null; + MinersDownloadManager.DeleteStandardDlSetup(); + MinersDownloadManager.DeleteThirdPartyDlSetup(); } private void SetChildFormCenter(Form form) { diff --git a/NiceHashMiner/Miners/ClaymoreDual.cs b/NiceHashMiner/Miners/ClaymoreDual.cs index e4f4c7b..7b85770 100644 --- a/NiceHashMiner/Miners/ClaymoreDual.cs +++ b/NiceHashMiner/Miners/ClaymoreDual.cs @@ -15,6 +15,8 @@ public ClaymoreDual() ConectionType = NHMConectionType.STRATUM_TCP; } + // eth-only: 1% + // eth-dual-mine: 2% protected override double DevFee() { return 1.0; } @@ -30,7 +32,7 @@ private string GetStartCommand(string url, string btcAdress, string worker) { } return " " + GetDevicesCommandString() - + String.Format(" -epool {0} -ewal {1} -mport -{2} -eworker {3} -esm 3 -epsw x -mode 1 -allpools 1", url, btcAdress, APIPort, useWorker); + + String.Format(" -epool {0} -ewal {1} -mport -{2} -eworker {3} -esm 3 -epsw x -allpools 1", url, btcAdress, APIPort, useWorker); } public override void Start(string url, string btcAdress, string worker) { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 160df54..eb3eec2 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -505,7 +505,9 @@ protected void BenchmarkThreadRoutineFinish() { Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(BenchmarkProcessStatus.Success == status, "Success"); + bool isOK = BenchmarkProcessStatus.Success == status; + string msg = isOK ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated"); + BenchmarkComunicator.OnBenchmarkComplete(isOK, msg); } } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 21b9d31..344ebbe 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -207,18 +207,35 @@ public static class ExtraLaunchParameters { new MinerOption("ClaymoreDual_nofee" , "-nofee", "-nofee", "0", MinerOptionFlagType.SingleParam, ","), new MinerOption("ClaymoreDual_li" , "-li", "-li", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption("ClaymoreDual_lidag" , "-lidag", "-lidag", "0", MinerOptionFlagType.MultiParam, ","), - + //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all new MinerOption("ClaymoreDual_cclock" , "-cclock", "-cclock", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption("ClaymoreDual_mclock" , "-mclock", "-mclock", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption("ClaymoreDual_powlim" , "-powlim", "-powlim", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption("ClaymoreDual_cvddc" , "-cvddc", "-cvddc", "0", MinerOptionFlagType.MultiParam, ","), new MinerOption("ClaymoreDual_mvddc" , "-mvddc", "-mvddc", "0", MinerOptionFlagType.MultiParam, ","), + + // other and dual mining features + new MinerOption("ClaymoreDual_etht" , "-etht", "-etht", "200", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_allcoins" , "-allcoins", "-allcoins", "", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_r" , "-r", "-r", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_mode" , "-mode", "-mode", "0", MinerOptionFlagType.SingleParam, ","), // this is not well supported in MultiParam + + new MinerOption("ClaymoreDual_ftime" , "-ftime", "-ftime", "0", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_eres" , "-eres", "-eres", "2", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_dpool" , "-dpool", "-dpool", "", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_dwal" , "-dwal", "-dwal", "", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_dpsw" , "-dpsw", "-dpsw", "", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_dcoin" , "-dcoin", "-dcoin", "", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_dcri" , "-dcri", "-dcri", "30", MinerOptionFlagType.MultiParam, ","), + + new MinerOption("ClaymoreDual_dcrt" , "-dcrt", "-dcrt", "5", MinerOptionFlagType.SingleParam, ","), }, new List() { // temperature stuff //MinerOptionFlagType.MultiParam might not work corectly due to ADL indexing so use single param to apply to all - new MinerOption("ClaymoreDual_tt" , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_tt" , "-tt", "-tt", "1", MinerOptionFlagType.SingleParam, ","), + new MinerOption("ClaymoreDual_ttdcr" , "-ttdcr", "-ttdcr", "1", MinerOptionFlagType.SingleParam, ","), new MinerOption("ClaymoreDual_ttli" , "-ttli", "-ttli", "70", MinerOptionFlagType.SingleParam, ","), new MinerOption("ClaymoreDual_tstop" , "-tstop", "-tstop", "0", MinerOptionFlagType.SingleParam, ","), new MinerOption("ClaymoreDual_fanmax" , "-fanmax", "-fanmax", "100", MinerOptionFlagType.MultiParam, ","), diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index d22aa81..bcfb921 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -33,5 +33,21 @@ static bool IsMinerBinZip() { return File.Exists(StandardDlSetup.BinsZipLocation); } + // delete + private static void DeleteAfter(DownloadSetup dlSetup) { + try { + if (File.Exists(dlSetup.BinsZipLocation)) { + File.Delete(dlSetup.BinsZipLocation); + } + } catch { } + } + + public static void DeleteStandardDlSetup() { + DeleteAfter(StandardDlSetup); + } + public static void DeleteThirdPartyDlSetup() { + DeleteAfter(ThirdPartyDlSetup); + } + } } From de5f7599232c8803943542ef1b2cc84b85035470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 2 Mar 2017 11:55:40 +0100 Subject: [PATCH 305/366] AMD algorithms list change --- NiceHashMiner/Devices/GroupAlgorithms.cs | 20 ++++++++++---------- NiceHashMiner/Globals.cs | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 43f5a84..909cd1d 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -44,15 +44,15 @@ public static Dictionary> CreateForDevice(Compute // Ellesmere, Polaris // Ellesmere sgminer workaround, keep this until sgminer is fixed to work with Ellesmere - if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris")) && Globals.IsEllesmereSgminerIgnore) { - // remove all algos except equi and dagger - var ignoreRemove = new List { AlgorithmType.DaggerHashimoto, AlgorithmType.Equihash, AlgorithmType.CryptoNight, AlgorithmType.Pascal, AlgorithmType.X11Gost }; - var toRemove = GetKeysForMinerAlgosGroup(algoSettings).FindAll((algoType) => ignoreRemove.IndexOf(algoType) == -1); - algoSettings = FilterMinerAlgos(algoSettings, toRemove); - // remove all sgminer? - // algoSettings = FilterMinerBaseTypes(algoSettings, [MinerBaseType.sgminer]); - } else if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris"))) { - algoSettings = FilterMinerAlgos(algoSettings, new List { AlgorithmType.NeoScrypt }); + if ((device.Codename.Contains("Ellesmere") || device.InfSection.ToLower().Contains("polaris"))) { + foreach (var algosInMiner in algoSettings) { + foreach (var algo in algosInMiner.Value) { + // disable all algos in list + if (algo.NiceHashID == AlgorithmType.Decred || algo.NiceHashID == AlgorithmType.Lbry) { + algo.Enabled = false; + } + } + } } // check if 3rd party is enabled and allow 3rd party only algos @@ -182,7 +182,7 @@ public static Dictionary> CreateDefaultsForGroup( { MinerBaseType.sgminer, new List() { //new Algorithm(MinerBaseType.sgminer, AlgorithmType.NeoScrypt, "neoscrypt") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lyra2REv2, "Lyra2REv2") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" }, + //new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lyra2REv2, "Lyra2REv2") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.DaggerHashimoto, "ethash") { ExtraLaunchParameters = RemDis + "--xintensity 512 -w 192 -g 1" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = RemDis + "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index a10a8b5..56e9bf0 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -17,7 +17,7 @@ public class Globals { public static int FirstNetworkCheckTimeoutTimeMS = 500; public static int FirstNetworkCheckTimeoutTries = 10; // sgminer Ellesmere/Polaris ignore setting (sgminer needs more testing) - public static bool IsEllesmereSgminerIgnore = true; + //public static bool IsEllesmereSgminerDefaultDisabled = true; // change this if TOS changes public static int CURRENT_TOS_VER = 2; From eabb40303a194367b724951348f8870d7bd07a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 2 Mar 2017 12:39:45 +0100 Subject: [PATCH 306/366] fix stopwatch, total elapsed checks, fix benchmark infinite loops --- NiceHashMiner/Miners/ClaymoreBaseMiner.cs | 4 ++-- NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs | 1 + NiceHashMiner/Miners/ClaymoreDual.cs | 2 ++ NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs | 3 +-- NiceHashMiner/Miners/Miner.cs | 2 +- NiceHashMiner/Miners/sgminer.cs | 4 ++-- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs index ae1a2ab..d8c0ba5 100644 --- a/NiceHashMiner/Miners/ClaymoreBaseMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreBaseMiner.cs @@ -16,7 +16,7 @@ namespace NiceHashMiner.Miners { public abstract class ClaymoreBaseMiner : Miner { - const int benchmarkTimeWait = 45; // if this is larger then welcome to hell!!! keep this fixed + protected int benchmarkTimeWait = 2 * 45; // Ok... this was all wrong int benchmark_read_count = 0; double benchmark_sum = 0.0d; protected readonly string LOOK_FOR_START; @@ -158,7 +158,7 @@ protected override void BenchmarkThreadRoutine(object CommandLine) { //string outdata = BenchmarkHandle.StandardOutput.ReadLine(); //BenchmarkOutputErrorDataReceivedImpl(outdata); // terminate process situations - if (_benchmarkTimer.Elapsed.Seconds >= (benchmarkTimeWait + 2) + if (_benchmarkTimer.Elapsed.TotalSeconds >= (benchmarkTimeWait + 2) || BenchmarkSignalQuit || BenchmarkSignalFinnished || BenchmarkSignalHanged diff --git a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs index 9e8ab3b..cb09fba 100644 --- a/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs +++ b/NiceHashMiner/Miners/ClaymoreCryptoNightMiner.cs @@ -34,6 +34,7 @@ public override void Start(string url, string btcAdress, string worker) { protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { // clean old logs CleanAllOldLogs(); + benchmarkTimeWait = time / 3; // 3 times faster than sgminer // network workaround string url = Globals.GetLocationURL(algorithm.NiceHashID, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); diff --git a/NiceHashMiner/Miners/ClaymoreDual.cs b/NiceHashMiner/Miners/ClaymoreDual.cs index 7b85770..bfa4dc0 100644 --- a/NiceHashMiner/Miners/ClaymoreDual.cs +++ b/NiceHashMiner/Miners/ClaymoreDual.cs @@ -47,6 +47,8 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti // clean old logs CleanAllOldLogs(); + benchmarkTimeWait = time; + // network workaround string url = Globals.GetLocationURL(algorithm.NiceHashID, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); // demo for benchmark diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index e7a21d5..07057da 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -36,8 +36,7 @@ public override void Start(string url, string btcAdress, string worker) { protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { // clean old logs CleanAllOldLogs(); - //benchmarkTimeWait = time / 3; // 3 times faster than sgminer - //benchmarkTimeWait = 30; // when debugging + benchmarkTimeWait = time / 3; // 3 times faster than sgminer string ret = " -mport 127.0.0.1:" + APIPort + " -benchmark 1 " + GetDevicesCommandString(); return ret; diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index eb3eec2..40864b9 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -368,7 +368,7 @@ private void BenchmarkOutputErrorDataReceived(object sender, DataReceivedEventAr if (BenchmarkTimeOutStopWatch == null) { BenchmarkTimeOutStopWatch = new Stopwatch(); BenchmarkTimeOutStopWatch.Start(); - } else if (BenchmarkTimeOutStopWatch.ElapsedMilliseconds > BenchmarkTimeoutInSeconds(BenchmarkTimeInSeconds) * 1000) { + } else if (BenchmarkTimeOutStopWatch.Elapsed.TotalSeconds > BenchmarkTimeoutInSeconds(BenchmarkTimeInSeconds)) { BenchmarkTimeOutStopWatch.Stop(); BenchmarkSignalTimedout = true; } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index a259c80..02563dd 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -192,11 +192,11 @@ protected override void BenchmarkThreadRoutineStartSettup() { } protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { - if (_benchmarkTimer.Elapsed.Seconds >= BenchmarkTimeInSeconds) { + if (_benchmarkTimer.Elapsed.TotalSeconds >= BenchmarkTimeInSeconds) { string resp = GetAPIData(APIPort, "quit").TrimEnd(new char[] { (char)0 }); Helpers.ConsolePrint("BENCHMARK", "SGMiner Response: " + resp); } - if (_benchmarkTimer.Elapsed.Seconds >= BenchmarkTimeInSeconds + 2) { + if (_benchmarkTimer.Elapsed.TotalSeconds >= BenchmarkTimeInSeconds + 2) { _benchmarkTimer.Stop(); // this is safe in a benchmark KillSGMiner(); From 6fcf499e14ffaa7f92add7e59794cabe48d320f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 2 Mar 2017 12:47:44 +0100 Subject: [PATCH 307/366] fix benchmark msg --- NiceHashMiner/Miners/Miner.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 40864b9..72bdc11 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -506,11 +506,13 @@ protected void BenchmarkThreadRoutineFinish() { if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { OnBenchmarkCompleteCalled = true; bool isOK = BenchmarkProcessStatus.Success == status; - string msg = isOK ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated"); - BenchmarkComunicator.OnBenchmarkComplete(isOK, msg); + string msg = BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated"); + BenchmarkComunicator.OnBenchmarkComplete(isOK, isOK ? "" : msg); } } + + virtual protected void BenchmarkThreadRoutine(object CommandLine) { Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS); From 748659479ad1d683c0c573ef57912e6b1266b028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 2 Mar 2017 17:24:17 +0100 Subject: [PATCH 308/366] AMD dev detection disable pretty print --- .../AMDOpenCLDeviceDetection.cpp | 37 ++++++++++++++++++- .../AMDOpenCLDeviceDetection.h | 1 + AMDOpenCLDeviceDetection/main.cpp | 3 +- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.cpp b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.cpp index dc8b1a0..50eec1a 100644 --- a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.cpp +++ b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.cpp @@ -147,5 +147,38 @@ void AMDOpenCLDeviceDetection::PrintDevicesJson() { } } - cout << "]"; // << endl; -} \ No newline at end of file + cout << "]" << endl; +} + + +void AMDOpenCLDeviceDetection::PrintDevicesJsonDirty() { + cout << "["; + + { + int devPlatformsComma = _devicesPlatformsDevices.size(); + for (const auto &jsonLog : _devicesPlatformsDevices) { + cout << "{"; + cout << "\"PlatformName\": \"" << jsonLog.PlatformName << "\"" << ","; + cout << "\"PlatformNum\": " << jsonLog.PlatformNum << ","; + cout << "\"Devices\" : ["; + // device print + int devComma = jsonLog.Devices.size(); + for (const auto &dev : jsonLog.Devices) { + cout << "{"; + cout << "\"" << "DeviceID" << "\" : " << dev.DeviceID << ","; // num + cout << "\"" << "AMD_BUS_ID" << "\" : " << dev.AMD_BUS_ID << ","; // num + cout << "\"" << "_CL_DEVICE_NAME" << "\" : \"" << dev._CL_DEVICE_NAME << "\","; + cout << "\"" << "_CL_DEVICE_TYPE" << "\" : \"" << dev._CL_DEVICE_TYPE << "\","; + cout << "\"" << "_CL_DEVICE_GLOBAL_MEM_SIZE" << "\" : " << dev._CL_DEVICE_GLOBAL_MEM_SIZE << ","; // num + cout << "\"" << "_CL_DEVICE_VENDOR" << "\" : \"" << dev._CL_DEVICE_VENDOR << "\","; + cout << "\"" << "_CL_DEVICE_VERSION" << "\" : \"" << dev._CL_DEVICE_VERSION << "\","; + cout << "\"" << "_CL_DRIVER_VERSION" << "\" : \"" << dev._CL_DRIVER_VERSION << "\""; + cout << "}" << COMMA(devComma); + } + cout << "]"; + cout << "}" << COMMA(devPlatformsComma); + } + } + + cout << "]" << endl; +} diff --git a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h index e5da942..8708fbb 100644 --- a/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h +++ b/AMDOpenCLDeviceDetection/AMDOpenCLDeviceDetection.h @@ -27,6 +27,7 @@ class AMDOpenCLDeviceDetection { bool QueryDevices(); void PrintDevicesJson(); + void PrintDevicesJsonDirty(); private: diff --git a/AMDOpenCLDeviceDetection/main.cpp b/AMDOpenCLDeviceDetection/main.cpp index 79f367f..9ce348b 100644 --- a/AMDOpenCLDeviceDetection/main.cpp +++ b/AMDOpenCLDeviceDetection/main.cpp @@ -3,7 +3,8 @@ int main() { AMDOpenCLDeviceDetection AMDOpenCLDeviceDetection; if (AMDOpenCLDeviceDetection.QueryDevices()) { - AMDOpenCLDeviceDetection.PrintDevicesJson(); + //AMDOpenCLDeviceDetection.PrintDevicesJson(); + AMDOpenCLDeviceDetection.PrintDevicesJsonDirty(); } return 0; } From 02bc7c5b73a3c84c906c861fae84fce43e75b524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 3 Mar 2017 09:13:59 +0100 Subject: [PATCH 309/366] dev detection disable pretty print by default --- AMDOpenCLDeviceDetection/main.cpp | 10 +++-- CudaDeviceDetection/CudaDetection.cpp | 56 ++++++++++++++++++++++----- CudaDeviceDetection/CudaDetection.h | 6 ++- CudaDeviceDetection/main.cpp | 9 ++++- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/AMDOpenCLDeviceDetection/main.cpp b/AMDOpenCLDeviceDetection/main.cpp index 9ce348b..b387304 100644 --- a/AMDOpenCLDeviceDetection/main.cpp +++ b/AMDOpenCLDeviceDetection/main.cpp @@ -1,10 +1,14 @@ #include "AMDOpenCLDeviceDetection.h" -int main() { +int main(int argc, char* argv[]) { AMDOpenCLDeviceDetection AMDOpenCLDeviceDetection; if (AMDOpenCLDeviceDetection.QueryDevices()) { - //AMDOpenCLDeviceDetection.PrintDevicesJson(); - AMDOpenCLDeviceDetection.PrintDevicesJsonDirty(); + if (argc < 2) { + AMDOpenCLDeviceDetection.PrintDevicesJsonDirty(); + } + else { + AMDOpenCLDeviceDetection.PrintDevicesJson(); + } } return 0; } diff --git a/CudaDeviceDetection/CudaDetection.cpp b/CudaDeviceDetection/CudaDetection.cpp index 91f0690..f0d2559 100644 --- a/CudaDeviceDetection/CudaDetection.cpp +++ b/CudaDeviceDetection/CudaDetection.cpp @@ -104,15 +104,15 @@ void CudaDetection::PrintDevicesJson() { cout << endl << "]" << endl; } -void CudaDetection::print(CudaDevice &dev) { - cout << "DeviceID : " << dev.DeviceID << endl; - cout << "DeviceName : " << dev.DeviceName << endl; - cout << "SMVersionString : " << dev.SMVersionString << endl; - cout << "UUID : " << dev.UUID << endl; - cout << "DeviceGlobalMemory : " << dev.DeviceGlobalMemory << endl; - cout << "pciDeviceId : " << dev.pciDeviceId << endl; - cout << "pciSubSystemId : " << dev.pciSubSystemId << endl << endl; -} +//void CudaDetection::print(CudaDevice &dev) { +// cout << "DeviceID : " << dev.DeviceID << endl; +// cout << "DeviceName : " << dev.DeviceName << endl; +// cout << "SMVersionString : " << dev.SMVersionString << endl; +// cout << "UUID : " << dev.UUID << endl; +// cout << "DeviceGlobalMemory : " << dev.DeviceGlobalMemory << endl; +// cout << "pciDeviceId : " << dev.pciDeviceId << endl; +// cout << "pciSubSystemId : " << dev.pciSubSystemId << endl << endl; +//} void CudaDetection::json_print(CudaDevice &dev) { cout << "\t{" << endl; @@ -129,4 +129,42 @@ void CudaDetection::json_print(CudaDevice &dev) { cout << "\t\t\"pciSubSystemId\" : " << dev.pciSubSystemId << "," << endl; // num cout << "\t\t\"SMX\" : " << dev.SMX << endl; // num cout << "\t}"; +} + +// non human readable print +void CudaDetection::PrintDevicesJson_d() { + cout << "["; + for (int i = 0; i < _cudaDevices.size() - 1; ++i) { + json_print_d(_cudaDevices[i]); + cout << ","; + } + json_print_d(_cudaDevices[_cudaDevices.size() - 1]); + cout << "]" << endl; +} + +//void CudaDetection::print_d(CudaDevice &dev) { +// cout << "DeviceID : " << dev.DeviceID ; +// cout << "DeviceName : " << dev.DeviceName ; +// cout << "SMVersionString : " << dev.SMVersionString ; +// cout << "UUID : " << dev.UUID ; +// cout << "DeviceGlobalMemory : " << dev.DeviceGlobalMemory ; +// cout << "pciDeviceId : " << dev.pciDeviceId ; +// cout << "pciSubSystemId : " << dev.pciSubSystemId ; +//} + +void CudaDetection::json_print_d(CudaDevice &dev) { + cout << "{"; + cout << "\"DeviceID\" : " << dev.DeviceID << ","; // num + cout << "\"VendorID\" : " << dev.VendorID << ","; // num + cout << "\"VendorName\" : \"" << dev.VendorName << "\","; // string + cout << "\"DeviceName\" : \"" << dev.DeviceName << "\","; // string + cout << "\"SMVersionString\" : \"" << dev.SMVersionString << "\","; // string + cout << "\"SM_major\" : " << dev.SM_major << ","; // num + cout << "\"SM_minor\" : " << dev.SM_minor << ","; // num + cout << "\"UUID\" : \"" << dev.UUID << "\","; // string + cout << "\"DeviceGlobalMemory\" : " << dev.DeviceGlobalMemory << ","; // num + cout << "\"pciDeviceId\" : " << dev.pciDeviceId << ","; // num + cout << "\"pciSubSystemId\" : " << dev.pciSubSystemId << ","; // num + cout << "\"SMX\" : " << dev.SMX; // num + cout << "}"; } \ No newline at end of file diff --git a/CudaDeviceDetection/CudaDetection.h b/CudaDeviceDetection/CudaDetection.h index 7cbebc1..045463b 100644 --- a/CudaDeviceDetection/CudaDetection.h +++ b/CudaDeviceDetection/CudaDetection.h @@ -17,12 +17,16 @@ class CudaDetection bool QueryDevices(); void PrintDevicesJson(); + void PrintDevicesJson_d(); private: - void print(CudaDevice &dev); + //void print(CudaDevice &dev); void json_print(CudaDevice &dev); + //void print_d(CudaDevice &dev); + void json_print_d(CudaDevice &dev); + std::vector _errorMsgs; std::vector _cudaDevices; diff --git a/CudaDeviceDetection/main.cpp b/CudaDeviceDetection/main.cpp index ad3b163..3a8a576 100644 --- a/CudaDeviceDetection/main.cpp +++ b/CudaDeviceDetection/main.cpp @@ -3,10 +3,15 @@ // TODO maybe add nvml.dll check //#include -int main() { +int main(int argc, char* argv[]) { CudaDetection detection; if (detection.QueryDevices()) { - detection.PrintDevicesJson(); + if (argc < 2) { + detection.PrintDevicesJson_d(); + } + else { + detection.PrintDevicesJson(); + } } return 0; } From af1b015075b3d6f1cebbb375e7662e4dcf7f40bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 3 Mar 2017 10:29:12 +0100 Subject: [PATCH 310/366] add convenience parameter for ClaymoreDual, dual mining partly supported --- NiceHashMiner/Miners/ClaymoreDual.cs | 30 +++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/ClaymoreDual.cs b/NiceHashMiner/Miners/ClaymoreDual.cs index bfa4dc0..ec3d768 100644 --- a/NiceHashMiner/Miners/ClaymoreDual.cs +++ b/NiceHashMiner/Miners/ClaymoreDual.cs @@ -30,9 +30,37 @@ private string GetStartCommand(string url, string btcAdress, string worker) { if (useWorker == null || useWorker == "") { useWorker = "worker1"; } + string dualModeParams = ""; + foreach (var pair in MiningSetup.MiningPairs) { + if (pair.CurrentExtraLaunchParameters.Contains("-dual=")) { + AlgorithmType dual = AlgorithmType.NONE; + string coinP = ""; + if (pair.CurrentExtraLaunchParameters.Contains("Decred")) { + dual = AlgorithmType.Decred; + coinP = " -dcoin dcr "; + } + //if (pair.CurrentExtraLaunchParameters.Contains("Siacoin")) { + // dual = AlgorithmType.; + //} + if (pair.CurrentExtraLaunchParameters.Contains("Lbry")) { + dual = AlgorithmType.Lbry; + coinP = " -dcoin lbc "; + } + if (pair.CurrentExtraLaunchParameters.Contains("Pascal")) { + dual = AlgorithmType.Pascal; + coinP = " -dcoin pasc "; + } + if (dual != AlgorithmType.NONE) { + string urlSecond = Globals.GetLocationURL(dual, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); + dualModeParams = String.Format(" {0} -dpool {1} -dwal {2}", coinP, urlSecond, btcAdress); + break; + } + } + } return " " + GetDevicesCommandString() - + String.Format(" -epool {0} -ewal {1} -mport -{2} -eworker {3} -esm 3 -epsw x -allpools 1", url, btcAdress, APIPort, useWorker); + + String.Format(" -epool {0} -ewal {1} -mport -{2} -eworker {3} -esm 3 -epsw x -allpools 1", url, btcAdress, APIPort, useWorker) + + dualModeParams; } public override void Start(string url, string btcAdress, string worker) { From ea5cea6ffe90cb8231ad00bb773793581a42e150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 6 Mar 2017 13:06:58 +0100 Subject: [PATCH 311/366] ClaymoreDual fix workername, OptiminerZcash wait before API call (fix restart loop) --- NiceHashMiner/Miners/ClaymoreDual.cs | 10 ++- .../Miners/Equihash/OptiminerZcashMiner.cs | 64 +++++++++++-------- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 50 +++++++-------- .../Miners/Parsing/ExtraLaunchParameters.cs | 7 +- 4 files changed, 72 insertions(+), 59 deletions(-) diff --git a/NiceHashMiner/Miners/ClaymoreDual.cs b/NiceHashMiner/Miners/ClaymoreDual.cs index ec3d768..dd5954f 100644 --- a/NiceHashMiner/Miners/ClaymoreDual.cs +++ b/NiceHashMiner/Miners/ClaymoreDual.cs @@ -26,10 +26,8 @@ protected override int GET_MAX_CooldownTimeInMilliseconds() { } private string GetStartCommand(string url, string btcAdress, string worker) { - string useWorker = worker; - if (useWorker == null || useWorker == "") { - useWorker = "worker1"; - } + string username = GetUsername(btcAdress, worker); + string dualModeParams = ""; foreach (var pair in MiningSetup.MiningPairs) { if (pair.CurrentExtraLaunchParameters.Contains("-dual=")) { @@ -52,14 +50,14 @@ private string GetStartCommand(string url, string btcAdress, string worker) { } if (dual != AlgorithmType.NONE) { string urlSecond = Globals.GetLocationURL(dual, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); - dualModeParams = String.Format(" {0} -dpool {1} -dwal {2}", coinP, urlSecond, btcAdress); + dualModeParams = String.Format(" {0} -dpool {1} -dwal {2}", coinP, urlSecond, username); break; } } } return " " + GetDevicesCommandString() - + String.Format(" -epool {0} -ewal {1} -mport -{2} -eworker {3} -esm 3 -epsw x -allpools 1", url, btcAdress, APIPort, useWorker) + + String.Format(" -epool {0} -ewal {1} -mport -{2} -esm 3 -epsw x -allpools 1", url, username, APIPort) + dualModeParams; } diff --git a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs index 8d9bbc4..2d6fd0e 100644 --- a/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/OptiminerZcashMiner.cs @@ -36,10 +36,19 @@ private class JsonApiResponse { public Stratum stratum; } + // give some time or else it will crash + Stopwatch _startAPI = null; + bool _skipAPICheck = true; + int waitSeconds = 30; + public override void Start(string url, string btcAdress, string worker) { string username = GetUsername(btcAdress, worker); LastCommandLine = " " + GetDevicesCommandString() + " -m " + APIPort + " -s " + url + " -u " + username + " -p x"; ProcessHandle = _Start(); + + // + _startAPI = new Stopwatch(); + _startAPI.Start(); } protected override void _Stop(MinerStopType willswitch) { @@ -67,36 +76,41 @@ public override APIData GetSummary() { _currentMinerReadStatus = MinerAPIReadStatus.NONE; APIData ad = new APIData(MiningSetup.CurrentAlgorithmType); - JsonApiResponse resp = null; - try { - string DataToSend = GetHttpRequestNHMAgentStrin(""); - string respStr = GetAPIData(APIPort, DataToSend, true); - if (respStr != null && respStr.Contains("{")) { - int start = respStr.IndexOf("{"); - if (start > -1) { - string respStrJSON = respStr.Substring(start); - resp = JsonConvert.DeserializeObject(respStrJSON.Trim(), Globals.JsonSettings); + if (_skipAPICheck == false) { + JsonApiResponse resp = null; + try { + string DataToSend = GetHttpRequestNHMAgentStrin(""); + string respStr = GetAPIData(APIPort, DataToSend, true); + if (respStr != null && respStr.Contains("{")) { + int start = respStr.IndexOf("{"); + if (start > -1) { + string respStrJSON = respStr.Substring(start); + resp = JsonConvert.DeserializeObject(respStrJSON.Trim(), Globals.JsonSettings); + } } + //Helpers.ConsolePrint("OptiminerZcashMiner API back:", respStr); + } catch (Exception ex) { + Helpers.ConsolePrint("OptiminerZcashMiner", "GetSummary exception: " + ex.Message); } - //Helpers.ConsolePrint("OptiminerZcashMiner API back:", respStr); - } catch (Exception ex) { - Helpers.ConsolePrint("OptiminerZcashMiner", "GetSummary exception: " + ex.Message); - } - if (resp != null && resp.solution_rate != null) { - //Helpers.ConsolePrint("OptiminerZcashMiner API back:", "resp != null && resp.error == null"); - const string total_key = "Total"; - const string _5s_key = "5s"; - if (resp.solution_rate.ContainsKey(total_key)) { - var total_solution_rate_dict = resp.solution_rate[total_key]; - if (total_solution_rate_dict != null && total_solution_rate_dict.ContainsKey(_5s_key)) { - ad.Speed = total_solution_rate_dict[_5s_key]; - _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + if (resp != null && resp.solution_rate != null) { + //Helpers.ConsolePrint("OptiminerZcashMiner API back:", "resp != null && resp.error == null"); + const string total_key = "Total"; + const string _5s_key = "5s"; + if (resp.solution_rate.ContainsKey(total_key)) { + var total_solution_rate_dict = resp.solution_rate[total_key]; + if (total_solution_rate_dict != null && total_solution_rate_dict.ContainsKey(_5s_key)) { + ad.Speed = total_solution_rate_dict[_5s_key]; + _currentMinerReadStatus = MinerAPIReadStatus.GOT_READ; + } + } + if (ad.Speed == 0) { + _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; } } - if (ad.Speed == 0) { - _currentMinerReadStatus = MinerAPIReadStatus.READ_SPEED_ZERO; - } + } else if (_skipAPICheck && _startAPI.Elapsed.TotalSeconds > waitSeconds) { + _startAPI.Stop(); + _skipAPICheck = false; } return ad; diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index fa14da2..3f5063a 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -26,15 +26,15 @@ public static class Data { public const string ccminer_tpruvot = _bin + @"\ccminer_tpruvot.exe"; public const string ccminer_cryptonight = _bin + @"\ccminer_cryptonight.exe"; public const string ccminer_x11gost = _bin + @"\ccminer_x11gost.exe"; - /// - /// cpuminers opt new - /// - public const string cpuminer_opt_AVX2_AES = _bin + @"\cpuminer_opt_AVX2_AES.exe"; - public const string cpuminer_opt_AVX2 = _bin + @"\cpuminer_opt_AVX2.exe"; - public const string cpuminer_opt_AVX_AES = _bin + @"\cpuminer_opt_AVX_AES.exe"; - public const string cpuminer_opt_AVX = _bin + @"\cpuminer_opt_AVX.exe"; - public const string cpuminer_opt_AES = _bin + @"\cpuminer_opt_AES.exe"; - public const string cpuminer_opt_SSE2 = _bin + @"\cpuminer_opt_SSE2.exe"; + ///// + ///// cpuminers opt new + ///// + //public const string cpuminer_opt_AVX2_AES = _bin + @"\cpuminer_opt_AVX2_AES.exe"; + //public const string cpuminer_opt_AVX2 = _bin + @"\cpuminer_opt_AVX2.exe"; + //public const string cpuminer_opt_AVX_AES = _bin + @"\cpuminer_opt_AVX_AES.exe"; + //public const string cpuminer_opt_AVX = _bin + @"\cpuminer_opt_AVX.exe"; + //public const string cpuminer_opt_AES = _bin + @"\cpuminer_opt_AES.exe"; + //public const string cpuminer_opt_SSE2 = _bin + @"\cpuminer_opt_SSE2.exe"; /// /// ethminers /// @@ -78,8 +78,8 @@ public static bool IsMinerAlgorithmAvaliable(List algos, MinerBaseTyp public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoType, DeviceGroupType devGroupType, string devCodenameAMD, bool isOptimizedAMD, CPUExtensionType MostOptimizedCPUExtensionType) { switch (minerBaseType) { - case MinerBaseType.cpuminer: - return CPU_GROUP.cpu_miner_opt(MostOptimizedCPUExtensionType); + //case MinerBaseType.cpuminer: + // return CPU_GROUP.cpu_miner_opt(MostOptimizedCPUExtensionType); case MinerBaseType.ccminer: return NVIDIA_GROUPS.ccminer_path(algoType, devGroupType); case MinerBaseType.sgminer: @@ -225,20 +225,20 @@ public static string ClaymorePath(AlgorithmType type) { } } - static class CPU_GROUP { - public static string cpu_miner_opt(CPUExtensionType type) { - // algorithmType is not needed ATM - // algorithmType: AlgorithmType - if (CPUExtensionType.AVX2_AES == type) { return Data.cpuminer_opt_AVX2_AES; } - if (CPUExtensionType.AVX2 == type) { return Data.cpuminer_opt_AVX2; } - if (CPUExtensionType.AVX_AES == type) { return Data.cpuminer_opt_AVX_AES; } - if (CPUExtensionType.AVX == type) { return Data.cpuminer_opt_AVX; } - if (CPUExtensionType.AES == type) { return Data.cpuminer_opt_AES; } - if (CPUExtensionType.SSE2 == type) { return Data.cpuminer_opt_SSE2; } - - return Data.NONE; // should not happen - } - } + //static class CPU_GROUP { + // public static string cpu_miner_opt(CPUExtensionType type) { + // // algorithmType is not needed ATM + // // algorithmType: AlgorithmType + // if (CPUExtensionType.AVX2_AES == type) { return Data.cpuminer_opt_AVX2_AES; } + // if (CPUExtensionType.AVX2 == type) { return Data.cpuminer_opt_AVX2; } + // if (CPUExtensionType.AVX_AES == type) { return Data.cpuminer_opt_AVX_AES; } + // if (CPUExtensionType.AVX == type) { return Data.cpuminer_opt_AVX; } + // if (CPUExtensionType.AES == type) { return Data.cpuminer_opt_AES; } + // if (CPUExtensionType.SSE2 == type) { return Data.cpuminer_opt_SSE2; } + + // return Data.NONE; // should not happen + // } + //} } } diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 344ebbe..770bdb0 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -176,10 +176,11 @@ public static class ExtraLaunchParameters { new MinerOptionPackage( MinerType.OptiminerZcash, new List() { - new MinerOption("ForceGenericKernel" , "", "--force-generic-kernel", null, MinerOptionFlagType.Uni, ""), - new MinerOption("ExperimentalKernel" , "", "--experimental-kernel", null, MinerOptionFlagType.Uni, ""), - new MinerOption("nodevfee" , "", "--nodevfee", null, MinerOptionFlagType.Uni, ""), + new MinerOption("ForceGenericKernel" , "--force-generic-kernel", "--force-generic-kernel", null, MinerOptionFlagType.Uni, ""), + new MinerOption("ExperimentalKernel" , "--experimental-kernel", "--experimental-kernel", null, MinerOptionFlagType.Uni, ""), + new MinerOption("nodevfee" , "--nodevfee", "--nodevfee", null, MinerOptionFlagType.Uni, ""), new MinerOption("Intensity" , "-i", "--intensity", "0", MinerOptionFlagType.DuplicateMultiParam, ""), + new MinerOption("PciMode" , "--pci-mode", "--pci-mode", "", MinerOptionFlagType.SingleParam, ""), }, new List() ), From d459692827ec08aac0043e6195d7a913586ed641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 7 Mar 2017 11:21:08 +0100 Subject: [PATCH 312/366] disable double warning --- NiceHashMiner/Forms/Form_Main.cs | 78 ++++++++++++++++---------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 72e62fd..0871d53 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -778,8 +778,8 @@ private void buttonStartMining_Click(object sender, EventArgs e) { IsManuallyStarted = false; StopMining(); MessageBox.Show(International.GetText("Form_Main_StartMiningReturnedFalse"), - International.GetText("Error_with_Exclamation"), - MessageBoxButtons.OK, MessageBoxIcon.Error); + International.GetText("Warning_with_Exclamation"), + MessageBoxButtons.OK, MessageBoxIcon.Warning); } } @@ -888,20 +888,20 @@ private bool StartMining(bool showWarnings) { // Check if there are unbenchmakred algorithms bool isBenchInit = true; - bool hasAnyAlgoEnabled = false; - foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cdev.Enabled) { - foreach (var algo in cdev.GetAlgorithmSettings()) { - if (algo.Enabled == true) { - hasAnyAlgoEnabled = true; - if (algo.BenchmarkSpeed == 0) { - isBenchInit = false; - break; - } - } - } - } - } + //bool hasAnyAlgoEnabled = false; + //foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // if (cdev.Enabled) { + // foreach (var algo in cdev.GetAlgorithmSettings()) { + // if (algo.Enabled == true) { + // hasAnyAlgoEnabled = true; + // if (algo.BenchmarkSpeed == 0) { + // isBenchInit = false; + // break; + // } + // } + // } + // } + //} // Check if the user has run benchmark first if (!isBenchInit) { DialogResult result = MessageBox.Show(International.GetText("EnabledUnbenchmarkedAlgorithmsWarning"), @@ -936,29 +936,29 @@ private bool StartMining(bool showWarnings) { // check if any device enabled // check devices without benchmarks - bool noDeviceEnabled = true; - foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - if (cdev.Enabled) { - noDeviceEnabled = false; - break; - } - } - if (noDeviceEnabled) { - if (showWarnings) { - DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_For_Mining"), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - return false; - } - if (!hasAnyAlgoEnabled) { - if (showWarnings) { - DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_Algorithms_For_Mining"), - International.GetText("Warning_with_Exclamation"), - MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - return false; - } + //bool noDeviceEnabled = true; + //foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + // if (cdev.Enabled) { + // noDeviceEnabled = false; + // break; + // } + //} + //if (noDeviceEnabled) { + // if (showWarnings) { + // DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_For_Mining"), + // International.GetText("Warning_with_Exclamation"), + // MessageBoxButtons.OK, MessageBoxIcon.Warning); + // } + // return false; + //} + //if (!hasAnyAlgoEnabled) { + // if (showWarnings) { + // DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_Algorithms_For_Mining"), + // International.GetText("Warning_with_Exclamation"), + // MessageBoxButtons.OK, MessageBoxIcon.Warning); + // } + // return false; + //} textBoxBTCAddress.Enabled = false; textBoxWorkerName.Enabled = false; From fe6dab087c7c298c955e6d4ddd483877dc9a0bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 7 Mar 2017 12:14:28 +0100 Subject: [PATCH 313/366] fix possible sgminer dagger parsing --- NiceHashMiner/Miners/sgminer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index 02563dd..af1b6ab 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -150,10 +150,10 @@ protected override bool BenchmarkParseLine(string outdata) { double mult = 1; if (hashSpeed.Contains("K")) { - hashSpeed = hashSpeed.Replace("K", ""); + hashSpeed = hashSpeed.Replace("K", " "); mult = 1000; } else if (hashSpeed.Contains("M")) { - hashSpeed = hashSpeed.Replace("M", ""); + hashSpeed = hashSpeed.Replace("M", " "); mult = 1000000; } From 9541546cd2d3fa7dbcad1340b79add1000b58c98 Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Sat, 4 Mar 2017 19:22:23 -0500 Subject: [PATCH 314/366] Get button in context menu --- NiceHashMiner/Forms/Components/AlgorithmsListView.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 6e9d1d2..50ffd96 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -188,6 +188,13 @@ private void listViewAlgorithms_MouseClick(object sender, MouseEventArgs e) { enableAllItems.Click += toolStripMenuItemEnableAll_Click; contextMenuStrip1.Items.Add(enableAllItems); } + // clear item + { + var clearItem = new ToolStripMenuItem(); + clearItem.Text = International.GetText("AlgorithmsListView_ContextMenu_ClearItem"); + clearItem.Click += toolStripMenuItemClear_Click; + contextMenuStrip1.Items.Add(clearItem); + } contextMenuStrip1.Show(Cursor.Position); } } @@ -204,5 +211,9 @@ private void toolStripMenuItemDisableAll_Click(object sender, EventArgs e) { } } + private void toolStripMenuItemClear_Click(object sender, EventArgs e) { + // Do something + } + } } From 9b0fc0afa7f6ee0cfbab413abc335fa6271105d1 Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Sat, 4 Mar 2017 19:27:17 -0500 Subject: [PATCH 315/366] Added text language (google translate) --- NiceHashMiner/langs/en.lang | 1 + NiceHashMiner/langs/es.lang | 1 + NiceHashMiner/langs/ru.lang | 1 + 3 files changed, 3 insertions(+) diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 42fde4a..5fc9bee 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -323,6 +323,7 @@ "Form_Settings_Text_DisableDefaultOptimizations": "Disable Default Optimizations", "AlgorithmsListView_ContextMenu_DisableAll": "Disable All Algorithms", "AlgorithmsListView_ContextMenu_EnableAll": "Enable All Algorithms", + "AlgorithmsListView_ContextMenu_ClearItem": "Clear item speed", "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable at least 1 device to proceed mining.", "Form_Main_3rdParty_Title": "Disclaimer on usage of 3rd party software", "Form_Main_3rdParty_Text": "We have integrated 3rd party mining software (developed by Claymore) that should speed up your mining and give you more stable mining experience - this could potentially result in more earnings over a shorter period of time even after developer's fee is deducted. However, since this is 3rd party software that is fully closed-source, we have no chance to inspect it in any way. NiceHash can not vouch for using that software and is refusing to take any responsibility for any damage caused - security breaches, loss of data or funds, system or hardware error, and other issues. By agreeing to this disclaimer you take full responsibility for using these Claymore closed-source miners as they are.", diff --git a/NiceHashMiner/langs/es.lang b/NiceHashMiner/langs/es.lang index 9093b16..42ac775 100644 --- a/NiceHashMiner/langs/es.lang +++ b/NiceHashMiner/langs/es.lang @@ -322,6 +322,7 @@ "Form_Settings_Text_DisableDefaultOptimizations": "Desactivar optimizaciones predeterminadas", "AlgorithmsListView_ContextMenu_DisableAll": "Deshabilitar todos los algoritmos", "AlgorithmsListView_ContextMenu_EnableAll": "Habilitar todos los algoritmos", + "AlgorithmsListView_ContextMenu_ClearItem": "Velocidad del artículo", "Form_Main_No_Device_Enabled_For_Mining": "¡Alerta! Ningún dispisitivo se ha establecido para minar, por favor habilite al menos 1 dispositivo para poder minar.", "Form_Main_3rdParty_Title": "Aviso en el uso de software de terceros", "Form_Main_3rdParty_Text": "Hemos integrado software de minado de terceros (desarrollado por Claymore) que debería aumentar su verlocidad y estabilidad minando - esto podría resultar en mas beneficios en un menor periodo de tiempo después de la regalía del desarrollador. Aun así, dado que no es de código abierto, no podemos inspeccionarlo de ninguna forma. NiceHash no puede garantizar el uso de ese software y se niega a asumir ninguna responsabilidad por cualquier daño causado - incumplimientos de seguridad, pérdida de datos o fondos, errores de sistema o hardware y otros problemas. Al aceptar esta exención de responsabilidad usted asume toda la responsabilidad de usar estos mineros cerrados de Claymore como son.", diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 2b30409..50315af 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -254,6 +254,7 @@ "AlgorithmsListView_GroupBox_NONE": "NONE", "AlgorithmsListView_ContextMenu_DisableAll": "Отключить все алгоритмы", "AlgorithmsListView_ContextMenu_EnableAll" : "Включить все алгоритмы", + "AlgorithmsListView_ContextMenu_ClearItem": "ясно скорость пункт", "BenchmarkOptions_Benchmark_Type": "Тип бенчмарка:", "Form_Main_MiningDevices": "Устройства {0}:", "Form_Main_bins_folder_files_missing": "Отсутствуют файлы с последней инициализации майнеров. Убедитесь, что ваш антивирус не блокирует приложение. NiceHash Miner может не работать правильно без недостающих файлов. Нажмите Да для переустановки NiceHash Miner, чтобы попробовать исправить ошибку.", From 382fb003f7b22dd29a422977a040198f1af3e0fc Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Sat, 4 Mar 2017 20:02:27 -0500 Subject: [PATCH 316/366] Functioning clear speed --- NiceHashMiner/Forms/Components/AlgorithmsListView.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 50ffd96..a34097d 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -212,7 +212,11 @@ private void toolStripMenuItemDisableAll_Click(object sender, EventArgs e) { } private void toolStripMenuItemClear_Click(object sender, EventArgs e) { - // Do something + foreach (ListViewItem lvi in listViewAlgorithms.SelectedItems) { + var algorithm = lvi.Tag as Algorithm; + algorithm.BenchmarkSpeed = 0; + RepaintStatus(_computeDevice.Enabled, _computeDevice.UUID); + } } } From 6a98056a4151f0d34c0bed845d2c4fb728deb03b Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Sat, 4 Mar 2017 20:11:30 -0500 Subject: [PATCH 317/366] Benchmark queue fix --- NiceHashMiner/Forms/Components/AlgorithmsListView.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index a34097d..40a575e 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -216,6 +216,8 @@ private void toolStripMenuItemClear_Click(object sender, EventArgs e) { var algorithm = lvi.Tag as Algorithm; algorithm.BenchmarkSpeed = 0; RepaintStatus(_computeDevice.Enabled, _computeDevice.UUID); + // update benchmark status data + if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); } } From 89558c86ec6facf0bfdd78b7d3b4360b56481a7a Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Sat, 4 Mar 2017 20:40:56 -0500 Subject: [PATCH 318/366] Fixed settings clearing --- .../Forms/Components/AlgorithmSettingsControl.cs | 11 +++++++++++ .../Forms/Components/AlgorithmsListView.cs | 13 +++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs index 2e9a4ff..2232fe3 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmSettingsControl.cs @@ -92,6 +92,17 @@ public void HandleCheck(ListViewItem lvi) { } } + public void ChangeSpeed(ListViewItem lvi) + { + if (Object.ReferenceEquals(_currentlySelectedLvi, lvi)) + { + var algorithm = lvi.Tag as Algorithm; + if (algorithm != null) { + fieldBoxBenchmarkSpeed.EntryText = ParseDoubleDefault(algorithm.BenchmarkSpeed); + } + } + } + private bool CanEdit() { return _currentlySelectedAlgorithm != null && _selected; } diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 40a575e..03bc823 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -24,6 +24,7 @@ public partial class AlgorithmsListView : UserControl { public interface IAlgorithmsListView { void SetCurrentlySelected(ListViewItem lvi, ComputeDevice computeDevice); void HandleCheck(ListViewItem lvi); + void ChangeSpeed(ListViewItem lvi); } public IAlgorithmsListView ComunicationInterface { get; set; } @@ -214,10 +215,14 @@ private void toolStripMenuItemDisableAll_Click(object sender, EventArgs e) { private void toolStripMenuItemClear_Click(object sender, EventArgs e) { foreach (ListViewItem lvi in listViewAlgorithms.SelectedItems) { var algorithm = lvi.Tag as Algorithm; - algorithm.BenchmarkSpeed = 0; - RepaintStatus(_computeDevice.Enabled, _computeDevice.UUID); - // update benchmark status data - if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); + if (algorithm != null) { + algorithm.BenchmarkSpeed = 0; + RepaintStatus(_computeDevice.Enabled, _computeDevice.UUID); + // update benchmark status data + if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); + // update settings + ComunicationInterface.ChangeSpeed(lvi); + } } } From 097b8575eebeaf2d76e84a4c1883eceb8d4f446b Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Sat, 4 Mar 2017 20:43:56 -0500 Subject: [PATCH 319/366] Added null check --- NiceHashMiner/Forms/Components/AlgorithmsListView.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 03bc823..9202248 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -221,7 +221,7 @@ private void toolStripMenuItemClear_Click(object sender, EventArgs e) { // update benchmark status data if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); // update settings - ComunicationInterface.ChangeSpeed(lvi); + if (ComunicationInterface != null) ComunicationInterface.ChangeSpeed(lvi); } } } From 9d65c1e5fcb68a560e433230327f1b10f364c811 Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Sat, 4 Mar 2017 20:45:32 -0500 Subject: [PATCH 320/366] Another null check --- .../Forms/Components/AlgorithmsListView.cs | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 9202248..9c824a2 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -213,15 +213,19 @@ private void toolStripMenuItemDisableAll_Click(object sender, EventArgs e) { } private void toolStripMenuItemClear_Click(object sender, EventArgs e) { - foreach (ListViewItem lvi in listViewAlgorithms.SelectedItems) { - var algorithm = lvi.Tag as Algorithm; - if (algorithm != null) { - algorithm.BenchmarkSpeed = 0; - RepaintStatus(_computeDevice.Enabled, _computeDevice.UUID); - // update benchmark status data - if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); - // update settings - if (ComunicationInterface != null) ComunicationInterface.ChangeSpeed(lvi); + if (_computeDevice != null) { + foreach (ListViewItem lvi in listViewAlgorithms.SelectedItems) + { + var algorithm = lvi.Tag as Algorithm; + if (algorithm != null) + { + algorithm.BenchmarkSpeed = 0; + RepaintStatus(_computeDevice.Enabled, _computeDevice.UUID); + // update benchmark status data + if (BenchmarkCalculation != null) BenchmarkCalculation.CalcBenchmarkDevicesAlgorithmQueue(); + // update settings + if (ComunicationInterface != null) ComunicationInterface.ChangeSpeed(lvi); + } } } } From 6b22bd702bbe09b14ea4cca40c5e1738e61ecd14 Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Sat, 4 Mar 2017 20:46:52 -0500 Subject: [PATCH 321/366] Formatting --- NiceHashMiner/Forms/Components/AlgorithmsListView.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs index 9c824a2..fd95dce 100644 --- a/NiceHashMiner/Forms/Components/AlgorithmsListView.cs +++ b/NiceHashMiner/Forms/Components/AlgorithmsListView.cs @@ -214,11 +214,9 @@ private void toolStripMenuItemDisableAll_Click(object sender, EventArgs e) { private void toolStripMenuItemClear_Click(object sender, EventArgs e) { if (_computeDevice != null) { - foreach (ListViewItem lvi in listViewAlgorithms.SelectedItems) - { + foreach (ListViewItem lvi in listViewAlgorithms.SelectedItems) { var algorithm = lvi.Tag as Algorithm; - if (algorithm != null) - { + if (algorithm != null) { algorithm.BenchmarkSpeed = 0; RepaintStatus(_computeDevice.Enabled, _computeDevice.UUID); // update benchmark status data From 479badd11270f79a76fe6b796afcc91c78904271 Mon Sep 17 00:00:00 2001 From: Dillon Newell Date: Tue, 7 Mar 2017 21:41:48 -0500 Subject: [PATCH 322/366] Changed wording --- NiceHashMiner/langs/en.lang | 2 +- NiceHashMiner/langs/es.lang | 2 +- NiceHashMiner/langs/ru.lang | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 5fc9bee..5482255 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -323,7 +323,7 @@ "Form_Settings_Text_DisableDefaultOptimizations": "Disable Default Optimizations", "AlgorithmsListView_ContextMenu_DisableAll": "Disable All Algorithms", "AlgorithmsListView_ContextMenu_EnableAll": "Enable All Algorithms", - "AlgorithmsListView_ContextMenu_ClearItem": "Clear item speed", + "AlgorithmsListView_ContextMenu_ClearItem": "Clear Algorithm Speed", "Form_Main_No_Device_Enabled_For_Mining": "Warning no device has been enabled for mining, please enable at least 1 device to proceed mining.", "Form_Main_3rdParty_Title": "Disclaimer on usage of 3rd party software", "Form_Main_3rdParty_Text": "We have integrated 3rd party mining software (developed by Claymore) that should speed up your mining and give you more stable mining experience - this could potentially result in more earnings over a shorter period of time even after developer's fee is deducted. However, since this is 3rd party software that is fully closed-source, we have no chance to inspect it in any way. NiceHash can not vouch for using that software and is refusing to take any responsibility for any damage caused - security breaches, loss of data or funds, system or hardware error, and other issues. By agreeing to this disclaimer you take full responsibility for using these Claymore closed-source miners as they are.", diff --git a/NiceHashMiner/langs/es.lang b/NiceHashMiner/langs/es.lang index 42ac775..11ed258 100644 --- a/NiceHashMiner/langs/es.lang +++ b/NiceHashMiner/langs/es.lang @@ -322,7 +322,7 @@ "Form_Settings_Text_DisableDefaultOptimizations": "Desactivar optimizaciones predeterminadas", "AlgorithmsListView_ContextMenu_DisableAll": "Deshabilitar todos los algoritmos", "AlgorithmsListView_ContextMenu_EnableAll": "Habilitar todos los algoritmos", - "AlgorithmsListView_ContextMenu_ClearItem": "Velocidad del artículo", + "AlgorithmsListView_ContextMenu_ClearItem": "Velocidad del Algoritmo Limpio", "Form_Main_No_Device_Enabled_For_Mining": "¡Alerta! Ningún dispisitivo se ha establecido para minar, por favor habilite al menos 1 dispositivo para poder minar.", "Form_Main_3rdParty_Title": "Aviso en el uso de software de terceros", "Form_Main_3rdParty_Text": "Hemos integrado software de minado de terceros (desarrollado por Claymore) que debería aumentar su verlocidad y estabilidad minando - esto podría resultar en mas beneficios en un menor periodo de tiempo después de la regalía del desarrollador. Aun así, dado que no es de código abierto, no podemos inspeccionarlo de ninguna forma. NiceHash no puede garantizar el uso de ese software y se niega a asumir ninguna responsabilidad por cualquier daño causado - incumplimientos de seguridad, pérdida de datos o fondos, errores de sistema o hardware y otros problemas. Al aceptar esta exención de responsabilidad usted asume toda la responsabilidad de usar estos mineros cerrados de Claymore como son.", diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 50315af..0617dbd 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -254,7 +254,7 @@ "AlgorithmsListView_GroupBox_NONE": "NONE", "AlgorithmsListView_ContextMenu_DisableAll": "Отключить все алгоритмы", "AlgorithmsListView_ContextMenu_EnableAll" : "Включить все алгоритмы", - "AlgorithmsListView_ContextMenu_ClearItem": "ясно скорость пункт", + "AlgorithmsListView_ContextMenu_ClearItem": "Быстрая скорость алгоритма", "BenchmarkOptions_Benchmark_Type": "Тип бенчмарка:", "Form_Main_MiningDevices": "Устройства {0}:", "Form_Main_bins_folder_files_missing": "Отсутствуют файлы с последней инициализации майнеров. Убедитесь, что ваш антивирус не блокирует приложение. NiceHash Miner может не работать правильно без недостающих файлов. Нажмите Да для переустановки NiceHash Miner, чтобы попробовать исправить ошибку.", From c18ae1f638d6a42de453311ca4f678a4d6849da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 8 Mar 2017 08:27:40 +0100 Subject: [PATCH 323/366] remove double warnings (GUI fix) --- NiceHashMiner/Forms/Form_Main.cs | 81 ++++++++++++-------------------- 1 file changed, 30 insertions(+), 51 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 0871d53..7fe3342 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -187,7 +187,7 @@ private void IdleCheck_Tick(object sender, EventArgs e) if (BenchmarkForm == null && (MSIdle > (ConfigManager.GeneralConfig.MinIdleSeconds * 1000))) { Helpers.ConsolePrint("NICEHASH", "Entering idling state"); - if (StartMining(false) == false) { + if (StartMining(false) != StartMiningReturnType.StartMining) { StopMining(); } } @@ -398,7 +398,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { if (ConfigManager.GeneralConfig.AutoStartMining) { // well this is started manually as we want it to start at runtime IsManuallyStarted = true; - if (StartMining(true) == false) { + if (StartMining(true) != StartMiningReturnType.StartMining) { IsManuallyStarted = false; StopMining(); } @@ -663,7 +663,6 @@ void SetEnvironmentVariables() } } - private bool VerifyMiningAddress(bool ShowError) { if (!BitcoinAddress.ValidateBitcoinAddress(textBoxBTCAddress.Text.Trim()) && ShowError) @@ -774,7 +773,7 @@ private void buttonSettings_Click(object sender, EventArgs e) private void buttonStartMining_Click(object sender, EventArgs e) { IsManuallyStarted = true; - if (StartMining(true) == false) { + if (StartMining(true) == StartMiningReturnType.ShowNoMining) { IsManuallyStarted = false; StopMining(); MessageBox.Show(International.GetText("Form_Main_StartMiningReturnedFalse"), @@ -857,7 +856,13 @@ private void notifyIcon1_DoubleClick(object sender, EventArgs e) /////////////////////////////////////// // Miner control functions - private bool StartMining(bool showWarnings) { + private enum StartMiningReturnType { + StartMining, + ShowNoMining, + IgnoreMsg + } + + private StartMiningReturnType StartMining(bool showWarnings) { if (textBoxBTCAddress.Text.Equals("")) { if (showWarnings) { DialogResult result = MessageBox.Show(International.GetText("Form_Main_DemoModeMsg"), @@ -869,12 +874,12 @@ private bool StartMining(bool showWarnings) { labelDemoMode.Visible = true; labelDemoMode.Text = International.GetText("Form_Main_DemoModeLabel"); } else { - return false; + return StartMiningReturnType.IgnoreMsg; } } else { - return false; + return StartMiningReturnType.IgnoreMsg; ; } - } else if (!VerifyMiningAddress(true)) return false; + } else if (!VerifyMiningAddress(true)) return StartMiningReturnType.IgnoreMsg; if (Globals.NiceHashData == null) { if (showWarnings) { @@ -882,26 +887,26 @@ private bool StartMining(bool showWarnings) { International.GetText("Error_with_Exclamation"), MessageBoxButtons.OK, MessageBoxIcon.Error); } - return false; + return StartMiningReturnType.IgnoreMsg; } // Check if there are unbenchmakred algorithms bool isBenchInit = true; - //bool hasAnyAlgoEnabled = false; - //foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // if (cdev.Enabled) { - // foreach (var algo in cdev.GetAlgorithmSettings()) { - // if (algo.Enabled == true) { - // hasAnyAlgoEnabled = true; - // if (algo.BenchmarkSpeed == 0) { - // isBenchInit = false; - // break; - // } - // } - // } - // } - //} + bool hasAnyAlgoEnabled = false; + foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + if (cdev.Enabled) { + foreach (var algo in cdev.GetAlgorithmSettings()) { + if (algo.Enabled == true) { + hasAnyAlgoEnabled = true; + if (algo.BenchmarkSpeed == 0) { + isBenchInit = false; + break; + } + } + } + } + } // Check if the user has run benchmark first if (!isBenchInit) { DialogResult result = MessageBox.Show(International.GetText("EnabledUnbenchmarkedAlgorithmsWarning"), @@ -930,36 +935,10 @@ private bool StartMining(bool showWarnings) { } } } else { - return false; + return StartMiningReturnType.IgnoreMsg; } } - // check if any device enabled - // check devices without benchmarks - //bool noDeviceEnabled = true; - //foreach (var cdev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { - // if (cdev.Enabled) { - // noDeviceEnabled = false; - // break; - // } - //} - //if (noDeviceEnabled) { - // if (showWarnings) { - // DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_For_Mining"), - // International.GetText("Warning_with_Exclamation"), - // MessageBoxButtons.OK, MessageBoxIcon.Warning); - // } - // return false; - //} - //if (!hasAnyAlgoEnabled) { - // if (showWarnings) { - // DialogResult result = MessageBox.Show(International.GetText("Form_Main_No_Device_Enabled_Algorithms_For_Mining"), - // International.GetText("Warning_with_Exclamation"), - // MessageBoxButtons.OK, MessageBoxIcon.Warning); - // } - // return false; - //} - textBoxBTCAddress.Enabled = false; textBoxWorkerName.Enabled = false; comboBoxLocation.Enabled = false; @@ -985,7 +964,7 @@ private bool StartMining(bool showWarnings) { SMAMinerCheck.Start(); MinerStatsCheck.Start(); - return isMining; + return isMining ? StartMiningReturnType.StartMining : StartMiningReturnType.ShowNoMining; } private void StopMining() { From 97f806c4ca8692f6482c3e4c9c399e1893e8a073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 9 Mar 2017 08:48:22 +0100 Subject: [PATCH 324/366] update NVIDIA driver notice (En) --- NiceHashMiner/langs/en.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 5482255..6d00e97 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -315,7 +315,7 @@ "Compute_Device_Query_Manager_AMD_Query": "Checking AMD OpenCL GPUs", "Compute_Device_Query_Manager_AMD_Query_Skip": "Skip check for AMD OpenCL GPUs", "Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title": "Nvidia Recomended driver", - "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "We have detected that your system has Nvidia GPUs, but your driver is older than {0}. In order for NiceHash Miner to work correctly you should upgrade your drivers to recomended {1} or newer.", + "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "We have detected that your system has Nvidia GPUs, but your driver is older than {0}. In order for NiceHash Miner to work correctly you should upgrade your drivers to recomended {1} or newer. If you still see this warning after updating the driver please uninstall all your Nvidia drivers and make a clean install of latest official driver from http://www.nvidia.com.", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART" : " (current {0})", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended": "We have detected that your Nvidia Driver is older than {0}{1}. We recommend you to update to {2} or newer.", "NET45_Not_Intsalled_msg": "NiceHash Miner requires .NET Framework 4.5 or higher to work properly. Please install Microsoft .NET Framework 4.5", From 067e20e2c56535a217a79881fdc1d82889afcbe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 9 Mar 2017 09:10:21 +0100 Subject: [PATCH 325/366] sgminer check status for enabled GPUs only --- NiceHashMiner/Miners/sgminer.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index af1b6ab..e6f7a60 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -275,6 +275,8 @@ public override APIData GetSummary() { _currentMinerReadStatus = MinerAPIReadStatus.NONE; return null; } + //// sgminer debug log + //Helpers.ConsolePrint("sgminer-DEBUG_resp", resp); try { // Checks if all the GPUs are Alive first @@ -283,11 +285,13 @@ public override APIData GetSummary() { _currentMinerReadStatus = MinerAPIReadStatus.NONE; return null; } + //// sgminer debug log + //Helpers.ConsolePrint("sgminer-DEBUG_resp2", resp2); string[] checkGPUStatus = resp2.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < checkGPUStatus.Length - 1; i++) { - if (!checkGPUStatus[i].Contains("Status=Alive")) { + if (checkGPUStatus[i].Contains("Enabled=Y") && !checkGPUStatus[i].Contains("Status=Alive")) { Helpers.ConsolePrint(MinerTAG(), ProcessTag() + " GPU " + i + ": Sick/Dead/NoStart/Initialising/Disabled/Rejecting/Unknown"); _currentMinerReadStatus = MinerAPIReadStatus.WAIT; return null; From 32a9d7a0a61a83882dd864a1d2a33d4f638179dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 9 Mar 2017 10:44:59 +0100 Subject: [PATCH 326/366] GUI fixes --- NiceHashMiner/Algorithm.cs | 17 +++++++++++++++++ NiceHashMiner/Forms/Form_Benchmark.cs | 8 +++++++- NiceHashMiner/Miners/Miner.cs | 8 ++++++-- NiceHashMiner/Miners/sgminer.cs | 8 ++++++++ NiceHashMiner/langs/en.lang | 3 ++- NiceHashMiner/langs/ru.lang | 3 ++- 6 files changed, 42 insertions(+), 5 deletions(-) diff --git a/NiceHashMiner/Algorithm.cs b/NiceHashMiner/Algorithm.cs index 8844fbf..6982821 100644 --- a/NiceHashMiner/Algorithm.cs +++ b/NiceHashMiner/Algorithm.cs @@ -74,7 +74,22 @@ public void SetBenchmarkPending() { public void SetBenchmarkPendingNoMsg() { IsBenchmarkPending = true; } + + private bool IsPendingString() { + return BenchmarkStatus == International.GetText("Algorithm_Waiting_Benchmark") + || BenchmarkStatus == "." + || BenchmarkStatus == ".." + || BenchmarkStatus == "..."; + } + public void ClearBenchmarkPending() { + IsBenchmarkPending = false; + if (IsPendingString()) { + BenchmarkStatus = ""; + } + } + + public void ClearBenchmarkPendingFirst() { IsBenchmarkPending = false; BenchmarkStatus = ""; } @@ -84,6 +99,8 @@ public string BenchmarkSpeedString() { return BenchmarkStatus; } else if (BenchmarkSpeed > 0) { return Helpers.FormatSpeedOutput(BenchmarkSpeed); + } else if (!IsPendingString() && !string.IsNullOrEmpty(BenchmarkStatus)) { + return BenchmarkStatus; } return International.GetText("BenchmarkSpeedStringNone"); } diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index f72842d..e1dfc2e 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -153,6 +153,13 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm StartMining = false; + // clear prev pending statuses + foreach (var dev in ComputeDeviceManager.Avaliable.AllAvaliableDevices) { + foreach (var algo in dev.GetAlgorithmSettings()) { + algo.ClearBenchmarkPendingFirst(); + } + } + benchmarkOptions1.SetPerformanceType(benchmarkPerformanceType); // benchmark only unique devices @@ -199,7 +206,6 @@ public Form_Benchmark(BenchmarkPerformanceType benchmarkPerformanceType = Benchm devicesListViewEnableControl1.BenchmarkCalculation = this; algorithmsListView1.BenchmarkCalculation = this; - // set first device selected { if (ComputeDeviceManager.Avaliable.AllAvaliableDevices.Count > 0) { var firstComputedevice = ComputeDeviceManager.Avaliable.AllAvaliableDevices[0]; diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 72bdc11..19934b3 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -484,10 +484,14 @@ protected void BenchmarkThreadRoutineCatch(Exception ex) { Helpers.ConsolePrint(MinerTAG(), "Benchmark Exception: " + ex.Message); if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { OnBenchmarkCompleteCalled = true; - BenchmarkComunicator.OnBenchmarkComplete(false, BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated")); + BenchmarkComunicator.OnBenchmarkComplete(false, GetFinalBenchmarkString()); } } + protected virtual string GetFinalBenchmarkString() { + return BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated"); + } + protected void BenchmarkThreadRoutineFinish() { BenchmarkProcessStatus status = BenchmarkProcessStatus.Finished; @@ -506,7 +510,7 @@ protected void BenchmarkThreadRoutineFinish() { if (BenchmarkComunicator != null && !OnBenchmarkCompleteCalled) { OnBenchmarkCompleteCalled = true; bool isOK = BenchmarkProcessStatus.Success == status; - string msg = BenchmarkSignalTimedout ? International.GetText("Benchmark_Timedout") : International.GetText("Benchmark_Terminated"); + string msg = GetFinalBenchmarkString(); BenchmarkComunicator.OnBenchmarkComplete(isOK, isOK ? "" : msg); } } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index e6f7a60..f2beb48 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -207,6 +207,14 @@ protected override void BenchmarkOutputErrorDataReceivedImpl(string outdata) { } } + protected override string GetFinalBenchmarkString() { + if (BenchmarkAlgorithm.BenchmarkSpeed <= 0) { + Helpers.ConsolePrint("sgminer_GetFinalBenchmarkString", International.GetText("sgminer_precise_try")); + return International.GetText("sgminer_precise_try"); + } + return base.GetFinalBenchmarkString(); + } + protected override void BenchmarkThreadRoutine(object CommandLine) { Thread.Sleep(ConfigManager.GeneralConfig.MinerRestartDelayMS * 3); // increase wait for sgminer diff --git a/NiceHashMiner/langs/en.lang b/NiceHashMiner/langs/en.lang index 6d00e97..7c422c1 100644 --- a/NiceHashMiner/langs/en.lang +++ b/NiceHashMiner/langs/en.lang @@ -343,6 +343,7 @@ "Form_Settings_General_SwitchProfitabilityThreshold": "SwitchProfitabilityThreshold", "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Miner will not switch if the profitability is below SwitchProfitabilityThreshold. Value is in percentage [0 - 1]", - "VirtualMemorySize_BAD": "NiceHash Miner recommends increasing virtual memory size so that all algorithms would work fine." + "VirtualMemorySize_BAD": "NiceHash Miner recommends increasing virtual memory size so that all algorithms would work fine.", + "sgminer_precise_try": "Failed - try Precise" } } diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 0617dbd..66c6417 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -342,6 +342,7 @@ "Form_Settings_General_SwitchProfitabilityThreshold": "Порог переключения прибыльности", "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Майнер не будет переключаться, если разница между прибыльностью алгоритмов ниже Порога переключения прибыльности. Значение в процентах [0 — 1]", - "VirtualMemorySize_BAD": "NiceHash Miner рекомендует увеличить размер виртуальной памяти для нормальной работы всех алгоритмов." + "VirtualMemorySize_BAD": "NiceHash Miner рекомендует увеличить размер виртуальной памяти для нормальной работы всех алгоритмов.", + "sgminer_precise_try": "Failed - try Precise" } } \ No newline at end of file From 3fabd1d5d6dfe136c70b9225ffc23d2fc6ccc8c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 9 Mar 2017 18:47:47 +0100 Subject: [PATCH 327/366] update ru translation --- NiceHashMiner/langs/ru.lang | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/langs/ru.lang b/NiceHashMiner/langs/ru.lang index 66c6417..7f5de62 100644 --- a/NiceHashMiner/langs/ru.lang +++ b/NiceHashMiner/langs/ru.lang @@ -254,7 +254,7 @@ "AlgorithmsListView_GroupBox_NONE": "NONE", "AlgorithmsListView_ContextMenu_DisableAll": "Отключить все алгоритмы", "AlgorithmsListView_ContextMenu_EnableAll" : "Включить все алгоритмы", - "AlgorithmsListView_ContextMenu_ClearItem": "Быстрая скорость алгоритма", + "AlgorithmsListView_ContextMenu_ClearItem": "Сбросить скорость алгоритма", "BenchmarkOptions_Benchmark_Type": "Тип бенчмарка:", "Form_Main_MiningDevices": "Устройства {0}:", "Form_Main_bins_folder_files_missing": "Отсутствуют файлы с последней инициализации майнеров. Убедитесь, что ваш антивирус не блокирует приложение. NiceHash Miner может не работать правильно без недостающих файлов. Нажмите Да для переустановки NiceHash Miner, чтобы попробовать исправить ошибку.", @@ -317,7 +317,7 @@ "Compute_Device_Query_Manager_AMD_Query": "Проверка GPU AMD OpenCL", "Compute_Device_Query_Manager_AMD_Query_Skip": "Пропустить проверку GPU AMD OpenCL", "Compute_Device_Query_Manager_NVIDIA_RecomendedDriver_Title": "Рекомендуемый драйвер Nvidia", - "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "Мы обнаружили, что в вашей системе есть Nvidia GPU, но ваш драйвер старее {0}. Для корректной работы NiceHash Miner, вам необходимо обновить драйверы до рекомендуемого {1} или новее.", + "Compute_Device_Query_Manager_NVIDIA_Driver_Detection": "Мы обнаружили, что в вашей системе есть устройства Nvidia GPU, но ваш драйвер старее, чем {0}. Для правильной работы NiceHash Miner вам следует обновить ваши драйверы до рекомендуемых {1} или новее. Если вы все еще видите это предупреждение после обновления драйверов, удалите, пожалуйста, все ваши драйверы для Nvidia и выполните чистую установку последних официальных драйверов с http://www.nvidia.com.", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended_PART" : " (текущий {0})", "Compute_Device_Query_Manager_NVIDIA_Driver_Recomended": "Мы обнаружили, что ваш драйвер старее {0}{1}. Мы рекомендуем вам обновиться до {2} или новее.", "NET45_Not_Intsalled_msg" : "Для корректной работы NiceHash Miner требуется .NET Framework 4.5 или выше. Установите, пожалуйста, Microsoft .NET Framework 4.5", @@ -343,6 +343,7 @@ "Form_Settings_General_SwitchProfitabilityThreshold": "Порог переключения прибыльности", "Form_Settings_ToolTip_SwitchProfitabilityThreshold": "Майнер не будет переключаться, если разница между прибыльностью алгоритмов ниже Порога переключения прибыльности. Значение в процентах [0 — 1]", "VirtualMemorySize_BAD": "NiceHash Miner рекомендует увеличить размер виртуальной памяти для нормальной работы всех алгоритмов.", - "sgminer_precise_try": "Failed - try Precise" + "sgminer_precise_try": "Неудача — попробуйте Точный" + } } \ No newline at end of file From b3b98768b6d8476dd4e68acb2ba191c956fb5170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 10 Mar 2017 11:15:20 +0100 Subject: [PATCH 328/366] ver bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index c4c234b..67fa77a 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.2")] -[assembly: AssemblyFileVersion("1.7.5.2")] +[assembly: AssemblyVersion("1.7.5.3")] +[assembly: AssemblyFileVersion("1.7.5.3")] From 91fad460bc5c9ed2b668cec92df56f2c63e9fcf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 10 Mar 2017 16:29:26 +0100 Subject: [PATCH 329/366] clamore zcash -asm test reorder --- NiceHashMiner/Forms/Form_Benchmark.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index e1dfc2e..a051ce0 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -63,7 +63,7 @@ private class CPUBenchmarkStatus { private class ClaymoreZcashStatus { private const int MAX_BENCH = 2; - private readonly string[] ASM_MODES = new string[] { " -asm 0", " -asm 1" }; + private readonly string[] ASM_MODES = new string[] { " -asm 1", " -asm 0" }; private double[] speeds = new double[] { 0.0d, 0.0d }; private int CurIndex = 0; From 88f790c3244a7d4fbb969b6ecd44f18193c06ade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 15 Mar 2017 12:56:12 +0100 Subject: [PATCH 330/366] ClaymoreDual update, dl 3rdparty update, fixes --- NiceHashMiner/Devices/AmdGpuDevice.cs | 47 ++++++------ NiceHashMiner/Devices/CPUUtils.cs | 2 +- NiceHashMiner/Devices/ComputeDevice.cs | 6 +- NiceHashMiner/Devices/CudaDevice.cs | 19 ++--- NiceHashMiner/Devices/GroupAlgorithms.cs | 75 +++---------------- NiceHashMiner/Devices/GroupNames.cs | 2 +- NiceHashMiner/Devices/OpenCLDevice.cs | 2 +- NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs | 10 --- NiceHashMiner/Enums/ComputePlatformType.cs | 12 --- NiceHashMiner/Enums/MinerBaseType.cs | 4 + .../Enums/XmrStackCPUMinerConfigType.cs | 11 --- NiceHashMiner/Forms/Form_Benchmark.cs | 11 ++- NiceHashMiner/Globals.cs | 15 ++-- NiceHashMiner/Miners/ClaymoreDual.cs | 7 +- .../Miners/Equihash/ClaymoreZcashMiner.cs | 1 + NiceHashMiner/Miners/Grouping/MinerPaths.cs | 51 ++----------- NiceHashMiner/Miners/MinersSettingsManager.cs | 57 ++------------ NiceHashMiner/NiceHashMiner.csproj | 3 - NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 19 files changed, 84 insertions(+), 253 deletions(-) delete mode 100644 NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs delete mode 100644 NiceHashMiner/Enums/ComputePlatformType.cs delete mode 100644 NiceHashMiner/Enums/XmrStackCPUMinerConfigType.cs diff --git a/NiceHashMiner/Devices/AmdGpuDevice.cs b/NiceHashMiner/Devices/AmdGpuDevice.cs index 7a1000c..6934ae9 100644 --- a/NiceHashMiner/Devices/AmdGpuDevice.cs +++ b/NiceHashMiner/Devices/AmdGpuDevice.cs @@ -14,8 +14,8 @@ public class AmdGpuDevice { public string DeviceName; // init this with the ADL public string UUID; // init this with the ADL, use PCI_VEN & DEV IDs public ulong DeviceGlobalMemory { get { return _openClSubset._CL_DEVICE_GLOBAL_MEM_SIZE; } } - public bool UseOptimizedVersion { get; private set; } - private OpenCLDevice _openClSubset; + //public bool UseOptimizedVersion { get; private set; } + private OpenCLDevice _openClSubset = new OpenCLDevice(); public readonly string InfSection; // has arhitecture string // new drivers make some algorithms unusable 21.19.164.1 => driver not working with NeoScrypt and @@ -26,36 +26,31 @@ public class AmdGpuDevice { public AmdGpuDevice(OpenCLDevice openClSubset, bool isOldDriver, string infSection, bool driverDisableAlgo) { DriverDisableAlgos = driverDisableAlgo; InfSection = infSection; - _openClSubset = openClSubset; + if (openClSubset != null) { + _openClSubset = openClSubset; + } // Check for optimized version // first if not optimized Helpers.ConsolePrint("AmdGpuDevice", "List: " + _openClSubset._CL_DEVICE_NAME); - if (isOldDriver) { - UseOptimizedVersion = false; - Helpers.ConsolePrint("AmdGpuDevice", "GPU (" + _openClSubset._CL_DEVICE_NAME + ") is optimized => NOO! OLD DRIVER."); - } else if (!( _openClSubset._CL_DEVICE_NAME.Contains("Bonaire") - || _openClSubset._CL_DEVICE_NAME.Contains("Fiji") - || _openClSubset._CL_DEVICE_NAME.Contains("Hawaii") - || _openClSubset._CL_DEVICE_NAME.Contains("Pitcairn") - || _openClSubset._CL_DEVICE_NAME.Contains("Tahiti") - || _openClSubset._CL_DEVICE_NAME.Contains("Tonga"))) { - UseOptimizedVersion = false; - Helpers.ConsolePrint("AmdGpuDevice", "GPU (" + _openClSubset._CL_DEVICE_NAME + ") is optimized => NOO!"); - } else { - UseOptimizedVersion = true; - Helpers.ConsolePrint("AmdGpuDevice", "GPU (" + _openClSubset._CL_DEVICE_NAME + ") is optimized => YES!"); - } + //if (isOldDriver) { + // UseOptimizedVersion = false; + // Helpers.ConsolePrint("AmdGpuDevice", "GPU (" + _openClSubset._CL_DEVICE_NAME + ") is optimized => NOO! OLD DRIVER."); + //} else if (!( _openClSubset._CL_DEVICE_NAME.Contains("Bonaire") + // || _openClSubset._CL_DEVICE_NAME.Contains("Fiji") + // || _openClSubset._CL_DEVICE_NAME.Contains("Hawaii") + // || _openClSubset._CL_DEVICE_NAME.Contains("Pitcairn") + // || _openClSubset._CL_DEVICE_NAME.Contains("Tahiti") + // || _openClSubset._CL_DEVICE_NAME.Contains("Tonga"))) { + // UseOptimizedVersion = false; + // Helpers.ConsolePrint("AmdGpuDevice", "GPU (" + _openClSubset._CL_DEVICE_NAME + ") is optimized => NOO!"); + //} else { + // UseOptimizedVersion = true; + // Helpers.ConsolePrint("AmdGpuDevice", "GPU (" + _openClSubset._CL_DEVICE_NAME + ") is optimized => YES!"); + //} } - private bool _isEtherumCapable = false; - private bool _isEtherumCapableInit = false; public bool IsEtherumCapable() { - if (!_isEtherumCapableInit) { - _isEtherumCapableInit = true; - // check if 2GB device memory - _isEtherumCapable = _openClSubset._CL_DEVICE_GLOBAL_MEM_SIZE >= ComputeDevice.MEMORY_3GB; - } - return _isEtherumCapable; + return _openClSubset._CL_DEVICE_GLOBAL_MEM_SIZE >= ComputeDevice.MEMORY_3GB; } } } diff --git a/NiceHashMiner/Devices/CPUUtils.cs b/NiceHashMiner/Devices/CPUUtils.cs index 61867bb..0d4ae17 100644 --- a/NiceHashMiner/Devices/CPUUtils.cs +++ b/NiceHashMiner/Devices/CPUUtils.cs @@ -55,7 +55,7 @@ public static CPUExtensionType GetMostOptimized() { } /// - /// Checks if CPU mining is capable by checking GetMostOptimized is not automatic + /// Checks if CPU mining is capable, CPU must have AES support /// /// public static bool IsCPUMiningCapable() { diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 7576b15..4c84350 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -39,7 +39,7 @@ public class ComputeDevice //CudaDevice _cudaDevice = null; //AmdGpuDevice _amdDevice = null; // sgminer extra quickfix - public readonly bool IsOptimizedVersion; + //public readonly bool IsOptimizedVersion; public readonly string Codename; public readonly string InfSection; // amd has some algos not working with new drivers @@ -60,7 +60,7 @@ public ComputeDevice(int id) { DeviceType = DeviceType.CPU; DeviceGroupType = DeviceGroupType.NONE; IsEtherumCapale = false; - IsOptimizedVersion = false; + //IsOptimizedVersion = false; Codename = "fake"; UUID = GetUUID(ID, GroupNames.GetGroupName(DeviceGroupType, ID), Name, DeviceGroupType); GpuRam = 0; @@ -112,7 +112,7 @@ public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount, bool isDetectionFallb UUID = amdDevice.UUID; } // sgminer extra - IsOptimizedVersion = amdDevice.UseOptimizedVersion; + //IsOptimizedVersion = amdDevice.UseOptimizedVersion; Codename = amdDevice.Codename; InfSection = amdDevice.InfSection; AlgorithmSettings = GroupAlgorithms.CreateForDeviceList(this); diff --git a/NiceHashMiner/Devices/CudaDevice.cs b/NiceHashMiner/Devices/CudaDevice.cs index 08f75d5..f8d4dbb 100644 --- a/NiceHashMiner/Devices/CudaDevice.cs +++ b/NiceHashMiner/Devices/CudaDevice.cs @@ -26,22 +26,13 @@ public string GetName() { return String.Format("{0} {1}", VendorName, DeviceName); } - private bool _isEtherumCapable = false; - private bool _isEtherumCapableInit = false; public bool IsEtherumCapable() { - if (!_isEtherumCapableInit) { - _isEtherumCapableInit = true; - _isEtherumCapable = SM_major == 3 || SM_major == 5 || SM_major == 6; - // check if 2GB device memory - _isEtherumCapable = _isEtherumCapable && DeviceGlobalMemory >= ComputeDevice.MEMORY_3GB; - - // exception devices - if (DeviceName.Contains("750") && DeviceName.Contains("Ti")) { - Helpers.ConsolePrint("CudaDevice", "GTX 750Ti found! By default this device will be disabled for ethereum as it is generally too slow to mine on it."); - _isEtherumCapable = false; - } + // exception devices + if (DeviceName.Contains("750") && DeviceName.Contains("Ti")) { + Helpers.ConsolePrint("CudaDevice", "GTX 750Ti found! By default this device will be disabled for ethereum as it is generally too slow to mine on it."); + return false; } - return _isEtherumCapable; + return DeviceGlobalMemory >= ComputeDevice.MEMORY_3GB && SM_major >= 3; } } } diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 909cd1d..5d7a75d 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -26,13 +26,8 @@ public static Dictionary> CreateForDevice(Compute // Check for optimized version if (Lyra2REv2_Index > -1) { - if (device.IsOptimizedVersion) { - sgminerAlgos[Lyra2REv2_Index].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 512 --thread-concurrency 0 --worksize 64 --gpu-threads 1"; - } else { - sgminerAlgos[Lyra2REv2_Index].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"; - } + sgminerAlgos[Lyra2REv2_Index].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"; } - if (!device.Codename.Contains("Tahiti") && NeoScrypt_Index > -1) { sgminerAlgos[NeoScrypt_Index].ExtraLaunchParameters = AmdGpuDevice.DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 2"; Helpers.ConsolePrint("ComputeDevice", "The GPU detected (" + device.Codename + ") is not Tahiti. Changing default gpu-threads to 2."); @@ -54,8 +49,7 @@ public static Dictionary> CreateForDevice(Compute } } } - - // check if 3rd party is enabled and allow 3rd party only algos + // non sgminer optimizations if (algoSettings.ContainsKey(MinerBaseType.ClaymoreAMD)) { var ClaymoreAlgos = algoSettings[MinerBaseType.ClaymoreAMD]; int CryptoNight_Index = ClaymoreAlgos.FindIndex((el) => el.NiceHashID == AlgorithmType.CryptoNight); @@ -101,18 +95,9 @@ public static Dictionary> CreateForDevice(Compute foreach (var algo in algoSettings[MinerBaseType.ClaymoreAMD]) { if (algo.NiceHashID == AlgorithmType.CryptoNight || algo.NiceHashID == AlgorithmType.DaggerHashimoto) { algo.Enabled = false; - //break; } } } - //if (algoSettings.ContainsKey(MinerBaseType.sgminer)) { - // foreach (var algo in algoSettings[MinerBaseType.sgminer]) { - // if (algo.NiceHashID == AlgorithmType.DaggerHashimoto) { - // algo.Enabled = false; - // break; - // } - // } - //} } } // END AMD case @@ -120,18 +105,13 @@ public static Dictionary> CreateForDevice(Compute if (device.IsEtherumCapale == false) { algoSettings = FilterMinerAlgos(algoSettings, new List { AlgorithmType.DaggerHashimoto }); } - - } - //if (algoSettings.ContainsKey(MinerBaseType.XmrStackCPU)) { - // algoSettings[MinerBaseType.XmrStackCPU][0].LessThreads = device.Threads / 2; // use half - //} - if (algoSettings.ContainsKey(MinerBaseType.ccminer_alexis)) { - foreach (var unstable_algo in algoSettings[MinerBaseType.ccminer_alexis]) { - unstable_algo.Enabled = false; + if (algoSettings.ContainsKey(MinerBaseType.ccminer_alexis)) { + foreach (var unstable_algo in algoSettings[MinerBaseType.ccminer_alexis]) { + unstable_algo.Enabled = false; + } } - } - + } // END algoSettings != null return algoSettings; } return null; @@ -140,8 +120,10 @@ public static Dictionary> CreateForDevice(Compute public static List CreateForDeviceList(ComputeDevice device) { List ret = new List(); var retDict = CreateForDevice(device); - foreach (var kvp in retDict) { - ret.AddRange(kvp.Value); + if (retDict != null) { + foreach (var kvp in retDict) { + ret.AddRange(kvp.Value); + } } return ret; } @@ -149,29 +131,11 @@ public static List CreateForDeviceList(ComputeDevice device) { public static Dictionary> CreateDefaultsForGroup(DeviceGroupType deviceGroupType) { if (DeviceGroupType.CPU == deviceGroupType) { return new Dictionary>() { - //{ MinerBaseType.cpuminer, - // new List() { - // new Algorithm(MinerBaseType.cpuminer, AlgorithmType.Lyra2RE, "lyra2"), - // new Algorithm(MinerBaseType.cpuminer, AlgorithmType.Hodl, "hodl"), - // new Algorithm(MinerBaseType.cpuminer, AlgorithmType.CryptoNight, "cryptonight") - // } - //}, - //{ MinerBaseType.nheqminer, - // new List() { - // new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") - // } - //}, - //{ MinerBaseType.eqm, - // new List() { - // new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") - // } - //}, { MinerBaseType.XmrStackCPU, new List() { new Algorithm(MinerBaseType.XmrStackCPU, AlgorithmType.CryptoNight, "cryptonight") } } - }; } if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { @@ -191,14 +155,9 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.sgminer, AlgorithmType.X11Gost, "sibcoin-mod") { ExtraLaunchParameters = DefaultParam + "--intensity 16 -w 64 -g 2" } } }, - //{ MinerBaseType.ethminer, - // new List() { - // new Algorithm(MinerBaseType.ethminer, AlgorithmType.DaggerHashimoto, "daggerhashimoto") - // } - //}, { MinerBaseType.ClaymoreAMD, new List() { - new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.CryptoNight, "cryptonight"), /*, { ExtraLaunchParameters: "-a 4" }*/ + new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.CryptoNight, "cryptonight"), new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.Equihash, "equihash"), new Algorithm(MinerBaseType.ClaymoreAMD, AlgorithmType.DaggerHashimoto, "") } @@ -317,15 +276,5 @@ static List GetKeysForMinerAlgosGroup(Dictionary GetAlgorithmKeysForGroup(DeviceGroupType deviceGroupType) { - // var ret = CreateDefaultsForGroup(deviceGroupType); - // if (ret != null) { - // return new List (ret.Keys); - // } - // return null; - //} - } } diff --git a/NiceHashMiner/Devices/GroupNames.cs b/NiceHashMiner/Devices/GroupNames.cs index 4dc192b..a206bb8 100644 --- a/NiceHashMiner/Devices/GroupNames.cs +++ b/NiceHashMiner/Devices/GroupNames.cs @@ -8,7 +8,7 @@ namespace NiceHashMiner.Devices static public class GroupNames { private static readonly string[] _names = { - "CPU", // TODO we can have more then one CPU + "CPU", // we can have more then one CPU "AMD_OpenCL", "NVIDIA2.1", "NVIDIA3.x", diff --git a/NiceHashMiner/Devices/OpenCLDevice.cs b/NiceHashMiner/Devices/OpenCLDevice.cs index 4fd7593..fc4592d 100644 --- a/NiceHashMiner/Devices/OpenCLDevice.cs +++ b/NiceHashMiner/Devices/OpenCLDevice.cs @@ -8,7 +8,7 @@ public class OpenCLDevice { public uint DeviceID; public string _CL_DEVICE_NAME; public string _CL_DEVICE_TYPE; - public ulong _CL_DEVICE_GLOBAL_MEM_SIZE; + public ulong _CL_DEVICE_GLOBAL_MEM_SIZE = 0; public string _CL_DEVICE_VENDOR; public string _CL_DEVICE_VERSION; public string _CL_DRIVER_VERSION; diff --git a/NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs b/NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs deleted file mode 100644 index 3602b40..0000000 --- a/NiceHashMiner/Enums/AMD_Equihash_3rdParty.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace NiceHashMiner.Enums { - public enum AMD_Equihash_3rdParty { - Claymore = 0, - Optminer - } -} diff --git a/NiceHashMiner/Enums/ComputePlatformType.cs b/NiceHashMiner/Enums/ComputePlatformType.cs deleted file mode 100644 index cda799f..0000000 --- a/NiceHashMiner/Enums/ComputePlatformType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace NiceHashMiner.Enums { - public enum ComputePlatformType { - NONE, - Intel, - NVIDIA, - AMD - } -} diff --git a/NiceHashMiner/Enums/MinerBaseType.cs b/NiceHashMiner/Enums/MinerBaseType.cs index 510d73b..e1d3433 100644 --- a/NiceHashMiner/Enums/MinerBaseType.cs +++ b/NiceHashMiner/Enums/MinerBaseType.cs @@ -3,6 +3,10 @@ using System.Text; namespace NiceHashMiner.Enums { + + /// + /// Do not delete obsolete enums! Always add new ones before the END enum. + /// public enum MinerBaseType { NONE = 0, cpuminer, diff --git a/NiceHashMiner/Enums/XmrStackCPUMinerConfigType.cs b/NiceHashMiner/Enums/XmrStackCPUMinerConfigType.cs deleted file mode 100644 index 7fde6fe..0000000 --- a/NiceHashMiner/Enums/XmrStackCPUMinerConfigType.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace NiceHashMiner.Enums { - public enum XmrStackCPUMinerConfigType { - DEFAULT = 0, - HT, - FILE - } -} diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index a051ce0..463d035 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -95,9 +95,15 @@ public string GetTestExtraParams() { } private int FastestIndex() { - if (speeds[1] > speeds[0]) { - return 1; + int maxIndex = 0; + double maxValue = speeds[maxIndex]; + for (int i = 1; i < speeds.Length; ++i) { + if (speeds[i] > maxValue) { + maxIndex = i; + maxValue = speeds[i]; + } } + return 0; } @@ -562,6 +568,7 @@ public void OnBenchmarkComplete(bool success, string status) { if (__ClaymoreZcashStatus != null && _currentAlgorithm.MinerBaseType == MinerBaseType.ClaymoreAMD && _currentAlgorithm.NiceHashID == AlgorithmType.Equihash) { if (__ClaymoreZcashStatus.HasTest()) { rebenchSame = true; + //System.Threading.Thread.Sleep(1000*60*5); __ClaymoreZcashStatus.SetSpeed(_currentAlgorithm.BenchmarkSpeed); __ClaymoreZcashStatus.SetNext(); _currentAlgorithm.ExtraLaunchParameters = __ClaymoreZcashStatus.GetTestExtraParams(); diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index 56e9bf0..302709a 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -5,22 +5,23 @@ namespace NiceHashMiner { public class Globals { + // Constants public static string[] MiningLocation = { "eu", "usa", "hk", "jp" }; - public static Dictionary NiceHashData = null; - public static double BitcoinRate; public static readonly string DemoUser = "3DJhaQaKA6oyRaGyDZYdkZcise4b9DrCi2"; public static readonly string PasswordDefault = "x"; + // change this if TOS changes + public static int CURRENT_TOS_VER = 2; + + // Variables + public static Dictionary NiceHashData = null; + public static double BitcoinRate; public static JsonSerializerSettings JsonSettings = null; public static int ThreadsPerCPU; // quickfix guard for checking internet conection public static bool IsFirstNetworkCheckTimeout = true; public static int FirstNetworkCheckTimeoutTimeMS = 500; public static int FirstNetworkCheckTimeoutTries = 10; - // sgminer Ellesmere/Polaris ignore setting (sgminer needs more testing) - //public static bool IsEllesmereSgminerDefaultDisabled = true; - - // change this if TOS changes - public static int CURRENT_TOS_VER = 2; + public static string GetLocationURL(AlgorithmType AlgorithmType, string miningLocation, NHMConectionType ConectionType) { if (Globals.NiceHashData != null && Globals.NiceHashData.ContainsKey(AlgorithmType)) { diff --git a/NiceHashMiner/Miners/ClaymoreDual.cs b/NiceHashMiner/Miners/ClaymoreDual.cs index dd5954f..fb57ab3 100644 --- a/NiceHashMiner/Miners/ClaymoreDual.cs +++ b/NiceHashMiner/Miners/ClaymoreDual.cs @@ -57,7 +57,7 @@ private string GetStartCommand(string url, string btcAdress, string worker) { } return " " + GetDevicesCommandString() - + String.Format(" -epool {0} -ewal {1} -mport -{2} -esm 3 -epsw x -allpools 1", url, username, APIPort) + + String.Format(" -epool {0} -ewal {1} -mport 127.0.0.1:{2} -esm 3 -epsw x -allpools 1", url, username, APIPort) + dualModeParams; } @@ -75,11 +75,12 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti benchmarkTimeWait = time; - // network workaround + // network stub string url = Globals.GetLocationURL(algorithm.NiceHashID, Globals.MiningLocation[ConfigManager.GeneralConfig.ServiceLocation], this.ConectionType); // demo for benchmark string ret = GetStartCommand(url, Globals.DemoUser, ConfigManager.GeneralConfig.WorkerName.Trim()); - return ret; + // local benhcmark + return ret + " -benchmark 1"; } } diff --git a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs index 07057da..5e30fd4 100644 --- a/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs +++ b/NiceHashMiner/Miners/Equihash/ClaymoreZcashMiner.cs @@ -19,6 +19,7 @@ public class ClaymoreZcashMiner : ClaymoreBaseMiner { const string _LOOK_FOR_START = "ZEC - Total Speed:"; public ClaymoreZcashMiner() : base("ClaymoreZcashMiner", _LOOK_FOR_START) { + ignoreZero = true; } protected override double DevFee() { diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 3f5063a..04920b9 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -26,15 +26,7 @@ public static class Data { public const string ccminer_tpruvot = _bin + @"\ccminer_tpruvot.exe"; public const string ccminer_cryptonight = _bin + @"\ccminer_cryptonight.exe"; public const string ccminer_x11gost = _bin + @"\ccminer_x11gost.exe"; - ///// - ///// cpuminers opt new - ///// - //public const string cpuminer_opt_AVX2_AES = _bin + @"\cpuminer_opt_AVX2_AES.exe"; - //public const string cpuminer_opt_AVX2 = _bin + @"\cpuminer_opt_AVX2.exe"; - //public const string cpuminer_opt_AVX_AES = _bin + @"\cpuminer_opt_AVX_AES.exe"; - //public const string cpuminer_opt_AVX = _bin + @"\cpuminer_opt_AVX.exe"; - //public const string cpuminer_opt_AES = _bin + @"\cpuminer_opt_AES.exe"; - //public const string cpuminer_opt_SSE2 = _bin + @"\cpuminer_opt_SSE2.exe"; + /// /// ethminers /// @@ -76,14 +68,12 @@ public static bool IsMinerAlgorithmAvaliable(List algos, MinerBaseTyp return algos.FindIndex((a) => a.MinerBaseType == minerBaseType && a.NiceHashID == algorithmType) > -1; } - public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoType, DeviceGroupType devGroupType, string devCodenameAMD, bool isOptimizedAMD, CPUExtensionType MostOptimizedCPUExtensionType) { + public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoType, DeviceGroupType devGroupType) { switch (minerBaseType) { - //case MinerBaseType.cpuminer: - // return CPU_GROUP.cpu_miner_opt(MostOptimizedCPUExtensionType); case MinerBaseType.ccminer: return NVIDIA_GROUPS.ccminer_path(algoType, devGroupType); case MinerBaseType.sgminer: - return AMD_GROUP.sgminer_path(algoType, devCodenameAMD, isOptimizedAMD); + return AMD_GROUP.sgminer_path(algoType); case MinerBaseType.nheqminer: return Data.nheqminer; case MinerBaseType.eqm: @@ -112,10 +102,7 @@ public static string GetPathFor(ComputeDevice computeDevice, Algorithm algorithm return GetPathFor( algorithm.MinerBaseType, algorithm.NiceHashID, - computeDevice.DeviceGroupType, - computeDevice.Codename, - computeDevice.IsOptimizedVersion, - CPUUtils.GetMostOptimized() + computeDevice.DeviceGroupType ); } @@ -194,22 +181,10 @@ public static string ccminer_unstable_path(AlgorithmType algorithmType, DeviceGr } static class AMD_GROUP { - public static string sgminer_path(AlgorithmType type, string gpuCodename, bool isOptimized) { + public static string sgminer_path(AlgorithmType type) { if (AlgorithmType.CryptoNight == type || AlgorithmType.DaggerHashimoto == type) { return Data.sgminer_gm; } - //if (isOptimized) { - // if (AlgorithmType.Lyra2REv2 == type) { - // if (!(gpuCodename.Contains("Hawaii") || gpuCodename.Contains("Pitcairn") || gpuCodename.Contains("Tahiti"))) { - // if (!Helpers.InternalCheckIsWow64()) - // return Data.sgminer_5_6_0_general; - - // return Data.sgminer_5_4_0_tweaked; - // } - // return Data.sgminer_5_1_0_optimized; - // } - //} - return Data.sgminer_5_6_0_general; } @@ -224,21 +199,5 @@ public static string ClaymorePath(AlgorithmType type) { return Data.NONE; // should not happen } } - - //static class CPU_GROUP { - // public static string cpu_miner_opt(CPUExtensionType type) { - // // algorithmType is not needed ATM - // // algorithmType: AlgorithmType - // if (CPUExtensionType.AVX2_AES == type) { return Data.cpuminer_opt_AVX2_AES; } - // if (CPUExtensionType.AVX2 == type) { return Data.cpuminer_opt_AVX2; } - // if (CPUExtensionType.AVX_AES == type) { return Data.cpuminer_opt_AVX_AES; } - // if (CPUExtensionType.AVX == type) { return Data.cpuminer_opt_AVX; } - // if (CPUExtensionType.AES == type) { return Data.cpuminer_opt_AES; } - // if (CPUExtensionType.SSE2 == type) { return Data.cpuminer_opt_SSE2; } - - // return Data.NONE; // should not happen - // } - //} - } } diff --git a/NiceHashMiner/Miners/MinersSettingsManager.cs b/NiceHashMiner/Miners/MinersSettingsManager.cs index f9cf4ae..082c086 100644 --- a/NiceHashMiner/Miners/MinersSettingsManager.cs +++ b/NiceHashMiner/Miners/MinersSettingsManager.cs @@ -42,16 +42,6 @@ public static List GetPortsListFor(MinerBaseType minerBaseType, string path } public static void InitMinerReservedPortsFile() { - var AMDCodenames = new List() { "Hawaii", "Pitcairn", "Tahiti" }; - var AMDOptimizations = new List() { true, false }; - var CPUExtensions = new List() { - CPUExtensionType.AVX2_AES, - CPUExtensionType.AVX2, - CPUExtensionType.AVX_AES, - CPUExtensionType.AVX, - CPUExtensionType.AES, - CPUExtensionType.SSE2 - }; MinerReservedPortsFile file = new MinerReservedPortsFile(); MinerReservedPorts = new Dictionary>>>(); if (file.IsFileExists()) { @@ -73,45 +63,15 @@ public static void InitMinerReservedPortsFile() { MinerBaseType minerBaseType = mbaseKvp.Key; if (MinerReservedPorts.ContainsKey(minerBaseType)) { var algos = mbaseKvp.Value; - // CPU case - if (MinerBaseType.cpuminer == minerBaseType) { - foreach (var algo in algos) { - foreach (var cpuExt in CPUExtensions) { - var algoType = algo.NiceHashID; - var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, "", false, cpuExt); - if (path != MinerPaths.Data.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { - MinerReservedPorts[minerBaseType][path] = new Dictionary>(); - } - if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { - MinerReservedPorts[minerBaseType][path][algoType] = new List(); - } - } + foreach (var algo in algos) { + var algoType = algo.NiceHashID; + var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType); + var isPathValid = path != MinerPaths.Data.NONE; + if (isPathValid && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { + MinerReservedPorts[minerBaseType][path] = new Dictionary>(); } - } else if (MinerBaseType.sgminer == minerBaseType) { - foreach (var algo in algos) { - foreach (var isOptimized in AMDOptimizations) { - foreach (var codename in AMDCodenames) { - var algoType = algo.NiceHashID; - var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, codename, isOptimized, CPUExtensionType.Automatic); - if (path != MinerPaths.Data.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { - MinerReservedPorts[minerBaseType][path] = new Dictionary>(); - } - if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { - MinerReservedPorts[minerBaseType][path][algoType] = new List(); - } - } - } - } - } else { - foreach (var algo in algos) { - var algoType = algo.NiceHashID; - var path = MinerPaths.GetPathFor(minerBaseType, algoType, devGroupType, "", false, CPUExtensionType.Automatic); - if (path != MinerPaths.Data.NONE && MinerReservedPorts[minerBaseType].ContainsKey(path) == false) { - MinerReservedPorts[minerBaseType][path] = new Dictionary>(); - } - if (MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { - MinerReservedPorts[minerBaseType][path][algoType] = new List(); - } + if (isPathValid && MinerReservedPorts[minerBaseType][path] != null && MinerReservedPorts[minerBaseType][path].ContainsKey(algoType) == false) { + MinerReservedPorts[minerBaseType][path][algoType] = new List(); } } } @@ -130,7 +90,6 @@ public static void InitMinerReservedPortsFile() { } } } catch { - } } diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 202f098..cdeee97 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -80,7 +80,6 @@ - @@ -106,10 +105,8 @@ - - diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index bcfb921..bf13c72 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -20,7 +20,7 @@ public static class MinersDownloadManager { "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_5_2.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_5_4.zip", "bins_3rdparty.zip", "bin_3rdparty"); From 18bd432aa91d5d907d90b74e562728c9badb3b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 15 Mar 2017 14:05:37 +0100 Subject: [PATCH 331/366] fix auto -asm check, remove unused GUI setting --- NiceHashMiner/Forms/Form_Benchmark.cs | 8 +++++++- NiceHashMiner/Forms/Form_Settings.Designer.cs | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 463d035..399cfd0 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -113,6 +113,8 @@ public string GetFastestExtraParams() { public double GetFastestTime() { return speeds[FastestIndex()]; } + + public int Time = 180; } private ClaymoreZcashStatus __ClaymoreZcashStatus = null; @@ -481,6 +483,9 @@ void NextBenchmark() { if (__CPUBenchmarkStatus != null) { __CPUBenchmarkStatus.Time = time; } + if (__ClaymoreZcashStatus != null) { + __ClaymoreZcashStatus.Time = time; + } // dagger about 4 minutes var showWaitTime = _currentAlgorithm.NiceHashID == AlgorithmType.DaggerHashimoto ? 4 * 60 : time; @@ -567,6 +572,7 @@ public void OnBenchmarkComplete(bool success, string status) { if (__ClaymoreZcashStatus != null && _currentAlgorithm.MinerBaseType == MinerBaseType.ClaymoreAMD && _currentAlgorithm.NiceHashID == AlgorithmType.Equihash) { if (__ClaymoreZcashStatus.HasTest()) { + _currentMiner = MinerFactory.CreateMiner(_currentDevice, _currentAlgorithm); rebenchSame = true; //System.Threading.Thread.Sleep(1000*60*5); __ClaymoreZcashStatus.SetSpeed(_currentAlgorithm.BenchmarkSpeed); @@ -605,7 +611,7 @@ public void OnBenchmarkComplete(bool success, string status) { if (__CPUBenchmarkStatus != null) { _currentMiner.BenchmarkStart(__CPUBenchmarkStatus.Time, this); } else if (__ClaymoreZcashStatus != null) { - _currentMiner.BenchmarkStart(45, this); + _currentMiner.BenchmarkStart(__ClaymoreZcashStatus.Time, this); } } else { NextBenchmark(); diff --git a/NiceHashMiner/Forms/Form_Settings.Designer.cs b/NiceHashMiner/Forms/Form_Settings.Designer.cs index b9df65f..7808a78 100644 --- a/NiceHashMiner/Forms/Form_Settings.Designer.cs +++ b/NiceHashMiner/Forms/Form_Settings.Designer.cs @@ -1024,6 +1024,7 @@ private void InitializeComponent() { this.pictureBox_CPU0_ForceCPUExtension.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; this.pictureBox_CPU0_ForceCPUExtension.TabIndex = 385; this.pictureBox_CPU0_ForceCPUExtension.TabStop = false; + this.pictureBox_CPU0_ForceCPUExtension.Visible = false; // // pictureBox_MinerAPIQueryInterval // @@ -1093,6 +1094,7 @@ private void InitializeComponent() { this.comboBox_CPU0_ForceCPUExtension.Name = "comboBox_CPU0_ForceCPUExtension"; this.comboBox_CPU0_ForceCPUExtension.Size = new System.Drawing.Size(177, 21); this.comboBox_CPU0_ForceCPUExtension.TabIndex = 379; + this.comboBox_CPU0_ForceCPUExtension.Visible = false; this.comboBox_CPU0_ForceCPUExtension.SelectedIndexChanged += new System.EventHandler(this.comboBox_CPU0_ForceCPUExtension_SelectedIndexChanged); // // label_CPU0_ForceCPUExtension @@ -1103,6 +1105,7 @@ private void InitializeComponent() { this.label_CPU0_ForceCPUExtension.Size = new System.Drawing.Size(105, 13); this.label_CPU0_ForceCPUExtension.TabIndex = 382; this.label_CPU0_ForceCPUExtension.Text = "ForceCPUExtension:"; + this.label_CPU0_ForceCPUExtension.Visible = false; // // label_MinIdleSeconds // From ed9e0c301da119966a99c1a0425ec39551625969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 15 Mar 2017 16:13:22 +0100 Subject: [PATCH 332/366] ver bump, note pre-release --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 7fe3342..db90647 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -53,7 +53,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = "-Pre-Release_01"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 67fa77a..147f5d0 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.3")] -[assembly: AssemblyFileVersion("1.7.5.3")] +[assembly: AssemblyVersion("1.7.5.4")] +[assembly: AssemblyFileVersion("1.7.5.4")] From 6202422893a000671aa4d6f3bb0e9f0bc9ebcbfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 15 Mar 2017 16:51:12 +0100 Subject: [PATCH 333/366] change unreadable code --- NiceHashMiner/Forms/Form_Main.cs | 40 ++++++++++++-------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index db90647..95602c4 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -641,23 +641,28 @@ void SetEnvironmentVariables() { Helpers.ConsolePrint("NICEHASH", "Setting environment variables"); - string[] envName = { "GPU_MAX_ALLOC_PERCENT", "GPU_USE_SYNC_OBJECTS", - "GPU_SINGLE_ALLOC_PERCENT", "GPU_MAX_HEAP_SIZE", "GPU_FORCE_64BIT_PTR" }; - string[] envValue = { "100", "1", "100", "100", "1" }; - - for (int i = 0; i < envName.Length; i++) - { + Dictionary envNameValues = new Dictionary() { + { "GPU_MAX_ALLOC_PERCENT", "100" }, + { "GPU_USE_SYNC_OBJECTS", "1" }, + { "GPU_SINGLE_ALLOC_PERCENT", "100" }, + { "GPU_MAX_HEAP_SIZE", "100" }, + { "GPU_FORCE_64BIT_PTR", "1" } + }; + + foreach (var kvp in envNameValues) { + string envName = kvp.Key; + string envValue = kvp.Value; // Check if all the variables is set - if (Environment.GetEnvironmentVariable(envName[i]) == null) + if (Environment.GetEnvironmentVariable(envName) == null) { - try { Environment.SetEnvironmentVariable(envName[i], envValue[i]); } + try { Environment.SetEnvironmentVariable(envName, envValue); } catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } } // Check to make sure all the values are set correctly - if (!Environment.GetEnvironmentVariable(envName[i]).Equals(envValue[i])) + if (!Environment.GetEnvironmentVariable(envName).Equals(envValue)) { - try { Environment.SetEnvironmentVariable(envName[i], envValue[i]); } + try { Environment.SetEnvironmentVariable(envName, envValue); } catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } } } @@ -756,21 +761,6 @@ private void buttonSettings_Click(object sender, EventArgs e) } } - - //private bool isRaiseAlertSharesNotAcceptedShown = false; - //public void RaiseAlertSharesNotAccepted(string algoName) { - // if (!isRaiseAlertSharesNotAcceptedShown) { - // isRaiseAlertSharesNotAcceptedShown = true; - - // MessageBox.Show(String.Format(International.GetText("Form_Main_Accepted_Speed_Zero"), algoName), - // International.GetText("Warning_with_Exclamation"), - // MessageBoxButtons.OK, MessageBoxIcon.Warning); - - // isRaiseAlertSharesNotAcceptedShown = false; - // } - //} - - private void buttonStartMining_Click(object sender, EventArgs e) { IsManuallyStarted = true; if (StartMining(true) == StartMiningReturnType.ShowNoMining) { From 42f52e2506b744e8f438528907c46d9e1b1f1f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 15 Mar 2017 18:12:39 +0100 Subject: [PATCH 334/366] set sys env vars for specific miner process --- NiceHashMiner/Forms/Form_Main.cs | 62 +++++++++---------- NiceHashMiner/Miners/Miner.cs | 15 +++++ NiceHashMiner/Miners/MinersSettingsManager.cs | 53 +++++++++++++++- 3 files changed, 98 insertions(+), 32 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 95602c4..726dfe8 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -289,7 +289,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetEnvironmentVariable")); - SetEnvironmentVariables(); + //SetEnvironmentVariables(); LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetWindowsErrorReporting")); @@ -637,36 +637,36 @@ void UpdateCheck_Tick(object sender, EventArgs e) } - void SetEnvironmentVariables() - { - Helpers.ConsolePrint("NICEHASH", "Setting environment variables"); - - Dictionary envNameValues = new Dictionary() { - { "GPU_MAX_ALLOC_PERCENT", "100" }, - { "GPU_USE_SYNC_OBJECTS", "1" }, - { "GPU_SINGLE_ALLOC_PERCENT", "100" }, - { "GPU_MAX_HEAP_SIZE", "100" }, - { "GPU_FORCE_64BIT_PTR", "1" } - }; - - foreach (var kvp in envNameValues) { - string envName = kvp.Key; - string envValue = kvp.Value; - // Check if all the variables is set - if (Environment.GetEnvironmentVariable(envName) == null) - { - try { Environment.SetEnvironmentVariable(envName, envValue); } - catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } - } - - // Check to make sure all the values are set correctly - if (!Environment.GetEnvironmentVariable(envName).Equals(envValue)) - { - try { Environment.SetEnvironmentVariable(envName, envValue); } - catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } - } - } - } + //void SetEnvironmentVariables() + //{ + // Helpers.ConsolePrint("NICEHASH", "Setting environment variables"); + + // Dictionary envNameValues = new Dictionary() { + // { "GPU_MAX_ALLOC_PERCENT", "100" }, + // { "GPU_USE_SYNC_OBJECTS", "1" }, + // { "GPU_SINGLE_ALLOC_PERCENT", "100" }, + // { "GPU_MAX_HEAP_SIZE", "100" }, + // { "GPU_FORCE_64BIT_PTR", "1" } + // }; + + // foreach (var kvp in envNameValues) { + // string envName = kvp.Key; + // string envValue = kvp.Value; + // // Check if all the variables is set + // if (Environment.GetEnvironmentVariable(envName) == null) + // { + // try { Environment.SetEnvironmentVariable(envName, envValue); } + // catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } + // } + + // // Check to make sure all the values are set correctly + // if (!Environment.GetEnvironmentVariable(envName).Equals(envValue)) + // { + // try { Environment.SetEnvironmentVariable(envName, envValue); } + // catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } + // } + // } + //} private bool VerifyMiningAddress(bool ShowError) { diff --git a/NiceHashMiner/Miners/Miner.cs b/NiceHashMiner/Miners/Miner.cs index 19934b3..5d42949 100644 --- a/NiceHashMiner/Miners/Miner.cs +++ b/NiceHashMiner/Miners/Miner.cs @@ -340,6 +340,14 @@ virtual protected Process BenchmarkStartProcess(string CommandLine) { Helpers.ConsolePrint(MinerTAG(), "Using miner: " + BenchmarkHandle.StartInfo.FileName); BenchmarkHandle.StartInfo.WorkingDirectory = WorkingDirectory; } + // set sys variables + if (MinersSettingsManager.MinerSystemVariables.ContainsKey(Path)) { + foreach (var kvp in MinersSettingsManager.MinerSystemVariables[Path]) { + string envName = kvp.Key; + string envValue = kvp.Value; + BenchmarkHandle.StartInfo.EnvironmentVariables[envName] = envValue; + } + } BenchmarkHandle.StartInfo.Arguments = (string)CommandLine; BenchmarkHandle.StartInfo.UseShellExecute = false; @@ -578,6 +586,13 @@ virtual protected NiceHashProcess _Start() { P.StartInfo.WorkingDirectory = WorkingDirectory; } + if (MinersSettingsManager.MinerSystemVariables.ContainsKey(Path)) { + foreach (var kvp in MinersSettingsManager.MinerSystemVariables[Path]) { + string envName = kvp.Key; + string envValue = kvp.Value; + P.StartInfo.EnvironmentVariables[envName] = envValue; + } + } P.StartInfo.FileName = Path; P.ExitEvent = Miner_Exited; diff --git a/NiceHashMiner/Miners/MinersSettingsManager.cs b/NiceHashMiner/Miners/MinersSettingsManager.cs index 082c086..5bf7136 100644 --- a/NiceHashMiner/Miners/MinersSettingsManager.cs +++ b/NiceHashMiner/Miners/MinersSettingsManager.cs @@ -16,15 +16,23 @@ public MinerReservedPortsFile() } } + // {miner path : {envName : envValue} } + class MinerSystemVariablesFile : ConfigFile>> { + public MinerSystemVariablesFile() : base(FOLDERS.CONFIG, "MinerSystemVariables.json", "MinerSystemVariables_old.json") {} + } + private static Dictionary>>> MinerReservedPorts = new Dictionary>>>(); public static List AllReservedPorts = new List(); + public static Dictionary> MinerSystemVariables = new Dictionary>(); + public static void Init() { ExtraLaunchParameters.InitializePackages(); InitMinerReservedPortsFile(); + InitMinerSystemVariablesFile(); } public static List GetPortsListFor(MinerBaseType minerBaseType, string path, AlgorithmType algorithmType) { @@ -54,7 +62,7 @@ public static void InitMinerReservedPortsFile() { for (MinerBaseType type = (MinerBaseType.NONE + 1); type < MinerBaseType.END; ++type) { if (MinerReservedPorts.ContainsKey(type) == false) { MinerReservedPorts[type] = new Dictionary>>(); - } + } } for (DeviceGroupType devGroupType = (DeviceGroupType.NONE + 1); devGroupType < DeviceGroupType.LAST; ++devGroupType) { var minerAlgosForGroup = GroupAlgorithms.CreateDefaultsForGroup(devGroupType); @@ -93,5 +101,48 @@ public static void InitMinerReservedPortsFile() { } } + public static void InitMinerSystemVariablesFile() { + MinerSystemVariablesFile file = new MinerSystemVariablesFile(); + MinerSystemVariables = new Dictionary>(); + if (file.IsFileExists()) { + var read = file.ReadFile(); + if (read != null) { + MinerSystemVariables = read; + } + } else { + // general AMD defaults scope + { + List minerPaths = new List() { + MinerPaths.Data.sgminer_5_6_0_general, + MinerPaths.Data.sgminer_gm, + MinerPaths.Data.ClaymoreCryptoNightMiner, + MinerPaths.Data.ClaymoreZcashMiner, + MinerPaths.Data.OptiminerZcashMiner + }; + foreach (var minerPath in minerPaths) { + MinerSystemVariables[minerPath] = new Dictionary() { + { "GPU_MAX_ALLOC_PERCENT", "100" }, + { "GPU_USE_SYNC_OBJECTS", "1" }, + { "GPU_SINGLE_ALLOC_PERCENT", "100" }, + { "GPU_MAX_HEAP_SIZE", "100" }, + { "GPU_FORCE_64BIT_PTR", "1" } + }; + } + } + // ClaymoreDual scope + { + MinerSystemVariables[MinerPaths.Data.ClaymoreDual] = new Dictionary() { + { "GPU_MAX_ALLOC_PERCENT", "100" }, + { "GPU_USE_SYNC_OBJECTS", "1" }, + { "GPU_SINGLE_ALLOC_PERCENT", "100" }, + { "GPU_MAX_HEAP_SIZE", "100" }, + { "GPU_FORCE_64BIT_PTR", "0" } + }; + } + } + // save defaults + file.Commit(MinerSystemVariables); + } + } } From e9567f72b476e64a8e6bcff51870a9837502a3f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Wed, 15 Mar 2017 18:16:11 +0100 Subject: [PATCH 335/366] fix, ver bump --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/MinersSettingsManager.cs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 726dfe8..964b898 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -53,7 +53,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_01"; + const string _betaAlphaPostfixString = "-Pre-Release_02"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/MinersSettingsManager.cs b/NiceHashMiner/Miners/MinersSettingsManager.cs index 5bf7136..c02c6d4 100644 --- a/NiceHashMiner/Miners/MinersSettingsManager.cs +++ b/NiceHashMiner/Miners/MinersSettingsManager.cs @@ -104,12 +104,15 @@ public static void InitMinerReservedPortsFile() { public static void InitMinerSystemVariablesFile() { MinerSystemVariablesFile file = new MinerSystemVariablesFile(); MinerSystemVariables = new Dictionary>(); + bool isFileInit = false; if (file.IsFileExists()) { var read = file.ReadFile(); if (read != null) { + isFileInit = true; MinerSystemVariables = read; } - } else { + } + if (!isFileInit) { // general AMD defaults scope { List minerPaths = new List() { @@ -139,9 +142,9 @@ public static void InitMinerSystemVariablesFile() { { "GPU_FORCE_64BIT_PTR", "0" } }; } + // save defaults + file.Commit(MinerSystemVariables); } - // save defaults - file.Commit(MinerSystemVariables); } } From 9ebebe652c37200fdb4b07a5144c5c9858ec9ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 16 Mar 2017 08:39:29 +0100 Subject: [PATCH 336/366] make ClaymoreDual default --- NiceHashMiner/Devices/GroupAlgorithms.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 5d7a75d..2502e48 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -91,9 +91,16 @@ public static Dictionary> CreateForDevice(Compute } } } + if (algoSettings.ContainsKey(MinerBaseType.sgminer)) { + foreach (var algo in algoSettings[MinerBaseType.sgminer]) { + if (algo.NiceHashID == AlgorithmType.DaggerHashimoto) { + algo.Enabled = false; + } + } + } if (algoSettings.ContainsKey(MinerBaseType.ClaymoreAMD)) { foreach (var algo in algoSettings[MinerBaseType.ClaymoreAMD]) { - if (algo.NiceHashID == AlgorithmType.CryptoNight || algo.NiceHashID == AlgorithmType.DaggerHashimoto) { + if (algo.NiceHashID == AlgorithmType.CryptoNight) { algo.Enabled = false; } } From 1fad9946a4dfa4b01a75313f8a3fc3f2435da62d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 16 Mar 2017 09:56:20 +0100 Subject: [PATCH 337/366] add experimental miner base for unstable miners/algorithms --- NiceHashMiner/Devices/GroupAlgorithms.cs | 40 +++++++++++++++++---- NiceHashMiner/Enums/MinerBaseType.cs | 1 + NiceHashMiner/Miners/Grouping/MinerPaths.cs | 12 +++++++ NiceHashMiner/Miners/MinerFactory.cs | 9 +++++ 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 2502e48..0f43d51 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -118,6 +118,12 @@ public static Dictionary> CreateForDevice(Compute unstable_algo.Enabled = false; } } + if (algoSettings.ContainsKey(MinerBaseType.experimental)) { + foreach (var unstable_algo in algoSettings[MinerBaseType.experimental]) { + unstable_algo.Enabled = false; + } + } + } // END algoSettings != null return algoSettings; } @@ -216,6 +222,11 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.excavator, AlgorithmType.Pascal, "pascal") } }, + { MinerBaseType.experimental, + new List() { + new Algorithm(MinerBaseType.experimental, AlgorithmType.NeoScrypt, "neoscrypt") + } + }, }; if (DeviceGroupType.NVIDIA_6_x == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { @@ -223,6 +234,9 @@ public static Dictionary> CreateDefaultsForGroup( AlgorithmType.CryptoNight }); } + if (DeviceGroupType.NVIDIA_6_x != deviceGroupType) { + ToRemoveMinerTypes.Add(MinerBaseType.experimental); + } if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { AlgorithmType.NeoScrypt, @@ -241,7 +255,7 @@ public static Dictionary> CreateDefaultsForGroup( } // filter unused - var finalRet = FilterMinerAlgos(ret, ToRemoveAlgoTypes); + var finalRet = FilterMinerAlgos(ret, ToRemoveAlgoTypes, new List() { MinerBaseType.ccminer }); finalRet = FilterMinerBaseTypes(finalRet, ToRemoveMinerTypes); return finalRet; @@ -260,12 +274,26 @@ static Dictionary> FilterMinerBaseTypes(Dictionar return finalRet; } - static Dictionary> FilterMinerAlgos(Dictionary> minerAlgos, List toRemove) { + static Dictionary> FilterMinerAlgos(Dictionary> minerAlgos, List toRemove, List toRemoveBase = null) { var finalRet = new Dictionary>(); - foreach (var kvp in minerAlgos) { - var algoList = kvp.Value.FindAll((a) => toRemove.IndexOf(a.NiceHashID) == -1); - if (algoList.Count > 0) { - finalRet[kvp.Key] = algoList; + if (toRemoveBase == null) { // all minerbasekeys + foreach (var kvp in minerAlgos) { + var algoList = kvp.Value.FindAll((a) => toRemove.IndexOf(a.NiceHashID) == -1); + if (algoList.Count > 0) { + finalRet[kvp.Key] = algoList; + } + } + } else { + foreach (var kvp in minerAlgos) { + // filter only if base key is defined + if (toRemoveBase.IndexOf(kvp.Key) > -1) { + var algoList = kvp.Value.FindAll((a) => toRemove.IndexOf(a.NiceHashID) == -1); + if (algoList.Count > 0) { + finalRet[kvp.Key] = algoList; + } + } else { // keep all + finalRet[kvp.Key] = kvp.Value; + } } } return finalRet; diff --git a/NiceHashMiner/Enums/MinerBaseType.cs b/NiceHashMiner/Enums/MinerBaseType.cs index e1d3433..c6aca8b 100644 --- a/NiceHashMiner/Enums/MinerBaseType.cs +++ b/NiceHashMiner/Enums/MinerBaseType.cs @@ -20,6 +20,7 @@ public enum MinerBaseType { excavator, XmrStackCPU, ccminer_alexis, + experimental, END } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 04920b9..bb41adb 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -90,6 +90,8 @@ public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoT return Data.XmrStackCPUMiner; case MinerBaseType.ccminer_alexis: return NVIDIA_GROUPS.ccminer_unstable_path(algoType, devGroupType); + case MinerBaseType.experimental: + return EXPERIMENTAL.GetPath(algoType, devGroupType); } return Data.NONE; } @@ -199,5 +201,15 @@ public static string ClaymorePath(AlgorithmType type) { return Data.NONE; // should not happen } } + + // unstable miners, NVIDIA for now + static class EXPERIMENTAL { + public static string GetPath(AlgorithmType algoType, DeviceGroupType devGroupType) { + if (devGroupType == DeviceGroupType.NVIDIA_6_x) { + return NVIDIA_GROUPS.ccminer_path(algoType, devGroupType); + } + return Data.NONE; // should not happen + } + } } } diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs index 17840c3..df19b1d 100644 --- a/NiceHashMiner/Miners/MinerFactory.cs +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -28,6 +28,13 @@ private static Miner CreateClaymore(AlgorithmType algorithmType) { return null; } + private static Miner CreateExperimental(DeviceType deviceType, AlgorithmType algorithmType) { + if (AlgorithmType.NeoScrypt == algorithmType && DeviceType.NVIDIA == deviceType) { + return new ccminer(/*minersConfig*/); + } + return null; + } + public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmType, MinerBaseType minerBaseType /*, /*minersConfig: minersConfig*/) { switch (minerBaseType) { case MinerBaseType.cpuminer: @@ -52,6 +59,8 @@ public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmTy return new XmrStackCPUMiner(); case MinerBaseType.ccminer_alexis: return new ccminer(/*minersConfig*/); + case MinerBaseType.experimental: + return CreateExperimental(deviceType, algorithmType); } return null; } From 8c0fb6d13c9ce653c8bd349d8958cf83138ab886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 16 Mar 2017 09:57:43 +0100 Subject: [PATCH 338/366] remove unused, not setting Env vars globaly only per process --- NiceHashMiner/Forms/Form_Main.cs | 34 -------------------------------- 1 file changed, 34 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 964b898..176fc88 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -289,8 +289,6 @@ private void StartupTimer_Tick(object sender, EventArgs e) { LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetEnvironmentVariable")); - //SetEnvironmentVariables(); - LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetWindowsErrorReporting")); Helpers.DisableWindowsErrorReporting(ConfigManager.GeneralConfig.DisableWindowsErrorReporting); @@ -636,38 +634,6 @@ void UpdateCheck_Tick(object sender, EventArgs e) } } - - //void SetEnvironmentVariables() - //{ - // Helpers.ConsolePrint("NICEHASH", "Setting environment variables"); - - // Dictionary envNameValues = new Dictionary() { - // { "GPU_MAX_ALLOC_PERCENT", "100" }, - // { "GPU_USE_SYNC_OBJECTS", "1" }, - // { "GPU_SINGLE_ALLOC_PERCENT", "100" }, - // { "GPU_MAX_HEAP_SIZE", "100" }, - // { "GPU_FORCE_64BIT_PTR", "1" } - // }; - - // foreach (var kvp in envNameValues) { - // string envName = kvp.Key; - // string envValue = kvp.Value; - // // Check if all the variables is set - // if (Environment.GetEnvironmentVariable(envName) == null) - // { - // try { Environment.SetEnvironmentVariable(envName, envValue); } - // catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } - // } - - // // Check to make sure all the values are set correctly - // if (!Environment.GetEnvironmentVariable(envName).Equals(envValue)) - // { - // try { Environment.SetEnvironmentVariable(envName, envValue); } - // catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } - // } - // } - //} - private bool VerifyMiningAddress(bool ShowError) { if (!BitcoinAddress.ValidateBitcoinAddress(textBoxBTCAddress.Text.Trim()) && ShowError) From 52406fe513a14a5ef7999caac0c4ab1950eeb67f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 16 Mar 2017 10:19:08 +0100 Subject: [PATCH 339/366] dispose unused reference (fixes downoaded zip deletes) --- NiceHashMiner/Utils/MinersDownloadManager.cs | 4 +++- NiceHashMiner/Utils/MinersDownloader.cs | 11 ++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index bf13c72..fc5d196 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -39,7 +39,9 @@ private static void DeleteAfter(DownloadSetup dlSetup) { if (File.Exists(dlSetup.BinsZipLocation)) { File.Delete(dlSetup.BinsZipLocation); } - } catch { } + } catch(Exception e) { + Helpers.ConsolePrint("MinersDownloadManager.DeleteAfter", "Cannot delete exception: " + e.Message); + } } public static void DeleteStandardDlSetup() { diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs index 848030d..de256ae 100644 --- a/NiceHashMiner/Utils/MinersDownloader.cs +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -21,6 +21,7 @@ public class MinersDownloader { private WebClient _webClient; private Stopwatch _stopwatch; + Thread _UnzipThread = null; bool isDownloadSizeInit = false; @@ -124,8 +125,8 @@ private void DownloadCompleted(object sender, AsyncCompletedEventArgs e) { private void UnzipStart() { _minerUpdateIndicator.SetTitle(International.GetText("MinersDownloadManager_Title_Settup")); - Thread BenchmarkThread = new Thread(UnzipThreadRoutine); - BenchmarkThread.Start(); + _UnzipThread = new Thread(UnzipThreadRoutine); + _UnzipThread.Start(); } private void UnzipThreadRoutine() { @@ -150,6 +151,8 @@ private void UnzipThreadRoutine() { _minerUpdateIndicator.SetProgressValueAndMsg((int)prog, String.Format(International.GetText("MinersDownloadManager_Title_Settup_Unzipping"), prog.ToString("F2"))); } } + archive.Dispose(); + archive = null; // after unzip stuff _minerUpdateIndicator.FinishMsg(true); // remove bins zip @@ -157,7 +160,9 @@ private void UnzipThreadRoutine() { if (File.Exists(_downloadSetup.BinsZipLocation)) { File.Delete(_downloadSetup.BinsZipLocation); } - } catch { } + } catch (Exception e) { + Helpers.ConsolePrint("MinersDownloader.UnzipThreadRoutine", "Cannot delete exception: " + e.Message); + } } else { Helpers.ConsolePrint(TAG, String.Format("UnzipThreadRoutine {0} file not found", _downloadSetup.BinsZipLocation)); } From 2d8d08f8c01174543f3c176888df52afaca8c606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 16 Mar 2017 10:50:55 +0100 Subject: [PATCH 340/366] pre-rel ver bump --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 176fc88..ef0f4bc 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -53,7 +53,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_02"; + const string _betaAlphaPostfixString = "-Pre-Release_03"; private bool _isDeviceDetectionInitialized = false; From 7d8ef508c0bdc8bda3be5592b6d7478eddcd1d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 16 Mar 2017 12:04:45 +0100 Subject: [PATCH 341/366] remove pre-release postfix --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index ef0f4bc..b3c04c3 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -53,7 +53,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_03"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; From 92a3893519da5d3a2d24498e6d24a885daee2064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 16 Mar 2017 12:22:05 +0100 Subject: [PATCH 342/366] version bump --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 147f5d0..a0818fc 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.4")] -[assembly: AssemblyFileVersion("1.7.5.4")] +[assembly: AssemblyVersion("1.7.5.5")] +[assembly: AssemblyFileVersion("1.7.5.5")] From b1c673e29115a57e1b018a744214438393925a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 17 Mar 2017 14:12:31 +0100 Subject: [PATCH 343/366] remove eqm, use new excavator instead, cleanup --- NiceHashMiner/Devices/CPUUtils.cs | 34 +++++------ NiceHashMiner/Devices/ComputeDevice.cs | 13 ----- NiceHashMiner/Devices/GroupAlgorithms.cs | 41 +++++++------ NiceHashMiner/Forms/Form_Main.cs | 19 +----- .../Miners/Grouping/GroupingLogic.cs | 57 ++---------------- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 10 ---- NiceHashMiner/Miners/MinerFactory.cs | 28 ++++----- NiceHashMiner/Miners/MinersManager.cs | 6 -- NiceHashMiner/Miners/MiningSession.cs | 58 ------------------- .../Miners/{ => Obsolete}/cpuminer.cs | 0 .../Miners/{Equihash => Obsolete}/eqm.cs | 0 .../Miners/Parsing/ExtraLaunchParameters.cs | 38 ++++++------ .../Parsing/ExtraLaunchParametersParser.cs | 6 +- NiceHashMiner/Miners/excavator.cs | 33 +++++++++-- NiceHashMiner/NiceHashMiner.csproj | 4 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- NiceHashMiner/Utils/BINS_CODEGEN.cs | 4 -- NiceHashMiner/Utils/MinersDownloadManager.cs | 30 +--------- NiceHashMiner/Utils/MinersDownloader.cs | 9 --- 19 files changed, 113 insertions(+), 281 deletions(-) rename NiceHashMiner/Miners/{ => Obsolete}/cpuminer.cs (100%) rename NiceHashMiner/Miners/{Equihash => Obsolete}/eqm.cs (100%) diff --git a/NiceHashMiner/Devices/CPUUtils.cs b/NiceHashMiner/Devices/CPUUtils.cs index 0d4ae17..e0b8924 100644 --- a/NiceHashMiner/Devices/CPUUtils.cs +++ b/NiceHashMiner/Devices/CPUUtils.cs @@ -36,23 +36,23 @@ private static bool HasExtensionSupport(CPUExtensionType type) { return false; } - /// - /// Returns most performant CPU extension based on settings. - /// Returns automatic if NO extension is avaliable - /// - /// - public static CPUExtensionType GetMostOptimized() { - if (ConfigManager.GeneralConfig.ForceCPUExtension == CPUExtensionType.Automatic) { - for (int i = 0; i < _detectOrder.Length; ++i) { - if (HasExtensionSupport(_detectOrder[i])) { - return _detectOrder[i]; - } - } - } else if (HasExtensionSupport(ConfigManager.GeneralConfig.ForceCPUExtension)) { - return ConfigManager.GeneralConfig.ForceCPUExtension; - } - return CPUExtensionType.Automatic; - } + ///// + ///// Returns most performant CPU extension based on settings. + ///// Returns automatic if NO extension is avaliable + ///// + ///// + //public static CPUExtensionType GetMostOptimized() { + // if (ConfigManager.GeneralConfig.ForceCPUExtension == CPUExtensionType.Automatic) { + // for (int i = 0; i < _detectOrder.Length; ++i) { + // if (HasExtensionSupport(_detectOrder[i])) { + // return _detectOrder[i]; + // } + // } + // } else if (HasExtensionSupport(ConfigManager.GeneralConfig.ForceCPUExtension)) { + // return ConfigManager.GeneralConfig.ForceCPUExtension; + // } + // return CPUExtensionType.Automatic; + //} /// /// Checks if CPU mining is capable, CPU must have AES support diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index 4c84350..a6f0c8f 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -36,8 +36,6 @@ public class ComputeDevice public readonly bool IsEtherumCapale; public static readonly ulong MEMORY_3GB = 3221225472; - //CudaDevice _cudaDevice = null; - //AmdGpuDevice _amdDevice = null; // sgminer extra quickfix //public readonly bool IsOptimizedVersion; public readonly string Codename; @@ -45,8 +43,6 @@ public class ComputeDevice // amd has some algos not working with new drivers public readonly bool DriverDisableAlgos; - //public DeviceBenchmarkConfig_rem DeviceBenchmarkConfig { get; private set; } - //public Dictionary AlgorithmSettings { get; set; } private List AlgorithmSettings; public string BenchmarkCopyUUID { get; set; } @@ -211,13 +207,6 @@ public List GetAlgorithmSettings() { var retAlgos = MinerPaths.GetAndInitAlgorithmsMinerPaths(algos, this);; - // additional filters - // CPU - if (this.DeviceType == DeviceType.CPU && MinersManager.EquihashCPU_USE_eqm()) { - retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.nheqminer); - } else if (this.DeviceType == DeviceType.CPU) { - retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.eqm); - } // NVIDIA if (this.DeviceGroupType == DeviceGroupType.NVIDIA_5_x || this.DeviceGroupType == DeviceGroupType.NVIDIA_6_x) { retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.nheqminer); @@ -225,8 +214,6 @@ public List GetAlgorithmSettings() { retAlgos = retAlgos.FindAll((a) => a.MinerBaseType != MinerBaseType.eqm); } - // sort by miner and algo - //retAlgos.Sort((a_1, a_2) => (a_1.MinerBaseType - a_2.MinerBaseType) != 0 ? (a_1.MinerBaseType - a_2.MinerBaseType) : (a_1.NiceHashID - a_2.NiceHashID)); // sort by algo retAlgos.Sort((a_1, a_2) => (a_1.NiceHashID - a_2.NiceHashID) != 0 ? (a_1.NiceHashID - a_2.NiceHashID) : (a_1.MinerBaseType - a_2.MinerBaseType)); diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 0f43d51..88b58ad 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -11,7 +11,6 @@ namespace NiceHashMiner.Devices { /// public static class GroupAlgorithms { - public static Dictionary> CreateForDevice(ComputeDevice device) { if (device != null) { var algoSettings = CreateDefaultsForGroup(device.DeviceGroupType); @@ -212,13 +211,9 @@ public static Dictionary> CreateDefaultsForGroup( new Algorithm(MinerBaseType.nheqminer, AlgorithmType.Equihash, "equihash") } }, - { MinerBaseType.eqm, - new List() { - new Algorithm(MinerBaseType.eqm, AlgorithmType.Equihash, "equihash") - } - }, { MinerBaseType.excavator, new List() { + new Algorithm(MinerBaseType.excavator, AlgorithmType.Equihash, "equihash"), new Algorithm(MinerBaseType.excavator, AlgorithmType.Pascal, "pascal") } }, @@ -237,13 +232,21 @@ public static Dictionary> CreateDefaultsForGroup( if (DeviceGroupType.NVIDIA_6_x != deviceGroupType) { ToRemoveMinerTypes.Add(MinerBaseType.experimental); } + if (DeviceGroupType.NVIDIA_6_x == deviceGroupType || DeviceGroupType.NVIDIA_5_x == deviceGroupType) { + ToRemoveMinerTypes.AddRange(new MinerBaseType[] { + MinerBaseType.nheqminer + }); + } if(DeviceGroupType.NVIDIA_2_1 == deviceGroupType || DeviceGroupType.NVIDIA_3_x == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { AlgorithmType.NeoScrypt, AlgorithmType.Lyra2RE, AlgorithmType.Lyra2REv2 }); - ToRemoveMinerTypes.Add(MinerBaseType.eqm); + ToRemoveMinerTypes.AddRange(new MinerBaseType[] { + MinerBaseType.eqm, + MinerBaseType.excavator + }); } if (DeviceGroupType.NVIDIA_2_1 == deviceGroupType) { ToRemoveAlgoTypes.AddRange(new AlgorithmType[] { @@ -299,17 +302,17 @@ static Dictionary> FilterMinerAlgos(Dictionary GetKeysForMinerAlgosGroup(Dictionary> minerAlgos) { - List ret = new List(); - foreach (var kvp in minerAlgos) { - var currentKeys = kvp.Value.ConvertAll((a) => a.NiceHashID); - foreach (var key in currentKeys) { - if (ret.Contains(key) == false) { - ret.Add(key); - } - } - } - return ret; - } + //static List GetKeysForMinerAlgosGroup(Dictionary> minerAlgos) { + // List ret = new List(); + // foreach (var kvp in minerAlgos) { + // var currentKeys = kvp.Value.ConvertAll((a) => a.NiceHashID); + // foreach (var key in currentKeys) { + // if (ret.Contains(key) == false) { + // ret.Add(key); + // } + // } + // } + // return ret; + //} } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index b3c04c3..fa6c899 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -40,8 +40,6 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, private Timer StartupTimer; private Timer IdleCheck; - private Timer DeleteDl; - private bool ShowWarningNiceHashData; private bool DemoMode; @@ -52,13 +50,12 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - - const string _betaAlphaPostfixString = ""; + + const string _betaAlphaPostfixString = "-Pre-Release_01"; private bool _isDeviceDetectionInitialized = false; private bool IsManuallyStarted = false; - private bool IsMining = false; int MainFormHeight = 0; int EmtpyGroupPanelHeight = 0; @@ -402,18 +399,6 @@ private void StartupTimer_Tick(object sender, EventArgs e) { } } } - // cleanup - DeleteDl = new Timer(); - DeleteDl.Tick += DeletSingleShot_Tick; - DeleteDl.Interval = 10 * 1000; - DeleteDl.Start(); - } - - private void DeletSingleShot_Tick(object sender, EventArgs e) { - DeleteDl.Stop(); - DeleteDl = null; - MinersDownloadManager.DeleteStandardDlSetup(); - MinersDownloadManager.DeleteThirdPartyDlSetup(); } private void SetChildFormCenter(Form form) { diff --git a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs index fa8c9c6..e74e9d9 100644 --- a/NiceHashMiner/Miners/Grouping/GroupingLogic.cs +++ b/NiceHashMiner/Miners/Grouping/GroupingLogic.cs @@ -10,62 +10,12 @@ public static class GroupingLogic { public static bool ShouldGroup(MiningPair a, MiningPair b) { bool canGroup = IsGroupableMinerBaseType(a) && IsGroupableMinerBaseType(b); // group if same bin path and same algo type - if (canGroup && IsSameBinPath(a, b) && IsSameAlgorithmType(a, b)) { - AlgorithmType algorithmType = a.Algorithm.NiceHashID; - // AlgorithmType.Equihash is special case - if (AlgorithmType.Equihash == algorithmType) { - return EquihashGroup.IsEquihashGroupLogic(a.Algorithm.MinerBaseType, - a, b); - } - // all other algorithms are grouped if DeviceType is same and is not CPU - else if (IsNotCpuGroups(a, b) && IsSameDeviceType(a, b)) { - return true; - } + if (canGroup && IsSameBinPath(a, b) && IsSameAlgorithmType(a, b) && IsNotCpuGroups(a, b) && IsSameDeviceType(a, b)) { + return true; } return false; } - private static class EquihashGroup { - public static bool IsEquihashGroupLogic(MinerBaseType minerBase, MiningPair a, MiningPair b) { - // eqm - if (MinerBaseType.eqm == minerBase) { - return Is_eqm(a, b); - } - // nheqmnier - else if (MinerBaseType.nheqminer == minerBase) { - return Is_nheqminer(a, b); - } else if (MinerBaseType.ClaymoreAMD == minerBase || MinerBaseType.OptiminerAMD == minerBase) { - return true; - } - return false; - } - - // nheqminer - private static bool Is_nheqminer(MiningPair a, MiningPair b) { - return IsDevice_nheqminer(a) && IsDevice_nheqminer(b); - } - // group only first CPU split - private static bool IsDevice_nheqminer(MiningPair a) { - return a.Device.DeviceType != DeviceType.CPU // if not cpu then ignore case always good - || a.Device.ID == 0; // if CPU ID must be 0 - } - - // eqm - private static bool Is_eqm(MiningPair a, MiningPair b) { - return IsDevice_eqm(a) && IsDevice_eqm(b); - } - private static bool IsDevice_eqm(MiningPair a) { - return IsCPU_eqm(a) || IsNVIDIA_eqm(a); - } - private static bool IsCPU_eqm(MiningPair a) { - return a.Device.DeviceType == DeviceType.CPU; - } - private static bool IsNVIDIA_eqm(MiningPair a) { - var groupType = a.Device.DeviceGroupType; - return DeviceGroupType.NVIDIA_5_x == groupType || DeviceGroupType.NVIDIA_6_x == groupType; - } - } - private static bool IsNotCpuGroups(MiningPair a, MiningPair b) { return a.Device.DeviceType != DeviceType.CPU && b.Device.DeviceType != DeviceType.CPU; } @@ -80,7 +30,8 @@ private static bool IsSameDeviceType(MiningPair a, MiningPair b) { return a.Device.DeviceType == b.Device.DeviceType; } private static bool IsGroupableMinerBaseType(MiningPair a) { - return a.Algorithm.MinerBaseType != MinerBaseType.cpuminer; + return a.Algorithm.MinerBaseType != MinerBaseType.cpuminer + && a.Algorithm.MinerBaseType != MinerBaseType.XmrStackCPU; } } } diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index bb41adb..7614ba0 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -38,15 +38,7 @@ public static class Data { public const string sgminer_5_6_0_general = _bin + @"\sgminer-5-6-0-general\sgminer.exe"; public const string sgminer_gm = _bin + @"\sgminer-gm\sgminer.exe"; - /// - /// nheqminer - /// public const string nheqminer = _bin + @"\nheqminer_v0.4b\nheqminer.exe"; - - /// - /// eqm - /// - public const string eqm = _bin + @"\eqm\eqm.exe"; public const string excavator = _bin + @"\excavator\excavator.exe"; public const string XmrStackCPUMiner = _bin + @"\xmr-stak-cpu\xmr-stak-cpu.exe"; @@ -76,8 +68,6 @@ public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoT return AMD_GROUP.sgminer_path(algoType); case MinerBaseType.nheqminer: return Data.nheqminer; - case MinerBaseType.eqm: - return Data.eqm; case MinerBaseType.ethminer: return Data.ethminer; case MinerBaseType.ClaymoreAMD: diff --git a/NiceHashMiner/Miners/MinerFactory.cs b/NiceHashMiner/Miners/MinerFactory.cs index df19b1d..6d385ff 100644 --- a/NiceHashMiner/Miners/MinerFactory.cs +++ b/NiceHashMiner/Miners/MinerFactory.cs @@ -10,55 +10,51 @@ public class MinerFactory { private static Miner CreateEthminer(DeviceType deviceType) { if (DeviceType.AMD == deviceType) { - return new MinerEtherumOCL(/*minersConfig*/); + return new MinerEtherumOCL(); } else if(DeviceType.NVIDIA == deviceType) { - return new MinerEtherumCUDA(/*minersConfig*/); + return new MinerEtherumCUDA(); } return null; } private static Miner CreateClaymore(AlgorithmType algorithmType) { if (AlgorithmType.Equihash == algorithmType) { - return new ClaymoreZcashMiner(/*minersConfig*/); + return new ClaymoreZcashMiner(); } else if (AlgorithmType.CryptoNight == algorithmType) { - return new ClaymoreCryptoNightMiner(/*minersConfig*/); + return new ClaymoreCryptoNightMiner(); } else if (AlgorithmType.DaggerHashimoto == algorithmType) { - return new ClaymoreDual(/*minersConfig*/); + return new ClaymoreDual(); } return null; } private static Miner CreateExperimental(DeviceType deviceType, AlgorithmType algorithmType) { if (AlgorithmType.NeoScrypt == algorithmType && DeviceType.NVIDIA == deviceType) { - return new ccminer(/*minersConfig*/); + return new ccminer(); } return null; } - public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmType, MinerBaseType minerBaseType /*, /*minersConfig: minersConfig*/) { + public static Miner CreateMiner(DeviceType deviceType, AlgorithmType algorithmType, MinerBaseType minerBaseType) { switch (minerBaseType) { - case MinerBaseType.cpuminer: - return new cpuminer(/*minersConfig*/); case MinerBaseType.ccminer: - return new ccminer(/*minersConfig*/); + return new ccminer(); case MinerBaseType.sgminer: - return new sgminer(/*minersConfig*/); + return new sgminer(); case MinerBaseType.nheqminer: - return new nheqminer(/*minersConfig*/); - case MinerBaseType.eqm: - return new eqm(/*minersConfig*/); + return new nheqminer(); case MinerBaseType.ethminer: return CreateEthminer(deviceType); case MinerBaseType.ClaymoreAMD: return CreateClaymore(algorithmType); case MinerBaseType.OptiminerAMD: - return new OptiminerZcashMiner(/*minersConfig*/); + return new OptiminerZcashMiner(); case MinerBaseType.excavator: return new excavator(); case MinerBaseType.XmrStackCPU: return new XmrStackCPUMiner(); case MinerBaseType.ccminer_alexis: - return new ccminer(/*minersConfig*/); + return new ccminer(); case MinerBaseType.experimental: return CreateExperimental(deviceType, algorithmType); } diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index ddf7865..9b5a862 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -31,12 +31,6 @@ public static string GetActiveMinersGroup() { return "IDLE"; } - public static bool EquihashCPU_USE_eqm() { - var mostOptimized = CPUUtils.GetMostOptimized(); - return mostOptimized == CPUExtensionType.AVX || mostOptimized == CPUExtensionType.AVX2 - || mostOptimized == CPUExtensionType.AVX_AES || mostOptimized == CPUExtensionType.AVX2_AES; - } - public static double GetTotalRate() { if (CurMiningSession != null) return CurMiningSession.GetTotalRate(); return 0; diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 6b66f57..e1c6d5f 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -44,8 +44,6 @@ public class MiningSession { private Timer _preventSleepTimer; // check internet connection private Timer _internetCheckTimer; - //// check local and web stats per algo - //private Timer _checkWorkerStats; public bool IsMiningEnabled { @@ -88,11 +86,6 @@ public MiningSession(List devices, _internetCheckTimer.Elapsed += InternetCheckTimer_Tick; _internetCheckTimer.Interval = 1 * 1000 * 60; // every minute - //// check worker stats - //_checkWorkerStats = new Timer(); - //_checkWorkerStats.Elapsed += _checkWorkerStats_Elapsed; - //_checkWorkerStats.Interval = 2 * 1000 * 60; // every 2 minutes check, miners have to mine 5 minutes to take into account - // assume profitable IsProfitable = true; // assume we have internet @@ -101,33 +94,11 @@ public MiningSession(List devices, if (IsMiningEnabled) { _preventSleepTimer.Start(); _internetCheckTimer.Start(); - //_checkWorkerStats.Start(); } IsMiningRegardlesOfProfit = ConfigManager.GeneralConfig.MinimumProfit == 0; } - //// TODO this feature is needs more feedback - //void _checkWorkerStats_Elapsed(object sender, ElapsedEventArgs e) { - // AlgorithmType type = AlgorithmType.NONE; - // bool showWarning = false; - // foreach (var groupMiner in _runningGroupMiners.Values) { - // if (groupMiner.Miner.ShouldCheckMinerStats()) { - // groupMiner.Miner.ResetCheckTime(); - // var res = NiceHashStats.GetWorkerAlgorithmAcceptedSpeeds(_btcAdress, groupMiner.AlgorithmType, _worker); - // if (res != null && res.accepted == 0 && _mainFormRatesComunication != null) { - // type = groupMiner.AlgorithmType; - // showWarning = groupMiner.Miner.IsCheckShowWarning(); - // } else { - // groupMiner.Miner.ResetCheckStateCount(); - // } - // } - // } - // if (showWarning) { - // _mainFormRatesComunication.RaiseAlertSharesNotAccepted(AlgorithmNiceHashNames.GetName(type)); - // } - //} - #region Timers stuff private void InternetCheckTimer_Tick(object sender, EventArgs e) { if (ConfigManager.GeneralConfig.IdleWhenNoInternetAccess) { @@ -165,25 +136,7 @@ public void StopAllMiners() { // restroe/enable sleep _preventSleepTimer.Stop(); _internetCheckTimer.Stop(); - //_checkWorkerStats.Stop(); Helpers.AllowMonitorPowerdownAndSleep(); - - // delete generated bin files - // check for bins files - var dirInfo = new DirectoryInfo(MinerPaths.Data.nheqminer.Replace("nheqminer.exe", "")); - var DONT_DELETE = "equiw200k9.bin"; - var deleteContains = "equiw200k9"; - var alwaysDeleteContains2 = "silentarmy_gpu"; - if (dirInfo != null && dirInfo.Exists) { - foreach (FileInfo file in dirInfo.GetFiles()) { - if (file.Name != DONT_DELETE && file.Name.Contains(deleteContains)) { - file.Delete(); - } - if (file.Name.Contains(alwaysDeleteContains2)) { - file.Delete(); - } - } - } } public void StopAllMinersNonProfitable() { @@ -476,17 +429,6 @@ public void MinerStatsCheck(Dictionary NiceHashData) // Update GUI _mainFormRatesComunication.AddRateInfo(m.MinerTAG(), groupMiners.DevicesInfoString, AD, groupMiners.CurrentRate, m.IsAPIReadException); } - //// check if profitabile - //if (CheckStatus && !IsMiningRegardlesOfProfit) { - // CheckStatus = false; - // if (IsProfitable) { - // // check current profit - // CheckIfShouldMine(CurrentProfit, true); - // } else if (!IsProfitable) { - // // recalculate and switch - // SwichMostProfitableGroupUpMethod(NiceHashData, true); - // } - //} } } diff --git a/NiceHashMiner/Miners/cpuminer.cs b/NiceHashMiner/Miners/Obsolete/cpuminer.cs similarity index 100% rename from NiceHashMiner/Miners/cpuminer.cs rename to NiceHashMiner/Miners/Obsolete/cpuminer.cs diff --git a/NiceHashMiner/Miners/Equihash/eqm.cs b/NiceHashMiner/Miners/Obsolete/eqm.cs similarity index 100% rename from NiceHashMiner/Miners/Equihash/eqm.cs rename to NiceHashMiner/Miners/Obsolete/eqm.cs diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 770bdb0..9c0d5ea 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -97,21 +97,21 @@ public static class ExtraLaunchParameters { }, new List() ), - new MinerOptionPackage( - MinerType.nheqminer_AMD, - new List() { - new MinerOption("Solver_Version", "-ov", "-ov", "0", MinerOptionFlagType.SingleParam, " "), // default none - new MinerOption("Solver_Dev_Thread", "-ot", "-ot", "1", MinerOptionFlagType.MultiParam, " "), // default none - }, - new List() - ), - new MinerOptionPackage( - MinerType.eqm_CPU, - new List() { - new MinerOption("Threads", "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " ") // default none - }, - new List() - ), + //new MinerOptionPackage( + // MinerType.nheqminer_AMD, + // new List() { + // new MinerOption("Solver_Version", "-ov", "-ov", "0", MinerOptionFlagType.SingleParam, " "), // default none + // new MinerOption("Solver_Dev_Thread", "-ot", "-ot", "1", MinerOptionFlagType.MultiParam, " "), // default none + // }, + // new List() + //), + //new MinerOptionPackage( + // MinerType.eqm_CPU, + // new List() { + // new MinerOption("Threads", "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " ") // default none + // }, + // new List() + //), new MinerOptionPackage( MinerType.eqm_CUDA, new List() { @@ -187,8 +187,12 @@ public static class ExtraLaunchParameters { new MinerOptionPackage( MinerType.excavator, new List() { - new MinerOption("number_of_blocks", "-cb", "-cb", "0", MinerOptionFlagType.MultiParam, " "), // default 0 - new MinerOption("tpb", "-ct", "-ct", "0", MinerOptionFlagType.MultiParam, " "), // default 0 + // parameters differ according to algorithm + new MinerOption("parameter1", "-c1", "-c1", "", MinerOptionFlagType.MultiParam, " "), + new MinerOption("parameter2", "-c2", "-c2", "", MinerOptionFlagType.MultiParam, " "), + // Overclocking not supported from NHM + //new MinerOption("Overclocking_os", "-os", "-os", "", MinerOptionFlagType.MultiParam, " "), + //new MinerOption("Overclocking_od", "-od", "-od", "2", MinerOptionFlagType.MultiParam, " "), }, new List() ), diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index f2af9b6..2dd132c 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -211,9 +211,9 @@ public static string ParseForMiningPair(MiningPair miningPair, AlgorithmType alg } private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType minerBaseType, AlgorithmType algorithmType) { - if (MinerBaseType.cpuminer == minerBaseType) { - return MinerType.cpuminer_opt; - } + //if (MinerBaseType.cpuminer == minerBaseType) { + // return MinerType.cpuminer_opt; + //} if (MinerBaseType.OptiminerAMD == minerBaseType) { return MinerType.OptiminerZcash; } diff --git a/NiceHashMiner/Miners/excavator.cs b/NiceHashMiner/Miners/excavator.cs index 683038e..950e2b4 100644 --- a/NiceHashMiner/Miners/excavator.cs +++ b/NiceHashMiner/Miners/excavator.cs @@ -46,12 +46,26 @@ public override void Start(string url, string btcAdress, string worker) { protected override string GetDevicesCommandString() { string deviceStringCommand = " -cd "; - - foreach (var nvidia_pair in this.MiningSetup.MiningPairs) { - deviceStringCommand += nvidia_pair.Device.ID + " "; + if(this.MiningSetup.CurrentAlgorithmType == AlgorithmType.Equihash) { + foreach (var nvidia_pair in this.MiningSetup.MiningPairs) { + if (nvidia_pair.CurrentExtraLaunchParameters.Contains("-ct")) { + for (int i = 0; i < ExtraLaunchParametersParser.GetEqmCudaThreadCount(nvidia_pair); ++i) { + deviceStringCommand += nvidia_pair.Device.ID + " "; + } + } else { // use default 2 best performance + for (int i = 0; i < 2; ++i) { + deviceStringCommand += nvidia_pair.Device.ID + " "; + } + } + } + } else { + foreach (var nvidia_pair in this.MiningSetup.MiningPairs) { + deviceStringCommand += nvidia_pair.Device.ID + " "; + } } - //// no extra launch params - //deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(NVIDIA_Setup, DeviceType.NVIDIA); + + // no extra launch params + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(this.MiningSetup, DeviceType.NVIDIA); return deviceStringCommand; } @@ -59,7 +73,7 @@ protected override string GetDevicesCommandString() { // benchmark stuff protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int time) { - string ret = "-b " + time + " " + GetDevicesCommandString(); + string ret = " -a " + this.MiningSetup.MinerName + " -b " + time + " " + GetDevicesCommandString(); return ret; } @@ -82,6 +96,13 @@ protected override bool BenchmarkParseLine(string outdata) { else if (postfixStr.Contains("GH/s")) spd *= 1000000000; + // wrong benchmark workaround over 3gh/s is considered false + if (this.MiningSetup.CurrentAlgorithmType == AlgorithmType.Pascal + && spd > 3.0d * 1000000000.0d + ) { + return false; + } + BenchmarkAlgorithm.BenchmarkSpeed = spd; return true; } diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index cdeee97..547ddf8 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -199,7 +199,7 @@ - + @@ -242,7 +242,7 @@ - + Form diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index a0818fc..93f923a 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.5")] -[assembly: AssemblyFileVersion("1.7.5.5")] +[assembly: AssemblyVersion("1.7.5.6")] +[assembly: AssemblyFileVersion("1.7.5.6")] diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index 4ff9f24..3ab90b7 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -30,10 +30,6 @@ public static class Bins_Data { @"\OpenCL.dll", @"\vc_redist.x64.exe", @"\zlib1.dll", -@"\eqm\cudart64_80.dll", -@"\eqm\eqm.exe", -@"\eqm\msvcp120.dll", -@"\eqm\msvcr120.dll", @"\excavator\cudart64_80.dll", @"\excavator\excavator.exe", @"\nheqminer_v0.4b\cpu_tromp_AVX.dll", diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index fc5d196..9c54d16 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_2.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_6.zip", "bins.zip", "bin"); @@ -23,33 +23,5 @@ public static class MinersDownloadManager { "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_5_4.zip", "bins_3rdparty.zip", "bin_3rdparty"); - - // #1 check if miners exits - public static bool IsMinerBinFolder() { - return Directory.Exists(StandardDlSetup.ZipedFolderName); - } - - static bool IsMinerBinZip() { - return File.Exists(StandardDlSetup.BinsZipLocation); - } - - // delete - private static void DeleteAfter(DownloadSetup dlSetup) { - try { - if (File.Exists(dlSetup.BinsZipLocation)) { - File.Delete(dlSetup.BinsZipLocation); - } - } catch(Exception e) { - Helpers.ConsolePrint("MinersDownloadManager.DeleteAfter", "Cannot delete exception: " + e.Message); - } - } - - public static void DeleteStandardDlSetup() { - DeleteAfter(StandardDlSetup); - } - public static void DeleteThirdPartyDlSetup() { - DeleteAfter(ThirdPartyDlSetup); - } - } } diff --git a/NiceHashMiner/Utils/MinersDownloader.cs b/NiceHashMiner/Utils/MinersDownloader.cs index de256ae..e0d9859 100644 --- a/NiceHashMiner/Utils/MinersDownloader.cs +++ b/NiceHashMiner/Utils/MinersDownloader.cs @@ -46,15 +46,6 @@ public void Start(IMinerUpdateIndicator minerUpdateIndicator) { Downlaod(); } - //// #1 check if miners exits - //public bool IsMinerBinFolder() { - // return Directory.Exists("bin"); - //} - - //bool IsMinerBinZip() { - // return File.Exists(_downloadSetup.BinsZipLocation); - //} - // #2 download the file private void Downlaod() { _minerUpdateIndicator.SetTitle(International.GetText("MinersDownloadManager_Title_Downloading")); From 4a87d96df2632afa3885ffe9b476a5377255f50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 19 Mar 2017 14:39:40 +0100 Subject: [PATCH 344/366] Set Default env vars for running user alongside process env vars --- NiceHashMiner/Forms/Form_Main.cs | 1 + NiceHashMiner/Utils/Helpers.cs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index fa6c899..67a04b5 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -285,6 +285,7 @@ private void StartupTimer_Tick(object sender, EventArgs e) { BalanceCheck_Tick(null, null); LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetEnvironmentVariable")); + Helpers.SetDefaultEnvironmentVariables(); LoadingScreen.IncreaseLoadCounterAndMessage(International.GetText("Form_Main_loadtext_SetWindowsErrorReporting")); diff --git a/NiceHashMiner/Utils/Helpers.cs b/NiceHashMiner/Utils/Helpers.cs index f49aa64..7bfdcd9 100644 --- a/NiceHashMiner/Utils/Helpers.cs +++ b/NiceHashMiner/Utils/Helpers.cs @@ -238,5 +238,36 @@ public static void InstallVcRedist() { CudaDevicesDetection.Start(); } + public static void SetDefaultEnvironmentVariables() + { + Helpers.ConsolePrint("NICEHASH", "Setting environment variables"); + + Dictionary envNameValues = new Dictionary() { + { "GPU_MAX_ALLOC_PERCENT", "100" }, + { "GPU_USE_SYNC_OBJECTS", "1" }, + { "GPU_SINGLE_ALLOC_PERCENT", "100" }, + { "GPU_MAX_HEAP_SIZE", "100" }, + { "GPU_FORCE_64BIT_PTR", "1" } + }; + + foreach (var kvp in envNameValues) { + string envName = kvp.Key; + string envValue = kvp.Value; + // Check if all the variables is set + if (Environment.GetEnvironmentVariable(envName) == null) + { + try { Environment.SetEnvironmentVariable(envName, envValue); } + catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } + } + + // Check to make sure all the values are set correctly + if (!Environment.GetEnvironmentVariable(envName).Equals(envValue)) + { + try { Environment.SetEnvironmentVariable(envName, envValue); } + catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } + } + } + } + } } From 2590bc9207baea8782163df7c619931598fd529f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Sun, 19 Mar 2017 14:40:53 +0100 Subject: [PATCH 345/366] minor postfix ver change --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 67a04b5..f64832e 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_01"; + const string _betaAlphaPostfixString = "-Pre-Release_01a"; private bool _isDeviceDetectionInitialized = false; From 2913eb5e9317346a345efa5cb25ef3dc71ca8b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 20 Mar 2017 17:18:06 +0100 Subject: [PATCH 346/366] excavator SM50 default param fix, other minor fixes --- NiceHashMiner/Configs/Data/GeneralConfig.cs | 1 - NiceHashMiner/Devices/ComputeDevice.cs | 6 ++++++ NiceHashMiner/Devices/GroupAlgorithms.cs | 7 +++++++ NiceHashMiner/Forms/Form_Main.cs | 2 +- .../Miners/Parsing/ExtraLaunchParameters.cs | 15 --------------- .../Miners/Parsing/ExtraLaunchParametersParser.cs | 6 +++--- 6 files changed, 17 insertions(+), 20 deletions(-) diff --git a/NiceHashMiner/Configs/Data/GeneralConfig.cs b/NiceHashMiner/Configs/Data/GeneralConfig.cs index bf9486d..495d7b6 100644 --- a/NiceHashMiner/Configs/Data/GeneralConfig.cs +++ b/NiceHashMiner/Configs/Data/GeneralConfig.cs @@ -53,7 +53,6 @@ public class GeneralConfig { public DagGenerationType EthminerDagGenerationType = DagGenerationType.SingleKeep; public int ApiBindPortPoolStart = 5100; public double MinimumProfit = 0; - //public bool ContinueMiningIfNoInternetAccess = false; public bool IdleWhenNoInternetAccess = true; public bool DownloadInit = false; // 3rd party miners diff --git a/NiceHashMiner/Devices/ComputeDevice.cs b/NiceHashMiner/Devices/ComputeDevice.cs index a6f0c8f..0efa106 100644 --- a/NiceHashMiner/Devices/ComputeDevice.cs +++ b/NiceHashMiner/Devices/ComputeDevice.cs @@ -80,7 +80,11 @@ public ComputeDevice(int id, string group, string name, int threads, ulong affin } // GPU NVIDIA + int _SM_major = -1; + int _SM_minor = -1; public ComputeDevice(CudaDevice cudaDevice, DeviceGroupType group, int GPUCount) { + _SM_major = cudaDevice.SM_major; + _SM_minor = cudaDevice.SM_minor; ID = (int)cudaDevice.DeviceID; Name = cudaDevice.GetName(); Enabled = true; @@ -93,6 +97,8 @@ public ComputeDevice(CudaDevice cudaDevice, DeviceGroupType group, int GPUCount) GpuRam = cudaDevice.DeviceGlobalMemory; } + public bool IsSM50() { return _SM_major == 5 && _SM_minor == 0; } + // GPU AMD public ComputeDevice(AmdGpuDevice amdDevice, int GPUCount, bool isDetectionFallback) { ID = amdDevice.DeviceID; diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 88b58ad..9509f25 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -123,6 +123,13 @@ public static Dictionary> CreateForDevice(Compute } } + if (device.IsSM50() && algoSettings.ContainsKey(MinerBaseType.excavator)) { + int Equihash_index = algoSettings[MinerBaseType.excavator].FindIndex((algo) => algo.NiceHashID == AlgorithmType.Equihash ); + if (Equihash_index > -1) { + // -c1 1 needed for SM50 to work ATM + algoSettings[MinerBaseType.excavator][Equihash_index].ExtraLaunchParameters = "-c1 1"; + } + } } // END algoSettings != null return algoSettings; } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index f64832e..fa531f1 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_01a"; + const string _betaAlphaPostfixString = "-Pre-Release_01b"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 9c0d5ea..4b195e4 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -97,21 +97,6 @@ public static class ExtraLaunchParameters { }, new List() ), - //new MinerOptionPackage( - // MinerType.nheqminer_AMD, - // new List() { - // new MinerOption("Solver_Version", "-ov", "-ov", "0", MinerOptionFlagType.SingleParam, " "), // default none - // new MinerOption("Solver_Dev_Thread", "-ot", "-ot", "1", MinerOptionFlagType.MultiParam, " "), // default none - // }, - // new List() - //), - //new MinerOptionPackage( - // MinerType.eqm_CPU, - // new List() { - // new MinerOption("Threads", "-t", "-t", "-1", MinerOptionFlagType.SingleParam, " ") // default none - // }, - // new List() - //), new MinerOptionPackage( MinerType.eqm_CUDA, new List() { diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs index 2dd132c..ed78156 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParametersParser.cs @@ -40,7 +40,7 @@ public static int GetEqmCudaThreadCount(MiningPair pair) { private static bool prevHasIgnoreParam = false; private static int logCount = 0; - private static void IgnorePrintLogIbnit() { + private static void IgnorePrintLogInit() { prevHasIgnoreParam = false; logCount = 0; } @@ -95,7 +95,7 @@ private static string Parse(List MiningPairs, List opti LogParser(String.Format("ExtraLaunch params \"{0}\" for device UUID {1}", pair.CurrentExtraLaunchParameters, pair.Device.UUID)); var parameters = pair.CurrentExtraLaunchParameters.Replace("=", "= ").Split(' '); - IgnorePrintLogIbnit(); + IgnorePrintLogInit(); MinerOptionType currentFlag = MinerOptionType_NONE; @@ -220,7 +220,7 @@ private static MinerType GetMinerType(DeviceType deviceType, MinerBaseType miner if (MinerBaseType.sgminer == minerBaseType) { return MinerType.sgminer; } - if (MinerBaseType.ccminer == minerBaseType || MinerBaseType.ccminer_alexis == minerBaseType) { + if (MinerBaseType.ccminer == minerBaseType || MinerBaseType.ccminer_alexis == minerBaseType || MinerBaseType.experimental == minerBaseType) { if (AlgorithmType.CryptoNight == algorithmType) { return MinerType.ccminer_CryptoNight; } From 3466add11a21b622ce435f2c012878d4f4b5f088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 23 Mar 2017 12:30:43 +0100 Subject: [PATCH 347/366] excavator fix -ct extra launch params handling, set default 0 for -c1 -c2 excavator --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Globals.cs | 1 - NiceHashMiner/Miners/Grouping/MinerPaths.cs | 6 ++-- NiceHashMiner/Miners/Obsolete/cpuminer.cs | 2 +- .../Miners/Parsing/ExtraLaunchParameters.cs | 4 +-- NiceHashMiner/Miners/ccminer.cs | 2 +- .../Miners/ethminer/MinerEtherumCUDA.cs | 2 +- .../Miners/ethminer/MinerEtherumOCL.cs | 2 +- NiceHashMiner/Miners/excavator.cs | 35 ++++++++++--------- NiceHashMiner/Miners/sgminer.cs | 4 +-- 10 files changed, 31 insertions(+), 29 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index fa531f1..2107612 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_01b"; + const string _betaAlphaPostfixString = "-Pre-Release_02"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index 302709a..108f848 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -8,7 +8,6 @@ public class Globals { // Constants public static string[] MiningLocation = { "eu", "usa", "hk", "jp" }; public static readonly string DemoUser = "3DJhaQaKA6oyRaGyDZYdkZcise4b9DrCi2"; - public static readonly string PasswordDefault = "x"; // change this if TOS changes public static int CURRENT_TOS_VER = 2; diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 7614ba0..049ab4e 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -56,9 +56,9 @@ public static class Data { // NEW START //////////////////////////////////////////// // Pure functions - public static bool IsMinerAlgorithmAvaliable(List algos, MinerBaseType minerBaseType, AlgorithmType algorithmType) { - return algos.FindIndex((a) => a.MinerBaseType == minerBaseType && a.NiceHashID == algorithmType) > -1; - } + //public static bool IsMinerAlgorithmAvaliable(List algos, MinerBaseType minerBaseType, AlgorithmType algorithmType) { + // return algos.FindIndex((a) => a.MinerBaseType == minerBaseType && a.NiceHashID == algorithmType) > -1; + //} public static string GetPathFor(MinerBaseType minerBaseType, AlgorithmType algoType, DeviceGroupType devGroupType) { switch (minerBaseType) { diff --git a/NiceHashMiner/Miners/Obsolete/cpuminer.cs b/NiceHashMiner/Miners/Obsolete/cpuminer.cs index fd3a852..0648711 100644 --- a/NiceHashMiner/Miners/Obsolete/cpuminer.cs +++ b/NiceHashMiner/Miners/Obsolete/cpuminer.cs @@ -28,7 +28,7 @@ public override void Start(string url, string btcAdress, string worker) { LastCommandLine = "--algo=" + MiningSetup.MinerName + " --url=" + url + - " --userpass=" + username + ":" + Globals.PasswordDefault + + " --userpass=" + username + ":x " + ExtraLaunchParametersParser.ParseForMiningSetup( MiningSetup, DeviceType.CPU) + diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index 4b195e4..abec25c 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -173,8 +173,8 @@ public static class ExtraLaunchParameters { MinerType.excavator, new List() { // parameters differ according to algorithm - new MinerOption("parameter1", "-c1", "-c1", "", MinerOptionFlagType.MultiParam, " "), - new MinerOption("parameter2", "-c2", "-c2", "", MinerOptionFlagType.MultiParam, " "), + new MinerOption("parameter1", "-c1", "-c1", "0", MinerOptionFlagType.MultiParam, " "), + new MinerOption("parameter2", "-c2", "-c2", "0", MinerOptionFlagType.MultiParam, " "), // Overclocking not supported from NHM //new MinerOption("Overclocking_os", "-os", "-os", "", MinerOptionFlagType.MultiParam, " "), //new MinerOption("Overclocking_od", "-od", "-od", "2", MinerOptionFlagType.MultiParam, " "), diff --git a/NiceHashMiner/Miners/ccminer.cs b/NiceHashMiner/Miners/ccminer.cs index 9dbabc8..7ae9ce9 100644 --- a/NiceHashMiner/Miners/ccminer.cs +++ b/NiceHashMiner/Miners/ccminer.cs @@ -50,7 +50,7 @@ public override void Start(string url, string btcAdress, string worker) LastCommandLine = algo + " --url=" + url + - " --userpass=" + username + ":" + Globals.PasswordDefault + + " --userpass=" + username + ":x " + apiBind + " " + ExtraLaunchParametersParser.ParseForMiningSetup( MiningSetup, diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs index ab1ffc9..e956adf 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherumCUDA.cs @@ -36,7 +36,7 @@ protected override string GetStartCommandStringPart(string url, string username) MiningSetup, DeviceType.NVIDIA) + " -S " + url.Substring(14) - + " -O " + username + ":" + Globals.PasswordDefault + + " -O " + username + ":x " + " --api-port " + APIPort.ToString() + " --cuda-devices "; } diff --git a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs index 2e31cfe..26a9b8e 100644 --- a/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs +++ b/NiceHashMiner/Miners/ethminer/MinerEtherumOCL.cs @@ -42,7 +42,7 @@ protected override string GetStartCommandStringPart(string url, string username) MiningSetup, DeviceType.AMD) + " -S " + url.Substring(14) - + " -O " + username + ":" + Globals.PasswordDefault + + " -O " + username + ":x " + " --api-port " + APIPort.ToString() + " --opencl-devices "; } diff --git a/NiceHashMiner/Miners/excavator.cs b/NiceHashMiner/Miners/excavator.cs index 950e2b4..d47c65e 100644 --- a/NiceHashMiner/Miners/excavator.cs +++ b/NiceHashMiner/Miners/excavator.cs @@ -11,7 +11,7 @@ namespace NiceHashMiner.Miners { public class excavator : Miner { - private class DviceStat { + private class DeviceStat { public int id { get; set; } public string name { get; set; } public double speed_hps { get; set; } @@ -21,7 +21,7 @@ private class Result { public bool connected { get; set; } public double interval_seconds { get; set; } public double speed_hps { get; set; } - public List devices { get; set; } + public List devices { get; set; } public double accepted_per_minute { get; set; } public double rejected_per_minute { get; set; } } @@ -45,27 +45,30 @@ public override void Start(string url, string btcAdress, string worker) { } protected override string GetDevicesCommandString() { + List CT_MiningPairs = new List(); string deviceStringCommand = " -cd "; + int default_CT = 1; if(this.MiningSetup.CurrentAlgorithmType == AlgorithmType.Equihash) { - foreach (var nvidia_pair in this.MiningSetup.MiningPairs) { - if (nvidia_pair.CurrentExtraLaunchParameters.Contains("-ct")) { - for (int i = 0; i < ExtraLaunchParametersParser.GetEqmCudaThreadCount(nvidia_pair); ++i) { - deviceStringCommand += nvidia_pair.Device.ID + " "; - } - } else { // use default 2 best performance - for (int i = 0; i < 2; ++i) { - deviceStringCommand += nvidia_pair.Device.ID + " "; - } + default_CT = 2; + } + foreach (var nvidia_pair in this.MiningSetup.MiningPairs) { + if (nvidia_pair.CurrentExtraLaunchParameters.Contains("-ct")) { + for (int i = 0; i < ExtraLaunchParametersParser.GetEqmCudaThreadCount(nvidia_pair); ++i) { + deviceStringCommand += nvidia_pair.Device.ID + " "; + CT_MiningPairs.Add(nvidia_pair); + } + } else { // use default default_CT for best performance + for (int i = 0; i < default_CT; ++i) { + deviceStringCommand += nvidia_pair.Device.ID + " "; + CT_MiningPairs.Add(nvidia_pair); } - } - } else { - foreach (var nvidia_pair in this.MiningSetup.MiningPairs) { - deviceStringCommand += nvidia_pair.Device.ID + " "; } } // no extra launch params - deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(this.MiningSetup, DeviceType.NVIDIA); + MiningSetup CT_MiningSetup = new MiningSetup(CT_MiningPairs); + //deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(this.MiningSetup, DeviceType.NVIDIA); + deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(CT_MiningSetup, DeviceType.NVIDIA); return deviceStringCommand; } diff --git a/NiceHashMiner/Miners/sgminer.cs b/NiceHashMiner/Miners/sgminer.cs index f2beb48..828a0bb 100644 --- a/NiceHashMiner/Miners/sgminer.cs +++ b/NiceHashMiner/Miners/sgminer.cs @@ -70,7 +70,7 @@ public override void Start(string url, string btcAdress, string worker) " -k " + MiningSetup.MinerName + " --url=" + url + " --userpass=" + username + - " -p " + Globals.PasswordDefault + + " -p x " + " --api-listen" + " --api-port=" + APIPort.ToString() + " " + @@ -104,7 +104,7 @@ protected override string BenchmarkCreateCommandLine(Algorithm algorithm, int ti " -k " + algorithm.MinerName + " --url=" + url + " --userpass=" + username + - " -p " + Globals.PasswordDefault + + " -p x " + " --sched-stop " + DateTime.Now.AddSeconds(time).ToString("HH:mm") + " -T --log 10 --log-file dump.txt" + " " + From 6b202a603505697fff20b4bf6a6dd0e44a733ae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 24 Mar 2017 11:14:56 +0100 Subject: [PATCH 348/366] excavator SM5.0 default param update --- NiceHashMiner/Devices/GroupAlgorithms.cs | 15 ++++++++------- NiceHashMiner/Miners/excavator.cs | 1 - 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index 9509f25..f77b30c 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -123,13 +123,14 @@ public static Dictionary> CreateForDevice(Compute } } - if (device.IsSM50() && algoSettings.ContainsKey(MinerBaseType.excavator)) { - int Equihash_index = algoSettings[MinerBaseType.excavator].FindIndex((algo) => algo.NiceHashID == AlgorithmType.Equihash ); - if (Equihash_index > -1) { - // -c1 1 needed for SM50 to work ATM - algoSettings[MinerBaseType.excavator][Equihash_index].ExtraLaunchParameters = "-c1 1"; - } - } + // This is not needed anymore after excavator v1.1.4a + //if (device.IsSM50() && algoSettings.ContainsKey(MinerBaseType.excavator)) { + // int Equihash_index = algoSettings[MinerBaseType.excavator].FindIndex((algo) => algo.NiceHashID == AlgorithmType.Equihash ); + // if (Equihash_index > -1) { + // // -c1 1 needed for SM50 to work ATM + // algoSettings[MinerBaseType.excavator][Equihash_index].ExtraLaunchParameters = "-c1 1"; + // } + //} } // END algoSettings != null return algoSettings; } diff --git a/NiceHashMiner/Miners/excavator.cs b/NiceHashMiner/Miners/excavator.cs index d47c65e..2f673a1 100644 --- a/NiceHashMiner/Miners/excavator.cs +++ b/NiceHashMiner/Miners/excavator.cs @@ -65,7 +65,6 @@ protected override string GetDevicesCommandString() { } } - // no extra launch params MiningSetup CT_MiningSetup = new MiningSetup(CT_MiningPairs); //deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(this.MiningSetup, DeviceType.NVIDIA); deviceStringCommand += " " + ExtraLaunchParametersParser.ParseForMiningSetup(CT_MiningSetup, DeviceType.NVIDIA); From f1f0f619e7c852778966bfd20d5c15e3d0cd57e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 24 Mar 2017 11:48:27 +0100 Subject: [PATCH 349/366] nheqminer check GPU compatibility --- NiceHashMiner/Devices/GroupAlgorithms.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index f77b30c..eec2205 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -125,12 +125,21 @@ public static Dictionary> CreateForDevice(Compute // This is not needed anymore after excavator v1.1.4a //if (device.IsSM50() && algoSettings.ContainsKey(MinerBaseType.excavator)) { - // int Equihash_index = algoSettings[MinerBaseType.excavator].FindIndex((algo) => algo.NiceHashID == AlgorithmType.Equihash ); + // int Equihash_index = algoSettings[MinerBaseType.excavator].FindIndex((algo) => algo.NiceHashID == AlgorithmType.Equihash); // if (Equihash_index > -1) { // // -c1 1 needed for SM50 to work ATM // algoSettings[MinerBaseType.excavator][Equihash_index].ExtraLaunchParameters = "-c1 1"; // } //} + // nheqminer exceptions scope + { + const MinerBaseType minerBaseKey = MinerBaseType.nheqminer; + if (algoSettings.ContainsKey(minerBaseKey) && device.Name.Contains("GTX") + && (device.Name.Contains("560") || device.Name.Contains("650") || device.Name.Contains("680") || device.Name.Contains("770")) + ) { + algoSettings = FilterMinerBaseTypes(algoSettings, new List() { minerBaseKey }); + } + } } // END algoSettings != null return algoSettings; } From 61f27ef65362bd23682d89e4b2b19e6237cd4b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 24 Mar 2017 13:47:42 +0100 Subject: [PATCH 350/366] pre-rel ver change --- NiceHashMiner/Forms/Form_Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 2107612..a00861f 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_02"; + const string _betaAlphaPostfixString = "-Pre-Release_03"; private bool _isDeviceDetectionInitialized = false; From 3187eb2ad6454dec1245f274594bfdf210ebffea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 24 Mar 2017 14:00:52 +0100 Subject: [PATCH 351/366] version bump --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index a00861f..be8e6d5 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_03"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 93f923a..cf018eb 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.6")] -[assembly: AssemblyFileVersion("1.7.5.6")] +[assembly: AssemblyVersion("1.7.5.7")] +[assembly: AssemblyFileVersion("1.7.5.7")] From fc9443ec788b7061cdcc19c3b3251ba4e9381272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 24 Mar 2017 14:27:11 +0100 Subject: [PATCH 352/366] nvml.dll copy if newer --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 7f255aa..e477ec6 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -121,6 +121,21 @@ private static void showMessageAndStep(string infoMsg) { public static IMessageNotifier MessageNotifier { get; private set; } public static void QueryDevices(IMessageNotifier messageNotifier) { + + // check NVIDIA nvml.dll and copy over scope + { + string nvmlPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\NVIDIA Corporation\\NVSMI\\nvml.dll"; + string copyToPath = Directory.GetCurrentDirectory() + "\\nvml.dll"; + if (nvmlPath.Contains(" (x86)")) nvmlPath = nvmlPath.Replace(" (x86)", ""); + try { + File.Copy(nvmlPath, copyToPath, true); + Helpers.ConsolePrint(TAG, String.Format("Copy from {0} to {1} done", nvmlPath, copyToPath)); + } catch (Exception e) { + Helpers.ConsolePrint(TAG, "Copy nvml.dll failed: " + e.Message); + } + } + + MessageNotifier = messageNotifier; // #0 get video controllers, used for cross checking WindowsDisplayAdapters.QueryVideoControllers(); From 723623d6400d147e12bdd5076b5aaad827b34386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 24 Mar 2017 14:31:09 +0100 Subject: [PATCH 353/366] extra file check --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index e477ec6..19bb8f0 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -125,13 +125,15 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { // check NVIDIA nvml.dll and copy over scope { string nvmlPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\NVIDIA Corporation\\NVSMI\\nvml.dll"; - string copyToPath = Directory.GetCurrentDirectory() + "\\nvml.dll"; - if (nvmlPath.Contains(" (x86)")) nvmlPath = nvmlPath.Replace(" (x86)", ""); - try { - File.Copy(nvmlPath, copyToPath, true); - Helpers.ConsolePrint(TAG, String.Format("Copy from {0} to {1} done", nvmlPath, copyToPath)); - } catch (Exception e) { - Helpers.ConsolePrint(TAG, "Copy nvml.dll failed: " + e.Message); + if (File.Exists(nvmlPath)) { + string copyToPath = Directory.GetCurrentDirectory() + "\\nvml.dll"; + if (nvmlPath.Contains(" (x86)")) nvmlPath = nvmlPath.Replace(" (x86)", ""); + try { + File.Copy(nvmlPath, copyToPath, true); + Helpers.ConsolePrint(TAG, String.Format("Copy from {0} to {1} done", nvmlPath, copyToPath)); + } catch (Exception e) { + Helpers.ConsolePrint(TAG, "Copy nvml.dll failed: " + e.Message); + } } } From d24a7c59c9c4a9b96c33388f14a6177ac25e325a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 24 Mar 2017 14:33:48 +0100 Subject: [PATCH 354/366] fix --- NiceHashMiner/Devices/ComputeDeviceManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NiceHashMiner/Devices/ComputeDeviceManager.cs b/NiceHashMiner/Devices/ComputeDeviceManager.cs index 19bb8f0..3766e49 100644 --- a/NiceHashMiner/Devices/ComputeDeviceManager.cs +++ b/NiceHashMiner/Devices/ComputeDeviceManager.cs @@ -125,9 +125,9 @@ public static void QueryDevices(IMessageNotifier messageNotifier) { // check NVIDIA nvml.dll and copy over scope { string nvmlPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\NVIDIA Corporation\\NVSMI\\nvml.dll"; + if (nvmlPath.Contains(" (x86)")) nvmlPath = nvmlPath.Replace(" (x86)", ""); if (File.Exists(nvmlPath)) { string copyToPath = Directory.GetCurrentDirectory() + "\\nvml.dll"; - if (nvmlPath.Contains(" (x86)")) nvmlPath = nvmlPath.Replace(" (x86)", ""); try { File.Copy(nvmlPath, copyToPath, true); Helpers.ConsolePrint(TAG, String.Format("Copy from {0} to {1} done", nvmlPath, copyToPath)); From 303eb59bcd6fb62bb420264fef686ed8034234f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 27 Mar 2017 12:24:46 +0200 Subject: [PATCH 355/366] fixes --- NiceHashMiner/Devices/GroupAlgorithms.cs | 2 +- NiceHashMiner/Utils/Links.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index eec2205..cca0baf 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -11,7 +11,7 @@ namespace NiceHashMiner.Devices { /// public static class GroupAlgorithms { - public static Dictionary> CreateForDevice(ComputeDevice device) { + private static Dictionary> CreateForDevice(ComputeDevice device) { if (device != null) { var algoSettings = CreateDefaultsForGroup(device.DeviceGroupType); if (algoSettings != null) { diff --git a/NiceHashMiner/Utils/Links.cs b/NiceHashMiner/Utils/Links.cs index bb98105..9e07a51 100644 --- a/NiceHashMiner/Utils/Links.cs +++ b/NiceHashMiner/Utils/Links.cs @@ -4,11 +4,11 @@ namespace NiceHashMiner { public static class Links { - public static string VisitURL = "http://www.nicehash.com?utm_source=NHM"; + public static string VisitURL = "https://www.nicehash.com?utm_source=NHM"; // add version public static string VisitURLNew = "https://github.com/nicehash/NiceHashMiner/releases/tag/"; // add btc adress as parameter - public static string CheckStats = "http://www.nicehash.com/index.jsp?utm_source=NHM&p=miners&addr="; + public static string CheckStats = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=miners&addr="; // help and faq public static string NHM_Help = "https://github.com/nicehash/NiceHashMiner"; // faq From fe0f8b0548f30b370f536d6863b4b75a44c33ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 3 Apr 2017 13:46:37 +0200 Subject: [PATCH 356/366] reorder logging --- NiceHashMiner/Miners/MiningSession.cs | 36 ++++++++++++++------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index e1c6d5f..910f8c8 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -250,6 +250,24 @@ public void SwichMostProfitableGroupUpMethod(Dictionary 0 && CurrentProfit > 0) { + double percDiff = Math.Abs((LastEstimatedProfit / CurrentProfit) - 1); + if (percDiff < ConfigManager.GeneralConfig.SwitchProfitabilityThreshold) { + // don't switch + Helpers.ConsolePrint(TAG, String.Format("Will not switch profit diff is {0}, current threshold {1}", percDiff, ConfigManager.GeneralConfig.SwitchProfitabilityThreshold)); + return; + } + } + + LastEstimatedProfit = CurrentProfit; + // print profit statuses if (log) { StringBuilder stringBuilderFull = new StringBuilder(); @@ -274,23 +292,7 @@ public void SwichMostProfitableGroupUpMethod(Dictionary 0 && CurrentProfit > 0) { - double percDiff = Math.Abs((LastEstimatedProfit / CurrentProfit) - 1); - if (percDiff < ConfigManager.GeneralConfig.SwitchProfitabilityThreshold) { - // don't switch - Helpers.ConsolePrint(TAG, String.Format("Will not switch profit diff is {0}, current threshold {1}", percDiff, ConfigManager.GeneralConfig.SwitchProfitabilityThreshold)); - return; - } - } - - LastEstimatedProfit = CurrentProfit; - + // group new miners Dictionary> newGroupedMiningPairs = new Dictionary>(); // group devices with same supported algorithms { From 51c77fec11964eaf5fe0f20accb10240cef57215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 6 Apr 2017 13:44:43 +0200 Subject: [PATCH 357/366] fix profitability calculation switch --- NiceHashMiner/Miners/Grouping/MiningDevice.cs | 22 +++++++++++++++++++ NiceHashMiner/Miners/MiningSession.cs | 14 +++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/NiceHashMiner/Miners/Grouping/MiningDevice.cs b/NiceHashMiner/Miners/Grouping/MiningDevice.cs index 06e24bd..7ee4042 100644 --- a/NiceHashMiner/Miners/Grouping/MiningDevice.cs +++ b/NiceHashMiner/Miners/Grouping/MiningDevice.cs @@ -54,6 +54,8 @@ public MiningDevice(ComputeDevice device) { Algorithms.Add(algo); } } + MostProfitableAlgorithmType = AlgorithmType.NONE; + MostProfitableMinerBaseType = MinerBaseType.NONE; } public ComputeDevice Device { get; private set; } public List Algorithms = new List(); @@ -67,11 +69,18 @@ public string GetMostProfitableString() { public AlgorithmType MostProfitableAlgorithmType { get; private set; } public MinerBaseType MostProfitableMinerBaseType { get; private set; } + // prev state + public AlgorithmType PrevProfitableAlgorithmType { get; private set; } + public MinerBaseType PrevProfitableMinerBaseType { get; private set; } private int GetMostProfitableIndex() { return Algorithms.FindIndex((a) => a.NiceHashID == MostProfitableAlgorithmType && a.MinerBaseType == MostProfitableMinerBaseType); } + private int GetPrevProfitableIndex() { + return Algorithms.FindIndex((a) => a.NiceHashID == PrevProfitableAlgorithmType && a.MinerBaseType == PrevProfitableMinerBaseType); + } + public double GetCurrentMostProfitValue { get { int mostProfitableIndex = GetMostProfitableIndex(); @@ -82,6 +91,16 @@ public double GetCurrentMostProfitValue { } } + public double GetPrevMostProfitValue { + get { + int mostProfitableIndex = GetPrevProfitableIndex(); + if (mostProfitableIndex > -1) { + return Algorithms[mostProfitableIndex].CurrentProfit; + } + return 0; + } + } + public MiningPair GetMostProfitablePair() { return new MiningPair(this.Device, Algorithms[GetMostProfitableIndex()]); } @@ -91,6 +110,9 @@ public bool HasProfitableAlgo() { } public void CalculateProfits(Dictionary NiceHashData) { + // save last state + PrevProfitableAlgorithmType = MostProfitableAlgorithmType; + PrevProfitableMinerBaseType = MostProfitableMinerBaseType; // assume none is profitable MostProfitableAlgorithmType = AlgorithmType.NONE; MostProfitableMinerBaseType = MinerBaseType.NONE; diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 910f8c8..6376b0c 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -38,8 +38,6 @@ public class MiningSession { private bool IsConnectedToInternet = true; private bool IsMiningRegardlesOfProfit = true; - private double LastEstimatedProfit = 0; - // timers private Timer _preventSleepTimer; // check internet connection @@ -241,6 +239,7 @@ public void SwichMostProfitableGroupUpMethod(Dictionary profitableDevices = new List(); double CurrentProfit = 0.0d; + double PrevStateProfit = 0.0d; foreach (var device in _miningDevices) { // calculate profits device.CalculateProfits(NiceHashData); @@ -248,6 +247,7 @@ public void SwichMostProfitableGroupUpMethod(Dictionary 0 && CurrentProfit > 0) { - double percDiff = Math.Abs((LastEstimatedProfit / CurrentProfit) - 1); + Helpers.ConsolePrint(TAG, String.Format("PrevStateProfit {0}, CurrentProfit {1}", PrevStateProfit, CurrentProfit)); + if (PrevStateProfit > 0 && CurrentProfit > 0) { + double a = Math.Max(PrevStateProfit, CurrentProfit); + double b = Math.Min(PrevStateProfit, CurrentProfit); + //double percDiff = Math.Abs((PrevStateProfit / CurrentProfit) - 1); + double percDiff = ((a - b)) / b; if (percDiff < ConfigManager.GeneralConfig.SwitchProfitabilityThreshold) { // don't switch Helpers.ConsolePrint(TAG, String.Format("Will not switch profit diff is {0}, current threshold {1}", percDiff, ConfigManager.GeneralConfig.SwitchProfitabilityThreshold)); @@ -266,8 +270,6 @@ public void SwichMostProfitableGroupUpMethod(Dictionary Date: Thu, 6 Apr 2017 14:02:33 +0200 Subject: [PATCH 358/366] update claymore dual binary and add new flag support --- NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs | 2 ++ NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index abec25c..ad8e8e1 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -220,6 +220,8 @@ public static class ExtraLaunchParameters { new MinerOption("ClaymoreDual_dcri" , "-dcri", "-dcri", "30", MinerOptionFlagType.MultiParam, ","), new MinerOption("ClaymoreDual_dcrt" , "-dcrt", "-dcrt", "5", MinerOptionFlagType.SingleParam, ","), + // v9.0 + new MinerOption("ClaymoreDual_asm" , "-asm", "-asm", "1", MinerOptionFlagType.MultiParam, ","), }, new List() { // temperature stuff diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 9c54d16..3ea02a2 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -20,7 +20,7 @@ public static class MinersDownloadManager { "bin"); public static DownloadSetup ThirdPartyDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_5_4.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_3rdparty_1_7_5_8.zip", "bins_3rdparty.zip", "bin_3rdparty"); } From 725d29fa2cd4c495be04e2f8283bcee69a8bfe39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 10 Apr 2017 12:08:45 +0200 Subject: [PATCH 359/366] updated bins, ver bump, pre-release --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/Grouping/MinerPaths.cs | 16 ++-- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- NiceHashMiner/Utils/BINS_CODEGEN.cs | 78 +++++++++++++------- NiceHashMiner/Utils/MinersDownloadManager.cs | 2 +- 5 files changed, 62 insertions(+), 40 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index be8e6d5..67a04b5 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = "-Pre-Release_01"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/Grouping/MinerPaths.cs b/NiceHashMiner/Miners/Grouping/MinerPaths.cs index 049ab4e..612c976 100644 --- a/NiceHashMiner/Miners/Grouping/MinerPaths.cs +++ b/NiceHashMiner/Miners/Grouping/MinerPaths.cs @@ -19,18 +19,18 @@ public static class Data { /// /// ccminers /// - public const string ccminer_decred = _bin + @"\ccminer_decred.exe"; - public const string ccminer_nanashi = _bin + @"\ccminer_nanashi.exe"; - public const string ccminer_neoscrypt = _bin + @"\ccminer_neoscrypt.exe"; - public const string ccminer_sp = _bin + @"\ccminer_sp.exe"; - public const string ccminer_tpruvot = _bin + @"\ccminer_tpruvot.exe"; - public const string ccminer_cryptonight = _bin + @"\ccminer_cryptonight.exe"; - public const string ccminer_x11gost = _bin + @"\ccminer_x11gost.exe"; + public const string ccminer_decred = _bin + @"\ccminer_decred\ccminer.exe"; + public const string ccminer_nanashi = _bin + @"\ccminer_nanashi\ccminer.exe"; + public const string ccminer_neoscrypt = _bin + @"\ccminer_neoscrypt\ccminer.exe"; + public const string ccminer_sp = _bin + @"\ccminer_sp\ccminer.exe"; + public const string ccminer_tpruvot = _bin + @"\ccminer_tpruvot\ccminer.exe"; + public const string ccminer_cryptonight = _bin + @"\ccminer_cryptonight\ccminer.exe"; + public const string ccminer_x11gost = _bin + @"\ccminer_x11gost\ccminer.exe"; /// /// ethminers /// - public const string ethminer = _bin + @"\ethminer.exe"; + public const string ethminer = _bin + @"\ethminer\ethminer.exe"; /// /// sgminers diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index cf018eb..8ae3b9b 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.7")] -[assembly: AssemblyFileVersion("1.7.5.7")] +[assembly: AssemblyVersion("1.7.5.8")] +[assembly: AssemblyFileVersion("1.7.5.8")] diff --git a/NiceHashMiner/Utils/BINS_CODEGEN.cs b/NiceHashMiner/Utils/BINS_CODEGEN.cs index 3ab90b7..a8ae0b7 100644 --- a/NiceHashMiner/Utils/BINS_CODEGEN.cs +++ b/NiceHashMiner/Utils/BINS_CODEGEN.cs @@ -2,36 +2,54 @@ namespace NiceHashMiner.Utils { public static class Bins_Data { #region CODE_GEN STUFF // listFiles.py - public static string[] ALL_FILES_BINS = { @"\ccminer_cryptonight.exe", -@"\ccminer_decred.exe", -@"\ccminer_nanashi.exe", -@"\ccminer_neoscrypt.exe", -@"\ccminer_sp.exe", -@"\ccminer_tpruvot.exe", -@"\ccminer_x11gost.exe", -@"\cudart32_80.dll", -@"\cudart64_80.dll", -@"\ethminer.exe", -@"\libcrypto-1.0.0.dll", -@"\libcurl-4.dll", -@"\libcurl.dll", -@"\libgcc_s_seh-1.dll", -@"\libgmp-10.dll", -@"\libgmpxx-4.dll", -@"\libjansson-4.dll", -@"\libjson-c-2.dll", -@"\libmicrohttpd-dll.dll", -@"\libsigc-2.0-0.dll", -@"\libssl-1.0.0.dll", -@"\libstdc++-6.dll", -@"\libwinpthread-1.dll", -@"\libz-1.dll", -@"\msvcr120.dll", -@"\OpenCL.dll", + public static string[] ALL_FILES_BINS = { @"\vc_redist.x64.exe", -@"\zlib1.dll", +@"\ccminer_cryptonight\ccminer.exe", +@"\ccminer_cryptonight\cudart32_80.dll", +@"\ccminer_cryptonight\cudart64_80.dll", +@"\ccminer_cryptonight\msvcp120.dll", +@"\ccminer_cryptonight\msvcr120.dll", +@"\ccminer_decred\ccminer.exe", +@"\ccminer_decred\cudart32_80.dll", +@"\ccminer_decred\cudart64_80.dll", +@"\ccminer_decred\msvcp120.dll", +@"\ccminer_decred\msvcr120.dll", +@"\ccminer_nanashi\ccminer.exe", +@"\ccminer_nanashi\cudart32_80.dll", +@"\ccminer_nanashi\cudart64_80.dll", +@"\ccminer_nanashi\msvcp120.dll", +@"\ccminer_nanashi\msvcr120.dll", +@"\ccminer_neoscrypt\ccminer.exe", +@"\ccminer_neoscrypt\cudart32_80.dll", +@"\ccminer_neoscrypt\cudart64_80.dll", +@"\ccminer_neoscrypt\msvcp120.dll", +@"\ccminer_neoscrypt\msvcr120.dll", +@"\ccminer_sp\ccminer.exe", +@"\ccminer_sp\cudart32_80.dll", +@"\ccminer_sp\cudart64_80.dll", +@"\ccminer_sp\msvcp120.dll", +@"\ccminer_sp\msvcr120.dll", +@"\ccminer_tpruvot\ccminer.exe", +@"\ccminer_tpruvot\cudart32_80.dll", +@"\ccminer_tpruvot\cudart64_80.dll", +@"\ccminer_tpruvot\msvcp120.dll", +@"\ccminer_tpruvot\msvcr120.dll", +@"\ccminer_x11gost\ccminer.exe", +@"\ccminer_x11gost\cudart32_80.dll", +@"\ccminer_x11gost\cudart64_80.dll", +@"\ccminer_x11gost\msvcp120.dll", +@"\ccminer_x11gost\msvcr120.dll", +@"\ethminer\cudart64_80.dll", +@"\ethminer\ethminer.exe", +@"\ethminer\libcurl.dll", +@"\ethminer\libmicrohttpd-dll.dll", +@"\ethminer\msvcp120.dll", +@"\ethminer\msvcr120.dll", +@"\ethminer\OpenCL.dll", @"\excavator\cudart64_80.dll", @"\excavator\excavator.exe", +@"\excavator\msvcp120.dll", +@"\excavator\msvcr120.dll", @"\nheqminer_v0.4b\cpu_tromp_AVX.dll", @"\nheqminer_v0.4b\cpu_tromp_SSE2.dll", @"\nheqminer_v0.4b\cudart64_75.dll", @@ -44,7 +62,11 @@ public static class Bins_Data { @"\nheqminer_v0.4b\nheqminer.exe", @"\sgminer-5-6-0-general\sgminer.exe", @"\sgminer-gm\sgminer.exe", -@"\xmr-stak-cpu\xmr-stak-cpu.exe" +@"\xmr-stak-cpu\concrt140.dll", +@"\xmr-stak-cpu\msvcp140.dll", +@"\xmr-stak-cpu\vccorlib140.dll", +@"\xmr-stak-cpu\vcruntime140.dll", +@"\xmr-stak-cpu\xmr-stak-cpu.exe", }; #endregion //CODE_GEN STUFF // listFiles.py } diff --git a/NiceHashMiner/Utils/MinersDownloadManager.cs b/NiceHashMiner/Utils/MinersDownloadManager.cs index 3ea02a2..ad60ef1 100644 --- a/NiceHashMiner/Utils/MinersDownloadManager.cs +++ b/NiceHashMiner/Utils/MinersDownloadManager.cs @@ -15,7 +15,7 @@ namespace NiceHashMiner.Utils { public static class MinersDownloadManager { public static DownloadSetup StandardDlSetup = new DownloadSetup( - "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_6.zip", + "https://github.com/nicehash/NiceHashMiner/releases/download/1.7.0.0-dev/bin_1_7_5_8.zip", "bins.zip", "bin"); From f48d54b6d15ca147fede1c474f0d7a0f500df8bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 10 Apr 2017 19:59:47 +0200 Subject: [PATCH 360/366] xmr full range test, ht mode added --- NiceHashMiner/Devices/GroupAlgorithms.cs | 4 +- NiceHashMiner/Forms/Form_Benchmark.cs | 65 +++++++++++++++++------- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Miners/XmrStackCPUMiner.cs | 10 ++-- 4 files changed, 55 insertions(+), 26 deletions(-) diff --git a/NiceHashMiner/Devices/GroupAlgorithms.cs b/NiceHashMiner/Devices/GroupAlgorithms.cs index cca0baf..7947cf4 100644 --- a/NiceHashMiner/Devices/GroupAlgorithms.cs +++ b/NiceHashMiner/Devices/GroupAlgorithms.cs @@ -170,14 +170,14 @@ public static Dictionary> CreateDefaultsForGroup( if (DeviceGroupType.AMD_OpenCL == deviceGroupType) { // DisableAMDTempControl = false; TemperatureParam must be appended lastly string RemDis = " --remove-disabled "; - string DefaultParam = AmdGpuDevice.DefaultParam; + string DefaultParam = RemDis + AmdGpuDevice.DefaultParam; return new Dictionary>() { { MinerBaseType.sgminer, new List() { //new Algorithm(MinerBaseType.sgminer, AlgorithmType.NeoScrypt, "neoscrypt") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 2 --thread-concurrency 8192 --worksize 64 --gpu-threads 4" }, //new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lyra2REv2, "Lyra2REv2") { ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 160 --thread-concurrency 0 --worksize 64 --gpu-threads 1" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.DaggerHashimoto, "ethash") { ExtraLaunchParameters = RemDis + "--xintensity 512 -w 192 -g 1" }, - new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = RemDis + "--gpu-threads 1 --remove-disabled --xintensity 256 --lookup-gap 2 --worksize 64" }, + new Algorithm(MinerBaseType.sgminer, AlgorithmType.Decred, "decred") { ExtraLaunchParameters = RemDis + "--gpu-threads 1 --xintensity 256 --lookup-gap 2 --worksize 64" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Lbry, "lbry") { ExtraLaunchParameters = DefaultParam + "--xintensity 512 --worksize 128 --gpu-threads 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.CryptoNight, "cryptonight") { ExtraLaunchParameters = DefaultParam + "--rawintensity 512 -w 4 -g 2" }, new Algorithm(MinerBaseType.sgminer, AlgorithmType.Pascal, "pascal") { ExtraLaunchParameters = DefaultParam + "--intensity 21 -w 64 -g 2" }, diff --git a/NiceHashMiner/Forms/Form_Benchmark.cs b/NiceHashMiner/Forms/Form_Benchmark.cs index 399cfd0..9ce85a1 100644 --- a/NiceHashMiner/Forms/Form_Benchmark.cs +++ b/NiceHashMiner/Forms/Form_Benchmark.cs @@ -54,9 +54,43 @@ private enum BenchmarkSettingsStatus : int { // CPU benchmarking helpers private class CPUBenchmarkStatus { - public bool HasAlreadyBenchmarked = false; // after first benchmark set to true - public double BenchmarkSpeed; - public int LessTreads = 0; + private class benchmark { + public benchmark(int lt, double bench) { + LessTreads = lt; + Benchmark = bench; + } + public readonly int LessTreads; + public readonly double Benchmark; + } + public CPUBenchmarkStatus(int max_threads) { + _max_threads = max_threads; + } + + public bool HasTest() { + return _cur_less_threads < _max_threads; + } + + public void SetNextSpeed(double speed) { + if (HasTest()) { + _benchmarks.Add(new benchmark(_cur_less_threads, speed)); + ++_cur_less_threads; + } + } + + public void FindFastest() { + _benchmarks.Sort((a, b) => - a.Benchmark.CompareTo(b.Benchmark)); + } + public double GetBestSpeed() { + return _benchmarks[0].Benchmark; + } + public int GetLessThreads() { + return _benchmarks[0].LessTreads; + } + + private readonly int _max_threads; + private int _cur_less_threads = 0; + private List _benchmarks = new List(); + public int LessTreads { get { return _cur_less_threads; } } public int Time; } private CPUBenchmarkStatus __CPUBenchmarkStatus = null; @@ -458,8 +492,8 @@ void NextBenchmark() { if (_currentDevice != null && _currentAlgorithm != null) { _currentMiner = MinerFactory.CreateMiner(_currentDevice, _currentAlgorithm); - if (_currentAlgorithm.MinerBaseType == MinerBaseType.XmrStackCPU && _currentAlgorithm.NiceHashID == AlgorithmType.CryptoNight && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters)) { - __CPUBenchmarkStatus = new CPUBenchmarkStatus(); + if (_currentAlgorithm.MinerBaseType == MinerBaseType.XmrStackCPU && _currentAlgorithm.NiceHashID == AlgorithmType.CryptoNight && string.IsNullOrEmpty(_currentAlgorithm.ExtraLaunchParameters) && _currentAlgorithm.ExtraLaunchParameters.Contains("enable_ht=true") == false) { + __CPUBenchmarkStatus = new CPUBenchmarkStatus(Globals.ThreadsPerCPU); _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; } else { __CPUBenchmarkStatus = null; @@ -553,20 +587,13 @@ public void OnBenchmarkComplete(bool success, string status) { _bechmarkedSuccessCount += success ? 1 : 0; bool rebenchSame = false; if(success && __CPUBenchmarkStatus != null && CPUAlgos.Contains(_currentAlgorithm.NiceHashID) && _currentAlgorithm.MinerBaseType == MinerBaseType.XmrStackCPU) { - if (__CPUBenchmarkStatus.HasAlreadyBenchmarked && __CPUBenchmarkStatus.BenchmarkSpeed > _currentAlgorithm.BenchmarkSpeed) { - rebenchSame = false; - _currentAlgorithm.BenchmarkSpeed = __CPUBenchmarkStatus.BenchmarkSpeed; - _currentAlgorithm.LessThreads--; - } else { - __CPUBenchmarkStatus.HasAlreadyBenchmarked = true; - __CPUBenchmarkStatus.BenchmarkSpeed = _currentAlgorithm.BenchmarkSpeed; - __CPUBenchmarkStatus.LessTreads++; - if(__CPUBenchmarkStatus.LessTreads < Globals.ThreadsPerCPU) { - _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; - rebenchSame = true; - } else { - rebenchSame = false; - } + __CPUBenchmarkStatus.SetNextSpeed(_currentAlgorithm.BenchmarkSpeed); + rebenchSame = __CPUBenchmarkStatus.HasTest(); + _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.LessTreads; + if (rebenchSame == false) { + __CPUBenchmarkStatus.FindFastest(); + _currentAlgorithm.BenchmarkSpeed = __CPUBenchmarkStatus.GetBestSpeed(); + _currentAlgorithm.LessThreads = __CPUBenchmarkStatus.GetLessThreads(); } } diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 67a04b5..a00861f 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_01"; + const string _betaAlphaPostfixString = "-Pre-Release_03"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Miners/XmrStackCPUMiner.cs b/NiceHashMiner/Miners/XmrStackCPUMiner.cs index c603a84..11736e4 100644 --- a/NiceHashMiner/Miners/XmrStackCPUMiner.cs +++ b/NiceHashMiner/Miners/XmrStackCPUMiner.cs @@ -202,13 +202,15 @@ private string GetConfigFileName() { private void prepareConfigFile(string pool, string wallet) { if (this.MiningSetup.MiningPairs.Count > 0) { try { + bool IsHyperThreadingEnabled = this.MiningSetup.MiningPairs[0].CurrentExtraLaunchParameters.Contains("enable_ht=true"); int numTr = ExtraLaunchParametersParser.GetThreadsNumber(this.MiningSetup.MiningPairs[0]); - //if (ComputeDeviceManager.Avaliable.IsHyperThreadingEnabled) { - // numTr /= 2; - //} + if (IsHyperThreadingEnabled) { + numTr /= 2; + } var config = new XmrStackCPUMinerConfig(numTr, pool, wallet, this.APIPort); + //config.Inti_cpu_threads_conf(false, false, true, ComputeDeviceManager.Avaliable.IsHyperThreadingEnabled); - config.Inti_cpu_threads_conf(false, false, false, false); + config.Inti_cpu_threads_conf(false, false, false, IsHyperThreadingEnabled); var confJson = JObject.FromObject(config); string writeStr = confJson.ToString(); int start = writeStr.IndexOf("{"); From c02e13c7ac3c9d77d1f9f994ab1e3ff58c7c7618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Tue, 11 Apr 2017 15:57:20 +0200 Subject: [PATCH 361/366] version bump, remove pre-release label --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index a00861f..be8e6d5 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = "-Pre-Release_03"; + const string _betaAlphaPostfixString = ""; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 8ae3b9b..48b8e03 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.8")] -[assembly: AssemblyFileVersion("1.7.5.8")] +[assembly: AssemblyVersion("1.7.5.9")] +[assembly: AssemblyFileVersion("1.7.5.9")] From 52663df309439f8befc1f70fb10e551c9781a198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Mon, 24 Apr 2017 21:45:03 +0200 Subject: [PATCH 362/366] ver bump, decred miners update --- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 48b8e03..5c2fc0a 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.9")] -[assembly: AssemblyFileVersion("1.7.5.9")] +[assembly: AssemblyVersion("1.7.5.10")] +[assembly: AssemblyFileVersion("1.7.5.10")] From fadbb6b6f3459c1c7c6927a9413966821f14a333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 11 May 2017 11:16:16 +0200 Subject: [PATCH 363/366] change exchange rate API --- NiceHashMiner/Bitcoin.cs | 69 -------------- NiceHashMiner/CurrencyConverter.cs | 86 ------------------ NiceHashMiner/ExchangeRateAPI.cs | 91 +++++++++++++++++++ NiceHashMiner/Forms/Form_Main.cs | 27 +++--- NiceHashMiner/Globals.cs | 2 +- NiceHashMiner/Miners/MiningSession.cs | 2 +- .../Miners/Parsing/ExtraLaunchParameters.cs | 1 + NiceHashMiner/NiceHashMiner.csproj | 3 +- NiceHashMiner/Program.cs | 2 +- NiceHashMiner/Utils/Links.cs | 22 ++--- 10 files changed, 121 insertions(+), 184 deletions(-) delete mode 100644 NiceHashMiner/Bitcoin.cs delete mode 100644 NiceHashMiner/CurrencyConverter.cs create mode 100644 NiceHashMiner/ExchangeRateAPI.cs diff --git a/NiceHashMiner/Bitcoin.cs b/NiceHashMiner/Bitcoin.cs deleted file mode 100644 index 4badc58..0000000 --- a/NiceHashMiner/Bitcoin.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Net; -using System.IO; -using Newtonsoft.Json; - -namespace NiceHashMiner -{ - class Bitcoin - { -#pragma warning disable 649 - class CoinbaseResponse - { - public double amount; - public string currency; - } -#pragma warning restore 649 - - public static double GetUSDExchangeRate() - { - string jsondata = null; - - for (int i = 0; i < 2; i++) - { - jsondata = GetCoinbaseAPIData("https://api.coinbase.com/v1/prices/spot_rate"); - if (jsondata != null) break; - } - - if (jsondata == null) return 0; - - try - { - CoinbaseResponse cbr = JsonConvert.DeserializeObject(jsondata, Globals.JsonSettings); - return cbr.amount; - } - catch - { - return 0; - } - } - - private static string GetCoinbaseAPIData(string URL) - { - string ResponseFromServer; - try - { - HttpWebRequest WR = (HttpWebRequest)WebRequest.Create(URL); - WR.Timeout = 10000; - WebResponse Response = WR.GetResponse(); - Stream SS = Response.GetResponseStream(); - SS.ReadTimeout = 10000; - StreamReader Reader = new StreamReader(SS); - ResponseFromServer = Reader.ReadToEnd(); - if (ResponseFromServer.Length == 0 || ResponseFromServer[0] != '{') - throw new Exception("Not JSON!"); - Reader.Close(); - Response.Close(); - } - catch (Exception ex) - { - Helpers.ConsolePrint("COINBASE", ex.Message); - return null; - } - - return ResponseFromServer; - } - } -} diff --git a/NiceHashMiner/CurrencyConverter.cs b/NiceHashMiner/CurrencyConverter.cs deleted file mode 100644 index 8c2edc7..0000000 --- a/NiceHashMiner/CurrencyConverter.cs +++ /dev/null @@ -1,86 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Net; -using NiceHashMiner.Configs; - -namespace NiceHashMiner -{ - public static class CurrencyConverter - { - private static DateTime LastUpdate = DateTime.Now; - //private static CurrencyAPIResponse LastResponse; - private static CurrencyAPIResponse CurrencyAPIResponse; - // after first successful request don't fallback to USD - private static bool IsCurrencyConverterInit = false; - public static string ActiveDisplayCurrency = "USD"; - - private static bool ConverterActive { - get { return ConfigManager.GeneralConfig.DisplayCurrency != "USD"; } - } - - - public static double ConvertToActiveCurrency(double amount) - { - if (!ConverterActive) - return amount; - - if (!IsCurrencyConverterInit || DateTime.Now - LastUpdate > TimeSpan.FromMinutes(10)) - { - UpdateAPI(); - } - - // if we are still null after an update something went wrong. just use USD hopefully itll update next tick - if (CurrencyAPIResponse == null || ActiveDisplayCurrency == "USD") - { - Helpers.ConsolePrint("CurrencyConverter", "Unable to retrieve update, Falling back to USD"); - return amount; - } - - //Helpers.ConsolePrint("CurrencyConverter", "Current Currency: " + ConfigManager.Instance.GeneralConfig.DisplayCurrency); - double usdExchangeRate = 1.0; - if (CurrencyAPIResponse.rates.TryGetValue(ActiveDisplayCurrency, out usdExchangeRate)) - return amount * usdExchangeRate; - else - { - Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + ActiveDisplayCurrency + " falling back to USD rates"); - ActiveDisplayCurrency = "USD"; - return amount; - } - } - - private static void UpdateAPI() - { - try { - var Client = new WebClient(); - var Response = Client.DownloadString("http://api.fixer.io/latest?base=USD"); - var LastResponse = JsonConvert.DeserializeObject(Response, Globals.JsonSettings); - LastUpdate = DateTime.Now; - // set that we have a response - if (LastResponse != null) { - IsCurrencyConverterInit = true; - CurrencyAPIResponse = LastResponse; - ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; - } - } - catch (Exception E) - { - if (!IsCurrencyConverterInit) { - Helpers.ConsolePrint("CurrencyConverter", E.Message); - Helpers.ConsolePrint("CurrencyConverter", "Unable to update API: reverting to usd"); - ActiveDisplayCurrency = "USD"; - } - } - } - } - - - - - public class CurrencyAPIResponse - { - public string @base { get; set; } - public string date { get; set; } - public Dictionary rates { get; set; } - } -} diff --git a/NiceHashMiner/ExchangeRateAPI.cs b/NiceHashMiner/ExchangeRateAPI.cs new file mode 100644 index 0000000..bac05c6 --- /dev/null +++ b/NiceHashMiner/ExchangeRateAPI.cs @@ -0,0 +1,91 @@ +using Newtonsoft.Json; +using NiceHashMiner.Configs; +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; + +namespace NiceHashMiner { + class ExchangeRateAPI { + public class Result { + public Object algorithms { get; set; } + public Object servers { get; set; } + public Object idealratios { get; set; } + public List> exchanges { get; set; } + public Dictionary exchanges_fiat { get; set; } + } + + public class ExchangeRateJSON { + public Result result { get; set; } + public string method { get; set; } + } + + const string apiUrl = "http://api.nicehash.com/api?method=nicehash.service.info"; + + private static Dictionary exchanges_fiat = null; + private static double USD_BTC_rate = -1; + public static string ActiveDisplayCurrency = "USD"; + + private static bool ConverterActive { + get { return ConfigManager.GeneralConfig.DisplayCurrency != "USD"; } + } + + + public static double ConvertToActiveCurrency(double amount) { + if (!ConverterActive) { + return amount; + } + + // if we are still null after an update something went wrong. just use USD hopefully itll update next tick + if (exchanges_fiat == null || ActiveDisplayCurrency == "USD") { + Helpers.ConsolePrint("CurrencyConverter", "Unable to retrieve update, Falling back to USD"); + return amount; + } + + //Helpers.ConsolePrint("CurrencyConverter", "Current Currency: " + ConfigManager.Instance.GeneralConfig.DisplayCurrency); + double usdExchangeRate = 1.0; + if (exchanges_fiat.TryGetValue(ActiveDisplayCurrency, out usdExchangeRate)) + return amount * usdExchangeRate; + else { + Helpers.ConsolePrint("CurrencyConverter", "Unknown Currency Tag: " + ActiveDisplayCurrency + " falling back to USD rates"); + ActiveDisplayCurrency = "USD"; + return amount; + } + } + + public static double GetUSDExchangeRate() { + if (USD_BTC_rate > 0) { + return USD_BTC_rate; + } + return 0.0; + } + + public static void UpdateAPI(string worker) { + string resp = NiceHashStats.GetNiceHashAPIData(apiUrl, worker); + if (resp != null) { + try { + var LastResponse = JsonConvert.DeserializeObject(resp, Globals.JsonSettings); + // set that we have a response + if (LastResponse != null) { + Result last_result = LastResponse.result; + ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; + exchanges_fiat = last_result.exchanges_fiat; + // ActiveDisplayCurrency = "USD"; + // check if currency avaliable and fill currency list + foreach (var pair in last_result.exchanges) { + if (pair.ContainsKey("USD") && pair.ContainsKey("coin") && pair["coin"] == "BTC" && pair["USD"] != null) { + USD_BTC_rate = Helpers.ParseDouble(pair["USD"]); + break; + } + } + } + } catch(Exception e) { + Helpers.ConsolePrint("ExchangeRateAPI", "UpdateAPI got Exception: " + e.Message); + } + } else { + Helpers.ConsolePrint("ExchangeRateAPI", "UpdateAPI got NULL"); + } + } + + } +} diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index be8e6d5..ea8dc38 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -117,7 +117,7 @@ private void InitLocalization() { toolStripStatusLabelGlobalRateText.Text = International.GetText("Form_Main_global_rate") + ":"; toolStripStatusLabelBTCDayText.Text = "BTC/" + International.GetText("Day"); - toolStripStatusLabelBalanceText.Text = (CurrencyConverter.ActiveDisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; + toolStripStatusLabelBalanceText.Text = (ExchangeRateAPI.ActiveDisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; devicesListViewEnableControl1.InitLocale(); @@ -142,10 +142,10 @@ private void InitMainConfigGUIData() { DemoMode = false; // init active display currency after config load - CurrencyConverter.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; + ExchangeRateAPI.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; - toolStripStatusLabelBalanceDollarValue.Text = "(" + CurrencyConverter.ActiveDisplayCurrency + ")"; - toolStripStatusLabelBalanceText.Text = (CurrencyConverter.ActiveDisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; + toolStripStatusLabelBalanceDollarValue.Text = "(" + ExchangeRateAPI.ActiveDisplayCurrency + ")"; + toolStripStatusLabelBalanceText.Text = (ExchangeRateAPI.ActiveDisplayCurrency + "/") + International.GetText("Day") + " " + International.GetText("Form_Main_balance") + ":"; BalanceCheck_Tick(null, null); // update currency changes if (_isDeviceDetectionInitialized) { @@ -493,8 +493,8 @@ public void AddRateInfo(string groupName, string deviceStringInfo, APIData iAPID } string rateBTCString = FormatPayingOutput(paying); - string rateCurrencyString = CurrencyConverter.ConvertToActiveCurrency(paying * Globals.BitcoinRate).ToString("F2", CultureInfo.InvariantCulture) - + String.Format(" {0}/", CurrencyConverter.ActiveDisplayCurrency) + International.GetText("Day"); + string rateCurrencyString = ExchangeRateAPI.ConvertToActiveCurrency(paying * Globals.BitcoinUSDRate).ToString("F2", CultureInfo.InvariantCulture) + + String.Format(" {0}/", ExchangeRateAPI.ActiveDisplayCurrency) + International.GetText("Day"); ((GroupProfitControl)flowLayoutPanelRates.Controls[flowLayoutPanelRatesIndex++]) .UpdateProfitStats(groupName, deviceStringInfo, speedString, rateBTCString, rateCurrencyString); @@ -527,7 +527,7 @@ private void UpdateGlobalRate() toolStripStatusLabelGlobalRateValue.Text = (TotalRate).ToString("F6", CultureInfo.InvariantCulture); } - toolStripStatusLabelBTCDayValue.Text = CurrencyConverter.ConvertToActiveCurrency((TotalRate * Globals.BitcoinRate)).ToString("F2", CultureInfo.InvariantCulture); + toolStripStatusLabelBTCDayValue.Text = ExchangeRateAPI.ConvertToActiveCurrency((TotalRate * Globals.BitcoinUSDRate)).ToString("F2", CultureInfo.InvariantCulture); } @@ -551,8 +551,8 @@ void BalanceCheck_Tick(object sender, EventArgs e) } //Helpers.ConsolePrint("CurrencyConverter", "Using CurrencyConverter" + ConfigManager.Instance.GeneralConfig.DisplayCurrency); - double Amount = (Balance * Globals.BitcoinRate); - Amount = CurrencyConverter.ConvertToActiveCurrency(Amount); + double Amount = (Balance * Globals.BitcoinUSDRate); + Amount = ExchangeRateAPI.ConvertToActiveCurrency(Amount); toolStripStatusLabelBalanceDollarText.Text = Amount.ToString("F2", CultureInfo.InvariantCulture); } } @@ -561,10 +561,11 @@ void BalanceCheck_Tick(object sender, EventArgs e) void BitcoinExchangeCheck_Tick(object sender, EventArgs e) { - Helpers.ConsolePrint("COINBASE", "Bitcoin rate get"); - double BR = Bitcoin.GetUSDExchangeRate(); - if (BR > 0) Globals.BitcoinRate = BR; - Helpers.ConsolePrint("COINBASE", "Current Bitcoin rate: " + Globals.BitcoinRate.ToString("F2", CultureInfo.InvariantCulture)); + Helpers.ConsolePrint("NICEHASH", "Bitcoin rate get"); + ExchangeRateAPI.UpdateAPI(textBoxWorkerName.Text.Trim()); + double BR = ExchangeRateAPI.GetUSDExchangeRate(); + if (BR > 0) Globals.BitcoinUSDRate = BR; + Helpers.ConsolePrint("NICEHASH", "Current Bitcoin rate: " + Globals.BitcoinUSDRate.ToString("F2", CultureInfo.InvariantCulture)); } diff --git a/NiceHashMiner/Globals.cs b/NiceHashMiner/Globals.cs index 108f848..dd6181f 100644 --- a/NiceHashMiner/Globals.cs +++ b/NiceHashMiner/Globals.cs @@ -13,7 +13,7 @@ public class Globals { // Variables public static Dictionary NiceHashData = null; - public static double BitcoinRate; + public static double BitcoinUSDRate; public static JsonSerializerSettings JsonSettings = null; public static int ThreadsPerCPU; // quickfix guard for checking internet conection diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index 6376b0c..c9ec6b0 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -198,7 +198,7 @@ public double GetTotalRate() { // full of state private bool CheckIfProfitable(double CurrentProfit, bool log = true) { // TODO FOR NOW USD ONLY - var currentProfitUSD = (CurrentProfit * Globals.BitcoinRate); + var currentProfitUSD = (CurrentProfit * Globals.BitcoinUSDRate); IsProfitable = IsMiningRegardlesOfProfit || !IsMiningRegardlesOfProfit && currentProfitUSD >= ConfigManager.GeneralConfig.MinimumProfit; diff --git a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs index ad8e8e1..b73b11f 100644 --- a/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs +++ b/NiceHashMiner/Miners/Parsing/ExtraLaunchParameters.cs @@ -175,6 +175,7 @@ public static class ExtraLaunchParameters { // parameters differ according to algorithm new MinerOption("parameter1", "-c1", "-c1", "0", MinerOptionFlagType.MultiParam, " "), new MinerOption("parameter2", "-c2", "-c2", "0", MinerOptionFlagType.MultiParam, " "), + new MinerOption("debug_param", "-f", "-f", "", MinerOptionFlagType.SingleParam, " "), // Overclocking not supported from NHM //new MinerOption("Overclocking_os", "-os", "-os", "", MinerOptionFlagType.MultiParam, " "), //new MinerOption("Overclocking_od", "-od", "-od", "2", MinerOptionFlagType.MultiParam, " "), diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index 547ddf8..cf78307 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -80,6 +80,7 @@ + @@ -93,7 +94,6 @@ - @@ -231,7 +231,6 @@ - Form diff --git a/NiceHashMiner/Program.cs b/NiceHashMiner/Program.cs index 18ed618..b8de95d 100644 --- a/NiceHashMiner/Program.cs +++ b/NiceHashMiner/Program.cs @@ -58,7 +58,7 @@ static void Main(string[] argv) } // init active display currency after config load - CurrencyConverter.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; + ExchangeRateAPI.ActiveDisplayCurrency = ConfigManager.GeneralConfig.DisplayCurrency; // #2 then parse args var commandLineArgs = new CommandLineParser(argv); diff --git a/NiceHashMiner/Utils/Links.cs b/NiceHashMiner/Utils/Links.cs index 9e07a51..6957398 100644 --- a/NiceHashMiner/Utils/Links.cs +++ b/NiceHashMiner/Utils/Links.cs @@ -4,24 +4,24 @@ namespace NiceHashMiner { public static class Links { - public static string VisitURL = "https://www.nicehash.com?utm_source=NHM"; + public static string VisitURL = "http://www.nicehash.com?utm_source=NHM"; // add version - public static string VisitURLNew = "https://github.com/nicehash/NiceHashMiner/releases/tag/"; + public static string VisitURLNew = "http://github.com/nicehash/NiceHashMiner/releases/tag/"; // add btc adress as parameter - public static string CheckStats = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=miners&addr="; + public static string CheckStats = "http://www.nicehash.com/index.jsp?utm_source=NHM&p=miners&addr="; // help and faq - public static string NHM_Help = "https://github.com/nicehash/NiceHashMiner"; + public static string NHM_Help = "http://github.com/nicehash/NiceHashMiner"; // faq - public static string NHM_BTC_Wallet_Faq = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs15"; - public static string NHM_Paying_Faq = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs6"; + public static string NHM_BTC_Wallet_Faq = "http://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs15"; + public static string NHM_Paying_Faq = "http://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs6"; // API // btc adress as parameter - public static string NHM_API_stats = "https://www.nicehash.com/api?method=stats.provider&addr="; - public static string NHM_API_info = "https://www.nicehash.com/api?method=simplemultialgo.info"; - public static string NHM_API_version = "https://www.nicehash.com/nicehashminer?method=version"; - //public static string NHM_API_stats_provider_workers = "https://www.nicehash.com/api?method=stats.provider.workers&addr="; + public static string NHM_API_stats = "http://www.nicehash.com/api?method=stats.provider&addr="; + public static string NHM_API_info = "http://www.nicehash.com/api?method=simplemultialgo.info"; + public static string NHM_API_version = "http://www.nicehash.com/nicehashminer?method=version"; + //public static string NHM_API_stats_provider_workers = "http://www.nicehash.com/api?method=stats.provider.workers&addr="; // device profits - public static string NHM_Profit_Check = "https://www.nicehash.com/?utm_source=NHM&p=calc&name="; + public static string NHM_Profit_Check = "http://www.nicehash.com/?utm_source=NHM&p=calc&name="; } } From 6ee043491388dc3f32e824a69b0640058cc363c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 11 May 2017 14:51:31 +0200 Subject: [PATCH 364/366] profit calc fix (restore old state when no switch), sma-get fix --- NiceHashMiner/Forms/Form_Main.cs | 12 +++-- NiceHashMiner/Miners/Grouping/MiningDevice.cs | 6 +++ NiceHashMiner/Miners/MinersManager.cs | 5 +++ NiceHashMiner/Miners/MiningSession.cs | 45 +++++++++++-------- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index ea8dc38..3b7746b 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -573,12 +573,11 @@ void SMACheck_Tick(object sender, EventArgs e) { string worker = textBoxBTCAddress.Text.Trim() + "." + textBoxWorkerName.Text.Trim(); Helpers.ConsolePrint("NICEHASH", "SMA get"); - Dictionary t = NiceHashStats.GetAlgorithmRates(worker); + Dictionary t = null; - for (int i = 0; i < 3; i++) - { - if (t != null) - { + for (int i = 0; i < 5; i++) { + t = NiceHashStats.GetAlgorithmRates(worker); + if (t != null) { Globals.NiceHashData = t; break; } @@ -588,8 +587,7 @@ void SMACheck_Tick(object sender, EventArgs e) t = NiceHashStats.GetAlgorithmRates(worker); } - if (t == null && Globals.NiceHashData == null && ShowWarningNiceHashData) - { + if (t == null && Globals.NiceHashData == null && ShowWarningNiceHashData) { ShowWarningNiceHashData = false; DialogResult dialogResult = MessageBox.Show(International.GetText("Form_Main_msgbox_NoInternetMsg"), International.GetText("Form_Main_msgbox_NoInternetTitle"), diff --git a/NiceHashMiner/Miners/Grouping/MiningDevice.cs b/NiceHashMiner/Miners/Grouping/MiningDevice.cs index 7ee4042..c5ec15a 100644 --- a/NiceHashMiner/Miners/Grouping/MiningDevice.cs +++ b/NiceHashMiner/Miners/Grouping/MiningDevice.cs @@ -109,6 +109,12 @@ public bool HasProfitableAlgo() { return GetMostProfitableIndex() > -1; } + public void RestoreOldProfitsState() { + // restore last state + MostProfitableAlgorithmType = PrevProfitableAlgorithmType; + MostProfitableMinerBaseType = PrevProfitableMinerBaseType; + } + public void CalculateProfits(Dictionary NiceHashData) { // save last state PrevProfitableAlgorithmType = MostProfitableAlgorithmType; diff --git a/NiceHashMiner/Miners/MinersManager.cs b/NiceHashMiner/Miners/MinersManager.cs index 9b5a862..d294813 100644 --- a/NiceHashMiner/Miners/MinersManager.cs +++ b/NiceHashMiner/Miners/MinersManager.cs @@ -17,6 +17,7 @@ public static class MinersManager { public static void StopAllMiners() { if (CurMiningSession != null) CurMiningSession.StopAllMiners(); + CurMiningSession = null; } public static void StopAllMinersNonProfitable() { @@ -45,6 +46,10 @@ public static bool StartInitialize(IMainFormRatesComunication mainFormRatesComun return CurMiningSession.IsMiningEnabled; } + public static bool IsMiningEnabled() { + if (CurMiningSession != null) return CurMiningSession.IsMiningEnabled; + return false; + } /// diff --git a/NiceHashMiner/Miners/MiningSession.cs b/NiceHashMiner/Miners/MiningSession.cs index c9ec6b0..f09043a 100644 --- a/NiceHashMiner/Miners/MiningSession.cs +++ b/NiceHashMiner/Miners/MiningSession.cs @@ -251,25 +251,6 @@ public void SwichMostProfitableGroupUpMethod(Dictionary 0 && CurrentProfit > 0) { - double a = Math.Max(PrevStateProfit, CurrentProfit); - double b = Math.Min(PrevStateProfit, CurrentProfit); - //double percDiff = Math.Abs((PrevStateProfit / CurrentProfit) - 1); - double percDiff = ((a - b)) / b; - if (percDiff < ConfigManager.GeneralConfig.SwitchProfitabilityThreshold) { - // don't switch - Helpers.ConsolePrint(TAG, String.Format("Will not switch profit diff is {0}, current threshold {1}", percDiff, ConfigManager.GeneralConfig.SwitchProfitabilityThreshold)); - return; - } - } - // print profit statuses if (log) { StringBuilder stringBuilderFull = new StringBuilder(); @@ -294,6 +275,32 @@ public void SwichMostProfitableGroupUpMethod(Dictionary 0 && CurrentProfit > 0) { + double a = Math.Max(PrevStateProfit, CurrentProfit); + double b = Math.Min(PrevStateProfit, CurrentProfit); + //double percDiff = Math.Abs((PrevStateProfit / CurrentProfit) - 1); + double percDiff = ((a - b)) / b; + if (percDiff < ConfigManager.GeneralConfig.SwitchProfitabilityThreshold) { + // don't switch + Helpers.ConsolePrint(TAG, String.Format("Will NOT switch profit diff is {0}, current threshold {1}", percDiff, ConfigManager.GeneralConfig.SwitchProfitabilityThreshold)); + // RESTORE OLD PROFITS STATE + foreach (var device in _miningDevices) { + device.RestoreOldProfitsState(); + } + return; + } else { + Helpers.ConsolePrint(TAG, String.Format("Will SWITCH profit diff is {0}, current threshold {1}", percDiff, ConfigManager.GeneralConfig.SwitchProfitabilityThreshold)); + } + } + + // check if should mine + // Only check if profitable inside this method when getting SMA data, cheching during mining is not reliable + if (CheckIfShouldMine(CurrentProfit, log) == false) { + return; + } + // group new miners Dictionary> newGroupedMiningPairs = new Dictionary>(); // group devices with same supported algorithms From 4934c5a9256e60b4ef9b541eac7440e1afbee0a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Thu, 11 May 2017 14:55:46 +0200 Subject: [PATCH 365/366] pre release --- NiceHashMiner/Forms/Form_Main.cs | 2 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NiceHashMiner/Forms/Form_Main.cs b/NiceHashMiner/Forms/Form_Main.cs index 3b7746b..bf82d5e 100644 --- a/NiceHashMiner/Forms/Form_Main.cs +++ b/NiceHashMiner/Forms/Form_Main.cs @@ -51,7 +51,7 @@ public partial class Form_Main : Form, Form_Loading.IAfterInitializationCaller, int flowLayoutPanelVisibleCount = 0; int flowLayoutPanelRatesIndex = 0; - const string _betaAlphaPostfixString = ""; + const string _betaAlphaPostfixString = " Pre Release_01"; private bool _isDeviceDetectionInitialized = false; diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 5c2fc0a..f182e35 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.5.10")] -[assembly: AssemblyFileVersion("1.7.5.10")] +[assembly: AssemblyVersion("1.7.5.11")] +[assembly: AssemblyFileVersion("1.7.5.11")] From 563d2384d9384b9e315a348128063e958467c1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanko=20Krsti=C4=87?= Date: Fri, 12 May 2017 13:53:58 +0200 Subject: [PATCH 366/366] use https --- NiceHashMiner/ExchangeRateAPI.cs | 2 +- NiceHashMiner/Utils/Links.cs | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/NiceHashMiner/ExchangeRateAPI.cs b/NiceHashMiner/ExchangeRateAPI.cs index bac05c6..46b3406 100644 --- a/NiceHashMiner/ExchangeRateAPI.cs +++ b/NiceHashMiner/ExchangeRateAPI.cs @@ -20,7 +20,7 @@ public class ExchangeRateJSON { public string method { get; set; } } - const string apiUrl = "http://api.nicehash.com/api?method=nicehash.service.info"; + const string apiUrl = "https://api.nicehash.com/api?method=nicehash.service.info"; private static Dictionary exchanges_fiat = null; private static double USD_BTC_rate = -1; diff --git a/NiceHashMiner/Utils/Links.cs b/NiceHashMiner/Utils/Links.cs index 6957398..9e07a51 100644 --- a/NiceHashMiner/Utils/Links.cs +++ b/NiceHashMiner/Utils/Links.cs @@ -4,24 +4,24 @@ namespace NiceHashMiner { public static class Links { - public static string VisitURL = "http://www.nicehash.com?utm_source=NHM"; + public static string VisitURL = "https://www.nicehash.com?utm_source=NHM"; // add version - public static string VisitURLNew = "http://github.com/nicehash/NiceHashMiner/releases/tag/"; + public static string VisitURLNew = "https://github.com/nicehash/NiceHashMiner/releases/tag/"; // add btc adress as parameter - public static string CheckStats = "http://www.nicehash.com/index.jsp?utm_source=NHM&p=miners&addr="; + public static string CheckStats = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=miners&addr="; // help and faq - public static string NHM_Help = "http://github.com/nicehash/NiceHashMiner"; + public static string NHM_Help = "https://github.com/nicehash/NiceHashMiner"; // faq - public static string NHM_BTC_Wallet_Faq = "http://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs15"; - public static string NHM_Paying_Faq = "http://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs6"; + public static string NHM_BTC_Wallet_Faq = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs15"; + public static string NHM_Paying_Faq = "https://www.nicehash.com/index.jsp?utm_source=NHM&p=faq#faqs6"; // API // btc adress as parameter - public static string NHM_API_stats = "http://www.nicehash.com/api?method=stats.provider&addr="; - public static string NHM_API_info = "http://www.nicehash.com/api?method=simplemultialgo.info"; - public static string NHM_API_version = "http://www.nicehash.com/nicehashminer?method=version"; - //public static string NHM_API_stats_provider_workers = "http://www.nicehash.com/api?method=stats.provider.workers&addr="; + public static string NHM_API_stats = "https://www.nicehash.com/api?method=stats.provider&addr="; + public static string NHM_API_info = "https://www.nicehash.com/api?method=simplemultialgo.info"; + public static string NHM_API_version = "https://www.nicehash.com/nicehashminer?method=version"; + //public static string NHM_API_stats_provider_workers = "https://www.nicehash.com/api?method=stats.provider.workers&addr="; // device profits - public static string NHM_Profit_Check = "http://www.nicehash.com/?utm_source=NHM&p=calc&name="; + public static string NHM_Profit_Check = "https://www.nicehash.com/?utm_source=NHM&p=calc&name="; } }

Y`-vR%JS4=Jtt2?U3z|_J@hAIpL2L0-d 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